Shell變量

Shell變量

Shell支持自定義變量shell

定義變量

定義變量時,變量名不加美圓符號($),如:bash

variableName="value"

注意變量名和等號之間不能有空格函數

變量名的命名必須遵照如下規則:spa

  • 首字符必須爲字母;
  • 變量名中不能出現標點符號或者空格,可使用下劃線;
  • 不能使用bash中的關鍵字(可使用help命令查看保留關鍵字)。

變量定義舉例:命令行

myName="Sherry"
myAge=100

使用變量

使用一個定義過的變量,只要在變量名前面加美圓符號($)便可,如:code

myName="Sherry"
echo $myName
echo ${myName}

變量名外面的大括號可加可不加,加大括號是爲了讓解釋器識別變量的邊界,好比:進程

myName="Sherry"
echo "${myName}Me"

若是不給myName變量加花括號,寫成echo "$myNameMe",解釋器就會把$myNameMe當成一個變量(其值爲空),與預期不符。因此強烈建議給全部變量加上花括號table

從新定義變量

已定義的變量,能夠被從新定義,好比:class

myName="Sherry"
echo "${myName}"

myName="Susan"
echo "${myName}"

只讀變量

使用 readonly 命令能夠將變量定義爲只讀變量,只讀變量的值不能被改變。test

myName="Sherry"
readonly myName
myName="Sherry"

運行腳本後會報錯:

./test.sh: myUrl: readonly variable

刪除變量

使用unset命令能夠刪除變量。語法:

unset variable_name

變量被刪除後不能再次使用,若被引用不會有任何的輸出;unset命令不能刪除只讀變量。

變量類型

運行shell時,會同時存在三種變量:

1)局部變量

局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。

2)環境變量

全部的程序,包括shell啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。

3)shell變量

shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行。

Shell特殊變量

前面已經講到,變量名只能包含數字、字母和下劃線,由於某些包含其餘字符的變量有特殊含義,這樣的變量被稱爲特殊變量。

特殊變量列表

變量 含義
$0 當前腳本的文件名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的全部參數。
$@ 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。

命令行參數

運行腳本時傳遞給腳本的參數稱爲命令行參數。命令行參數用 $n 表示,例如,$1 表示第一個參數,$2 表示第二個參數,依次類推。

以下腳本:

#!/bin/bash

echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

運行結果以下:

$./test.sh Sherry Lv
File Name: ./test.sh
First Parameter : Sherry
First Parameter : Lv
Quoted Values: Sherry Lv
Quoted Values: Sherry Lv
Total Number of Parameters : 2

$* 和 $@ 的區別

$* 和 $@ 都表示傳遞給函數或腳本的全部參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出全部參數。

可是當它們被雙引號(" ")包含時,"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式輸出全部參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出全部參數。

下面的例子能夠清楚的看到 $* 和 $@ 的區別:

#!/bin/bash

echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
    echo "$var"
done
echo "print each param from \$@"
for var in $@
do
    echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done

執行 ./test.sh "a" "b" "c" "d",看到下面的結果:

$*= 1 2 3 4
"$*"= 1 2 3 4
$@= 1 2 3 4
"$@"= 1 2 3 4
print each param from $*
1
2
3
4
print each param from $@
1
2
3
4
print each param from "$*"
1 2 3 4
print each param from "$@"
1
2
3
4

退出狀態

$? 能夠獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。

退出狀態是一個數字,通常狀況下,大部分命令執行成功會返回 0,失敗返回 1。

不過,也有一些命令返回其餘值,表示不一樣類型的錯誤。

$ echo $?
0

$? 也能夠表示函數的返回值,後續將會講解。

相關文章
相關標籤/搜索