2021-05-12 14:32:11
Bash基本語法詳解
Bash語法非常的簡單,Bash是一個命令解釋程式,單使用Bash做不了什麼,但是Bash結合Linux命令就很強大了,幾乎可以完成Linux所有的事情,早年第一個接觸Bash的時候,可以追溯到2010年了,當時在一家網際網路虛產品的公司,那是個時候WEB虛機還很流行的,底層WEB虛機的建立,開戶都用Shell指令碼實現。當時我作為Java開發人員,但有幸參與到shell指令碼開發中,當時對Shell並不是很熟,從那個時候算是對Shell第一次試水,並沒有進行深入的學習,之後工作重點後來又轉向Java開發,但從那個時候就起就感覺shell這個東西很好玩,最近想重新把這塊東西撿起來,一點一滴的記錄下來,學習shell一定要把學習Linux命令分開,要不然一開始學可能會一頭霧水,這是我的一點建議,隨著對Linux命令的掌握,再加上shell指令碼的威力,就可以在Linux的高手。
1 標準輸入、輸出與標準錯誤輸出
系統為這三個檔案分配了檔案識別符號fd(file descripter),在Linux系統下,一切皆是檔案,對檔案的操作,一般要用到檔案識別符號。它們的檔案識別符號,分別為0,1,2,關係如下表:
檔案描述符 | 名稱 | 通用縮寫 | 預設值 |
0 | 標準輸入 | stdin | 鍵盤 |
1 | 標準輸出 | stdout | 螢幕 |
2 | 標準錯誤 | stderr | 螢幕 |
1.1 輸出重定向
語法 | 說明 |
> | 把標準輸出重定向到一個新檔案,”>” 會覆蓋原有的內容。 |
>> | 把標準輸出重定向到一個檔案中,不覆蓋原有的內容(追加)。 |
2 > | 把標準錯誤重定向到一個檔案中 |
2 >> | 把標準錯誤重定向到一個檔案中(追加) |
2 > &1 | 把標準輸出和錯誤重定向到一個檔案(追加) |
1.2 輸入重定向
語法 | 說明 |
< | filename檔案作為標准輸入 |
<< delimiter | 從標準輸入中讀入,知道遇到delimiter分界符 |
1.3 係結重定向
語法 | 說明 |
> &m | 把標準輸出重定向到檔案描述符m中 |
< &- | 關閉標準輸入 |
> &- | 關閉標準輸出 |
2 變數
2.1 環境變數
通過使用printenv可以顯示當前的環境變數
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@IDC-D-1699 ~] # printenv HOSTNAME=IDC-D-1699 TERM=xterm SHELL= /bin/bash HISTSIZE=1000 SSH_CLIENT=111.200.23.36 31752 22 QTDIR= /usr/lib64/qt-3 .3 QTINC= /usr/lib64/qt-3 .3 /include SSH_TTY= /dev/pts/3 USER=root MAIL= /var/spool/mail/root PATH= /usr/local/java/jdk1 .8.0_101 /bin : /usr/lib64/qt-3 .3 /bin : /usr/local/sbin : /usr/local/bin : /sbin : /bin : /usr/sbin : /usr/bin : /root/bin PWD= /root JAVA_HOME= /usr/local/java/jdk1 .8.0_101 LANG=zh_CN.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME= /root LOGNAME=root |
2.2 本地變數
Shell不需要明確定義型別,事實上Shell變數的值都是字串,比如我們定義var=45,其實var的值是字串而非整數,shell變數不需要事先定義就可以使用,如果使用沒有定義的變數,這字串取值為空字串。
變數名稱=”變數Value”,“=”的兩邊不能有空格,否則shell解釋成名稱和命令引數。
獲取變數使用 $變數名稱
2
3
|
a= "ywq" echo $a |
2.2.1 檔名代換
可以使用*、?、[]對檔名代換
匹配符 | 說明 |
* | 匹配0個多個任意字元 |
? | 匹配一個任意字元 |
[] | 匹配方括號中任意一個字元的一次出現 |
2.2.2 命令代換
將命令替換為命令輸出,所有的shell支援使用反引號的方式進行命令替換,命令替換可以巢狀,需要注意的是如果使用反引號的形式,在內部反參照前必須使用反斜槓轉移
匹配符 | 說明 |
`` | 例如 echo ${pwd} |
$() | 例如 echo `pwd` |
2.2.3 算術代換
匹配符 | 說明 |
$(()) | 例如 echo $((4 + 6)) |
3 符號
3.1 跳脫字元
‘’用作跳脫字元。
3.2 單引號
單引號內的所有字元都保持它本身字元的意思,而不會被bash進行解釋。
3.3 雙引號
除了$、``、/外,雙引號內所有的字元保持字元本身的含義。
4 邏輯判斷
4.1 if
在shell中用if,then,elif,else,fi這幾條命令實現分支控制,這種流程控制語句本質上也是由若干個邏輯判斷組成,需要注意的是。
- if/then結束都離不開fi
- if和[]注意用空格隔開,]後面緊跟;
- []內的條件與都有一個空格隔開
例如:
2
3
4
|
if [ -f $a ]; then echo "hello world!" fi |
4.2 case
case結構用於多種情況的條件判斷,類似於其它語言的switch/case,但從語法結構上有很大的不同,常用格式。
2
3
4
5
6
7
8
9
10
11
12
|
case 字串 in 模式) 語句 ;; 模式2 | 模式3) 語句 ;; *) 預設執行的 語句 ;; esac |
例如
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#!/bin/bash read -p "請輸入要查查詢的區號:" num case $num in *) echo -n "中國" ;;& 03*) echo -n "河南省" ;;& ??71) echo "鄭州市" ;; ??72) echo "安陽市" ;; ??73) echo "新鄉市" ;; ??73) echo "許昌市" ;; 07*) echo -n "江西省" ;;& ??91) echo "南昌市" ;; ??92) echo "九江市" ;; ??97) echo "贛州市" ;; esac |
注意
當程式指定到條件語句;;&時,不會停止,直到執行到;;esac
不管是if還是case,他們的結尾都很有意思,if的結尾是fi,而case的結尾是easc,首位和尾部正好相反。
5. 迴圈
5.1 for
例如:
列印目錄下所有的檔案
2
3
4
5
|
#!/bin/bash for i in $( ls ); do echo item: $i done |
列印序列
2
3
4
5
6
|
#!/bin/bash for n in $( seq 1 10); do echo $n done |
5.2 while
例如:
2
3
4
5
6
7
8
|
#!/bin/bash counter=$1 while [ $counter -lt 10 ]; do echo the counter is $counter counter=$(($counter+1)) done |
5.3 until
例如:
2
3
4
5
6
7
8
|
#!/bin/bash counter=$1 until [ $counter -lt 10 ]; do echo the counter:$counter let counter=counter-1 done |
6 比較運算
6.1 比較符
比較符 | 說明 | 舉例 |
-e filename | 如果filename存在,則為真 | [ -e /var/log/syslog ] |
-d filename | 如果filename為目錄,則為真 | [ -d /tmp/mydir ] |
-f filename | 如果filename常規檔案,則為真 | [ -f /usr/bin/grep ] |
-L filename | 如果filename為符號連結,則為真 | [ –L /usr/bin/grep ] |
-r filename | 如果filename可讀,則為真 | [ –r /var/log/syslog ] |
-w filename | 如果filename可寫,則為真 | [ –w /varmytmp.txt ] |
-x filename | 如果filename可執行,則為真 | [ –x /usr/bin/grep ] |
-s filename | 如果filename不是空白檔案,則為真 | |
-u filename | 如果filename有SUID屬性,則為真 | |
-g filename | 如果filename有SGID屬性,則為真 | |
-k filename | 如果filename有stickybit屬性,則為真 | |
file1 –nt file2 | 如果file1比file2新,則為真 | |
file1 –ot file2 | 如果file1比file2舊,則為真 |
6.2 字串比較運算子
比較符 | 說明 | 舉例 |
-z string | 如果string長度為零,則為真 | |
-n string | 如果string長度不為零,則為真 | |
str1 = str2 | 如果str1與str2相同,則為真 | |
str1 != str2 | 如果str1與str2不相同,則為真 |
6.3 算數比較符
比較符 | 說明 | 舉例 |
-eq | 等於 | |
-ne | 不等於 | |
-lt | 小於 | |
-le | 小於或等於 | |
-gt | 大於 | |
-ge | 大於或等於 |
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-08/134411.htm
相關文章