Linux中的變量有環境變量和用戶自定義變量,關於環境變量,可以查看這篇博客:linux環境變量
本文主要針對的是用戶在shell腳本中定義的變量,但是環境變量也可以在shell腳本中使用。
普通變量
注意事項:
- 變量名以英文字母或者下划線開頭,但是不能以數字開頭
- 變量名區分大小寫
- 變量名與等號之間,等號與變量值之間不要有空格
- 只有在使用變量的值的時候,才在變量名之前加$,其他情況,比如刪除、賦值、循環迭代都不用加$
- 如果一行只有一條命令,則每一行不用以分號結尾,每一條命令以換行分隔
- 如果一行有多條命令,則每一條命令以分號分隔,但建議每行只有一條命令
#!/bin/bash #文件名:test.sh name="beyond" echo $name
執行腳本:
ubuntu@ubuntu:~$ ./test.sh beyond ubuntu@ubuntu:~$
有時候在使用變量的時候,變量名后面會跟着一些字符,如果這些字符與變量名之間沒有間隔,那么,這些字符也將被認為是變量的一部分,即$nameHello,解釋器回去找$nameHello,而不是找$name,可已使用兩種方法,一種是使用空格分隔,另外一種使用花括號將變量名括起來(不要將$括起來)。如下例
#!/bin/bash #文件名:test.sh name="beyond" echo "one",$name echo "two",$nameHello echo "three",$name hello echo "four",${name}hell
執行腳本:
ubuntu@ubuntu:~$ ./test.sh one,beyond two, three,beyond hello four,beyondhell
從用戶鍵盤讀取數據並賦值給變量,使用:read [-p "提示信息"] 變量名
#!/bin/bash #文件名:test.sh #輸出一段話,並等待用戶輸入,輸入的內容賦值給后面的變量 read -p "please input your name:" name echo "welcome ${name}"
執行腳本:
ubuntu@ubuntu:~$ ./test.sh please input your name:beyond welcome beyond ubuntu@ubuntu:~$
單引號與雙引號的區別:
1、在單引號中,變量不能被解析;在雙引號中變量可以被解析。
2、轉義字符在單引號和雙引號中都不會轉義,反引號的作用是將反引號括起來的命令(括起來的內容會被當成命令執行),然后將結果賦值給一個變量。
注意,使用反引號將命令括起來之后,如果不將運行整個命令賦值給一個變量,那么就會將反引號中的命令的執行結果當成shell命令執行。
#!/bin/bash #文件名:test.sh name="beyond" #雙引號括起來的變量能解析 echo one,"$name" #雙引號括起來的變量不能解析,會輸出變量名 echo two,'$name' #轉義字符在單引號和雙引號中都不會轉義 echo three,"$name\t hello" echo four,'$name\t hello' #echo `${name} \t hello` #上面這條命令會出錯,因為bash會將beyond \t hello當做shell命令執行 str=`echo $name \t hello` echo $str str=`date` #date是在命令行中獲取當前時間 echo "current time is $str"
執行腳本:
ubuntu@ubuntu:~$ ./test.sh one,beyond two,$name three,beyond\t hello four,$name\t hello beyond t hello current time is 2018年 01月 07日 星期日 18:50:59 CST
變量的刪除使用unset 變量名,注意此時變量名之前不要加$符號
#!/bin/bash #文件名:test.sh name="beyond" echo one,"$name" //使用unset來刪除變量 unset name echo $name
執行腳本:
ubuntu@ubuntu:~$ ./test.sh one,beyond ubuntu@ubuntu:~$
位置變量:
咱們平時使用ls 查看當前目錄下的文件時,常常會帶-l -a -i等參數,這些參數就是位置變量,使用這些的方法:用$加數字(0-9)來獲取,如果數字大於9時,則會使用數字的最高位所代表的位置變量,然后這個位置變量會拼接上數字剩下的部分,所以說shell命令行最多可以傳遞9個參數(如果參數過多,可以將多個參數連接為一個參數來擴充),也可以使用${11}來獲取第11個位置參數。
#!/bin/bash #文件名:test.sh echo $0 echo $1," ",$2," ",$3," ",$4," ",$5 echo $6," ",$7," ",$8," ",$9," ",$10 echo $11," ",$12
執行腳本:
ubuntu@ubuntu:~$ ./test.sh a b c d e f g h i j k ./test.sh a, ,b, ,c, ,d, ,e f, ,g, ,h, ,i, ,a0 a1, ,a2 ubuntu@ubuntu:~$
預定義變量:
預定義變量名 | 含義 |
$0或者${0} | 當前執行的進程名/腳本名/程序名 |
$#或者${#} | 命令行中位置參數的總數量 |
$*或者${*} | 所有位置參數的內容 |
$?或者${?} | 上一條命令執行的返回結果,0表示正常,非0表示異常或出錯 |
#!/bin/bash #文件名:test.sh echo "進程名:"$0 echo "位置參數的數量:"$# echo "所有位置參數的內容:"$* #執行一條非法語句,執行異常,返回非0 `echo "hello world"` echo "上一條命令的執行結果:"$? #執行一條合法語句,正常運行完畢,返回0 str=`echo "hello world"` echo "上一條命令的執行結果:"$?
執行腳本:
ubuntu@ubuntu:~$ ./test.sh a b c d e f g 進程名:./test.sh 位置參數的數量:7 所有位置參數的內容:a b c d e f g ./test.sh: line 8: hello: command not found 上一條命令的執行結果:127 上一條命令的執行結果:0 ubuntu@ubuntu:~$
數組