#!/bin/bash # hello world echo "what' s your name ?" #read 命令從 stdin 獲取輸入並賦值給 PERSON 變量,最後在 stdout 上輸出 read name echo "My name is $name"
定義變量時,變量名不加美圓符號($),如:shell
variableName="value"
變量的定義規則:segmentfault
變量名和等號之間不能有空格bash
首個字符必須爲字母(a-z,A-Z)。函數
中間不能有空格,可使用下劃線(_)。url
不能使用標點符號。spa
不能使用 bash 裏的關鍵字(可用 help
命令查看保留關鍵字)code
使用一個定義過的變量,只要在變量名前面加美圓符號($)便可,如:blog
your_name=「weixuan」 echo $your_name echo ${your_name}
變量名外面的花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界進程
已定義的變量,能夠被從新定義,如:ip
myUrl="http://segmentfault.com/" echo ${myUrl} myUrl="http://segmentfault.com/questions/newest" echo ${myUrl}
使用 readonly 命令能夠將變量定義爲只讀變量,只讀變量的值不能被改變
#!/bin/bash url="http://segmentfault.com/questions/newest" readonly url url="http://segmentfault.com/"
報錯:
[root@iZ285svxip6Z shell]# ./myshell.sh ./myshell.sh: line 7: url: readonly variable
使用 unset 命令能夠刪除變量。語法:
unset variable_name
變量被刪除後不能再次使用;unset 命令不能刪除只讀變量。
局部變量
局部變量在腳本或命令中定義,僅在當前 shell 實例中有效,其餘 shell 啓動的程序不能訪問局部變量。
環境變量
全部的程序,包括 shell 啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候 shell 腳本也能夠定義環境變量。
shell 變量
變量是由 shell 程序設置的特殊變量。shell 變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了 shell 的正常運行
變量 | 含義 |
---|---|
$0 | 當前腳本的文件名 |
$n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# | 傳遞給腳本或函數的參數個數。 |
$* | 傳遞給腳本或函數的全部參數。 |
$@ | 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。 |
$? | 上個命令的退出狀態,或函數的返回值。 |
$$ | 當前 Shell 進程 ID。對於 Shell 腳本,就是這些腳本所在的進程 ID。 |
示例代碼
#!/bin/bash echo "File name : $0" echo "First param : $1" echo "second param : $2" echo "quoted values : $@" echo "quoted values 2 : $*" echo "Total number of params : $#" echo "shell id : $$" ----------------------------------------- 運行結果: [root@iZ285svxip6Z shell]# ./demo.sh weixuan nicholas File name : ./demo.sh First param : weixuan second param : nicholas quoted values : weixuan nicholas quoted values 2 : weixuan nicholas Total number of params : 2 shell id : 3094
$*
和 $@
都表示傳遞給函數或腳本的全部參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出全部參數。
可是當它們被雙引號(" ")包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出全部參數。
$?
能夠獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。
退出狀態是一個數字,通常狀況下,大部分命令執行成功會返回0,失敗返回1。
-e
表示對轉義字符進行替換。若是不使用 -e
選項,將會原樣輸出
demo
#!/bin/bash name="weixuan" echo -e "My name is $name \n" echo "My name is $name \n" ---------------------------- 結果 My name is weixuan My name is weixuan \n
echo 命令的 -E 選項禁止轉義,默認也是不轉義的。
shell命令替換是指能夠先執行命令,將輸出結果暫時保存,在適當的地方輸出。
命令替換的語法: `command` 注意是反引號
#!/bin/bash # 等於執行shell命令date,將date的值保存給變量DATE DATE=`date` echo "The Date is $DATE" USERS=`who | wc -l` echo "Logged in user are $USERS" UP=`date;uptime` echo "Uptime is $UP" ------------------------- 結果: The Date is Mon Oct 12 13:22:54 CST 2015 Logged in user are 1 Uptime is Mon Oct 12 13:22:54 CST 2015 13:22:54 up 16 days, 21:16, 1 user, load average: 0.00, 0.00, 0.00
變量替換能夠根據變量的狀態(是否爲空、是否認義等)來改變它的值。
形式 | 說明 |
---|---|
${var} | 變量原本的值 |
${var:-word} | 若是變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值 |
${var:=word} | 若是變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word。 |
${var:?message} | 若是變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標 準錯誤輸出,能夠用來檢測變量 var 是否能夠被正常賦值。若此替換出如今 Shell 腳本中,那麼腳本將中止運行。 |
${var:+word} | 若是變量 var 被定義,那麼返回 word,但不改變 var 的值 |
demo
#!/bin/bash # 輸出變量var 的自己的值,沒有定義 ,那麼返回word,不會改變var自己的值 echo ${var:-"value is not set"} echo "1 - value of var is ${var}" # var沒有定義,返回word,並將var的值設爲word echo ${var:="value is not set"} echo "2 - value of var is ${var}" # var被定義,返回word,不改變var的值 var="weixuan" echo ${var:+"my name is not weixuan"} echo "3 - value of var is ${var}" #var被刪除,打印messqge,同時退出shell unset var echo ${var:?"Error"} echo "4 - value of var is ${var}" ----------------------- 結果: value is not set 1 - value of var is value is not set 2 - value of var is value is not set my name is not weixuan 3 - value of var is weixuan ./demo4.sh: line 18: var: Error