您好,登錄后才能下訂單哦!
linux中BASH如何使用,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Bash shell 的功能
命令編修能力 (history):
只要在命令行按“上下鍵”就可以找到前/后一個輸入的指令,這么多的指令記錄在哪里呢?在你的主文件夾內的 .bash_history 啦。
命令與文件補全功能: ([tab] 按鍵的好處)
命令別名設置功能: (alias)
alias lm='ls -al'
程序化腳本: (shell scripts)
查詢指令是否為 Bash shell 的內置命令: type
范例一:查詢一下 ls 這個指令是否為 bash 內置?
[dmtsai@study ~]$ type ls
變量的取用與設置:echo, 變量設置規則, unset
echo $PATH
設置變量:
[dmtsai@study ~]$ echo ${myname} <==這里并沒有任何數據~因為這個變量尚未被設置!是空的! [dmtsai@study ~]$ myname=VBird [dmtsai@study ~]$ echo ${myname} VBird <==出現了!因為這個變量已經被設置了
變量與變量內容以一個等號“=”來鏈接,如下所示: “myname=VBird”
等號兩邊不能直接接空白字符,如下所示為錯誤: “myname = VBird”或“myname=VBird Tsai”
變量名稱只能是英文字母與數字,但是開頭字符不能是數字,如下為錯誤: “2myname=VBird”
若該變量為擴增變量內容時,則可用 "$變量名稱">
若該變量需要在其他子程序執行,則需要以 export 來使變量變成環境變量: “export PATH”
取消變量的方法為使用 unset :“unset 變量名稱”例如取消 myname 的設置: “unset myname”
:如何進入到您目前核心的模塊目錄?
[dmtsai@study ~]$ cd /lib/modules/$(uname -r)/kernel # 以此例較佳!
其實上面的指令可以說是作了兩次動作,亦即是:
先進行反單引號內的動作“uname -r”并得到核心版本為 3.10.0-229.el7.x86_64
將上述的結果帶入原指令,故得指令為:“cd /lib/modules/3.10.0-229.el7.x86_64/kernel/”
用 env 觀察環境變量與常見環境變量說明
用 set 觀察所有變量 (含環境變量與自訂變量)
影響顯示結果的語系變量 (locale)
read
范例一:讓使用者由鍵盤輸入一內容,將該內容變成名為 atest 的變量 [dmtsai@study ~]$ read atest This is a test <==此時光標會等待你輸入!請輸入左側文字看看 [dmtsai@study ~]$ echo ${atest} This is a test <==你剛剛輸入的數據已經變成一個變量內容!
declare / typeset
范例一:讓變量 sum 進行 100+300+50 的加總結果
declare 或 typeset 是一樣的功能,就是在“宣告變量的類型”。如果使用 declare 后面并沒有接任何參數,那么 bash 就會主動的將所有的變量名稱與內容通通叫出來,就好像使用 set 一樣啦!
[dmtsai@study ~]$ sum=100+300+50 [dmtsai@study ~]$ echo ${sum} 100+300+50 <==咦!怎么沒有幫我計算加總?因為這是文字體態的變量屬性啊! [dmtsai@study ~]$ declare -i sum=100+300+50 [dmtsai@study ~]$ echo ${sum} 450
陣列 (array) 變量類型
范例:設置上面提到的 var[1] ~ var[3] 的變量。
[dmtsai@study ~]$ var[1]="small min" [dmtsai@study ~]$ var[2]="big min" [dmtsai@study ~]$ var[3]="nice min" [dmtsai@study ~]$ echo "${var[1]}, ${var[2]}, ${var[3]}" small min, big min, nice min
與文件系統及程序的限制關系: ulimit
范例一:先讓小寫的 path 自訂變量設置的與 PATH 內容相同
[dmtsai@study ~]$ path=${PATH} [dmtsai@study ~]$ echo ${path} /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
范例二:假設我不喜歡 local/bin,所以要將前 1 個目錄刪除掉,如何顯示?
[dmtsai@study ~]$ echo ${path#/*local/bin:} /usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
范例六:將 path 的變量內容內的 sbin 取代成大寫 SBIN:
[dmtsai@study ~]$ echo ${path/sbin/SBIN} /usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
#這個部分就容易理解的多了!關鍵字在于那兩個斜線,兩斜線中間的是舊字串 #后面的是新字串,所以結果就會出現如上述的特殊字體部分啰!
[dmtsai@study ~]$ echo ${path//sbin/SBIN} /usr/local/bin:/usr/bin:/usr/local/SBIN:/usr/SBIN:/home/dmtsai/.local/bin:/home/dmtsai/bin
#如果是兩條斜線,那么就變成所有符合的內容都會被取代喔!
我們將這部份作個總結說明一下:
變量設置方式 | 說明 |
---|---|
${變量#關鍵 字} | |
${變量##關鍵字} | 若變量內容從頭開始的數據符合“關鍵字”,則將符合的最短數據刪除若變量內容從頭開始的數據符合“關鍵字”,則將符合的最長數據刪除 |
${變量%關鍵 字} | |
${變量%%關鍵字} | 若變量內容從尾向前的數據符合“關鍵字”,則將符合的最短數據刪除 若變量內容從尾向前的數據符合“關鍵字”,則將符合的最長數據刪除 |
${變量/舊字串/新字串} | |
${變量//舊字串/新字串} | 若變量內容符合“舊字串”則“第一個舊字串會被新字串取代” 若變量內容符合“舊字串”則“全部的舊字串會被新字串取代” |
bash 的環境配置文件
source :讀入環境配置文件的指令
萬用字符與特殊符號
符號 | 意義 |
---|---|
* | 代表“ 0 個到無窮多個”任意字符 |
? | 代表“一定有一個”任意字符 |
[ ] | 同樣代表“一定有一個在括號內”的字符(非任意字符)。例如 [abcd] 代表“一定有一個字符, 可能是 a, b, c, d 這四個任何一個 |
[ -] | 若有減號在中括號內時,代表“在編碼順序內的所有字符”。例如 [0-9] 代表 0 到 9 之間的所有數字,因為數字的語系編碼是連續的! |
[^] | 若中括號內的第一個字符為指數符號 (^) ,那表示“反向選擇”,例如 [^abc] 代表一定有一個字符,只要是非 a, b, c 的其他字符就接受的意思。 |
除了萬用字符之外,bash 環境中的特殊符號有哪些呢?下面我們先匯整一下:
標準輸入 (stdin) :代碼為 0 ,使用 < 或 << ;
標準輸出 (stdout):代碼為 1 ,使用 > 或 >> ;
標準錯誤輸出(stderr):代碼為 2 ,使用 2> 或 2>> ; 為了理解 stdout 與 stderr ,我們先來進行一個范例的練習: 范例一:觀察你的系統根目錄 (/) 下各目錄的文件名、權限與屬性,并記錄下來
[dmtsai@study ~]$ ll / ==此時屏幕會顯示出文件名信息 [dmtsai@study ~]$ ll / > ~/rootfile ==屏幕并無任何信息 [dmtsai@study ~]$ ll ~/rootfile ==有個新文件被創建了! -rw-rw-r--. 1 dmtsai dmtsai 1078 Jul 9 18:51 /home/dmtsai/rootfile
1> :以覆蓋的方法將“正確的數據”輸出到指定的文件或設備上; 1>>:以累加的方法將“正確的數據”輸出到指定的文件或設備上; 2> :以覆蓋的方法將“錯誤的數據”輸出到指定的文件或設備上; 2>>:以累加的方法將“錯誤的數據”輸出到指定的文件或設備上;
范例五:將指令的數據全部寫入名為 list 的文件中
[dmtsai@study ~]$ find /home -name .bashrc > list 2> list ==錯誤 [dmtsai@study ~]$ find /home -name .bashrc > list 2>&1 ==正確 [dmtsai@study ~]$ find /home -name .bashrc &> list ==正確
standard input : < 與 << 了解了 stderr 與 stdout 后,那么那個 < 又是什么呀?呵呵!以最簡單的說法來說, 那就 是“將原本需要由鍵盤輸入的數據,改由文件內容來取代”的意思。 我們先由下面的 cat 指令操 作來了解一下什么叫做“鍵盤輸入”吧!
范例六:利用 cat 指令來創建一個文件的簡單流程
[dmtsai@study ~]$ cat < catfile testing cat file test < ==這里按下 [ctrl]+d 來離開 [dmtsai@study ~]$ cat catfile testing cat file test
命令執行的判斷依據: ; , &&, ||
cmd ; cmd (不考慮指令相關性的連續指令下達)
在某些時候,我們希望可以一次執行多個指令,例如在關機的時候我希望可以先執行兩次sync 同步化寫入磁盤后才 shutdown 計算機,那么可以怎么作呢?這樣做呀:
[root@study ~]# sync; sync; shutdown -h now
在某些時候,我們希望可以一次執行多個指令,例如在關機的時候我希望可以先執行兩次 sync 同步化寫入磁盤后才 shutdown 計算機,那么可以怎么作呢?這樣做呀: [root@study ~]# sync; sync; shutdown -h now
$? (指令回傳值) 與 && 或 ||
cmd1&&cmd2
若 cmd1 執行完畢且正確執行($?=0),則開始執行 cmd2。 2. 若 cmd1 執行完畢且為錯誤 ($?≠0),則 cmd2 不執行。
cmd1 ||cmd2
若 cmd1 執行完畢且正確執行($?=0),則 cmd2 不執行。 2. 若 cmd1 執 行完畢且為錯誤 ($?≠0),則開始執行 cmd2。
范例一:使用 ls 查閱目錄 /tmp/abc 是否存在,若存在則用 touch 創建 /tmp/abc/hehe
[dmtsai@study ~]$ ls /tmp/abc && touch /tmp/abc/hehe ls: cannot access /tmp/abc: No such file or directory
#ls 很干脆的說明找不到該目錄,但并沒有 touch 的錯誤,表示 touch 并沒有執行
擷取命令: cut, grep
范例一:將 PATH 變量取出,我要找出第五個路徑。
[dmtsai@study ~]$ echo ${PATH} /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin [dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 5 #如同上面的數字顯示,我們是以“ : ”作為分隔,因此會出現 /home/dmtsai/.local/bin #那么如果想要列出第 3 與第 5 呢?,就是這樣: [dmtsai@study ~]$ echo ${PATH} | cut -d ':' -f 3,5
范例一:將 last 當中,有出現 root 的那一行就取出來; [dmtsai@study ~]$ last|grep 'root' 范例二:與范例一相反,只要沒有 root 的就取出! [dmtsai@study ~]$ last | grep -v 'root'
排序命令: sort, wc, uniq
范例一:個人帳號都記錄在 /etc/passwd 下,請將帳號進行排序。 [dmtsai@study ~]$ cat /etc/passwd | sort 范例一:使用 last 將帳號列出,僅取出帳號欄,進行排序后僅取出一位; [dmtsai@study ~]$ last | cut -d ' ' -f1 | sort| uniq 范例一:那個 /etc/man_db.conf 里面到底有多少相關字、行、字符數? [dmtsai@study ~]$ cat /etc/man_db.conf | wc 131 723 5171 #輸出的三個數字中,分別代表: “行、字數、字符數”
雙向重導向: tee
[dmtsai@study ~]$ last | tee last.list | cut -d " " -f1
#這個范例可以讓我們將 last 的輸出存一份到 last.list 文件中;
字符轉換命令: tr, col, join, paste, expand
tr 可以用來刪除一段訊息當中的文字,或者是進行文字訊息的替換!
范例一:將 last 輸出的訊息中,所有的小寫變成大寫字符:
[dmtsai@study ~]$ last | tr '[a-z]' '[A-Z]'
#事實上,沒有加上單引號也是可以執行的,如:“ last | tr [a-z] [A-Z] ”
join 看字面上的意義 (加入/參加) 就可以知道,他是在處理兩個文件之間的數據, 而且, 主要是在處理“兩個文件當中,有 "相同數據" 的那一行,才將他加在一起”的意思。
這個 paste 就要比 join 簡單多了!相對于 join 必須要比對兩個文件的數據相關性, paste 就 直接“將兩行貼在一起,且中間以 [tab] 鍵隔開”
expand 這玩意兒就是在將 [tab] 按鍵轉成空白鍵啦。
分區命令: split
范例一:我的 /etc/services 有六百多K,若想要分成 300K 一個文件時?
[dmtsai@study ~]$ cd / | split -b 300k /etc/services services [dmtsai@study tmp]$ ll -k services* -rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesaa -rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesab -rw-rw-r--. 1 dmtsai dmtsai 55893 Jul 9 22:52 servicesac
參數代換: xargs
關于減號 - 的用途
管線命令在 bash 的連續的處理程序中是相當重要的!另外,在 log file 的分析當中也是相當 重要的一環, 所以請特別留意!另外,在管線命令當中,常常會使用到前一個指令的 stdout 作為這次的 stdin , 某些指令需要用到文件名稱 (例如 tar) 來進行處理時,該 stdin 與 stdout 可以利用減號 "-" 來替代, 舉例來說:
[root@study ~]# mkdir /tmp/homeback [root@study ~]# tar -cvf - /home | tar -xvf - -C /tmp/homeback
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。