首頁 > 軟體

Bash基本語法詳解

2020-06-16 17:35:08

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


IT145.com E-mail:sddin#qq.com