shell指令碼在linux下開發經常需要用到,shell的指令碼可以幫助使用者自動化地和作業系統進行互動,起到了提高效率的作用。
學習一門語言,通常需要實戰演練編碼除錯,shell該如何除錯呢?使用bash -x
命令即可。
vi demo.sh
敲入**:
#!/bin/bashecho
1;echo $(date +'%y-%m-%d');
執行bash -x demo.sh
將輸出
+ echo 1#**1
#執行結果
++ date +%y-%m-%d #巢狀**
+ echo 2014-10-30
#**2014-10-30
#執行結果
可以看到,bash會先輸出**,再輸出執行結果,前面帶+號表示這是一行shell**,多個+號表示**有巢狀邏輯。
更多除錯方法見
如何從命令外部傳遞引數到指令碼裡頭?
#!/bin/bashecho
$0#指令碼名
echo
$1#第乙個引數
echo
$#第2個引數
echo
$##引數總數(不含$0)
echo $* #所有引數(不含$0)
執行bash demo.sh aa bbb ccc dddd
將輸出:
demo.shaabbb4aa
bbb ccc dddd
$*
和$@
的區別?
變數的命名語法是:$*
和$@
都表示傳遞給函式或指令碼的所有引數,不被雙引號("
"
)包含時,都以」$1」 「$2」 … 「$n」 的形式輸出所有引數。但是當它們被雙引號(
"
"
)包含時,
"$*"
會將所有的引數作為乙個整體,以"$1 $2 … $n"
的形式輸出所有引數;
"$@"
會將各個引數分開,以"$1"
"$2"
…"$n"
的形式輸出所有引數。
賦值時等號兩邊不能帶空格,否則會報錯。
#字串變數賦值name=wang age="100"
#陣列變數賦值(3種方式)
array_name1=(value1000 value11 value12 value13)
array_name2=(
value20
value21
value22
value23
)array_name3[0]=value30
array_name3[1]=value31
array_name3[2]=value32
#雙引號內使用變數,單引號不識別內部變數。
echo
"雙引號:$name is $ years old."
echo
'單引號:$name is $ years old.'
#不使用雙引號
echo 不使用雙引號:$ is $age years old.
#讀取陣列元素
echo
"陣列元素:$
$$";
#使用@ 或 * 可以獲取陣列中的所有元素,例如:
echo
"陣列@:$"
echo
"陣列*:$"
#取得陣列元素的個數
echo
"陣列元素的個數:$
$"#取得陣列單個元素的長度
echo
"陣列單個元素的長度:$"
將輸出
雙引號:wang is 100 years old.單引號:
$name is $ years old.
不使用雙引號:wang is 100 years old.
陣列元素:value12 value22 value32
陣列@:value1000 value11 value12 value13
陣列*:value1000 value11 value12 value13
陣列元素的個數:43
陣列單個元素的長度:
9
使用變數可以是$name
或者$
的形式,注意有別於php字串內變數。
$
表示可變變數,類似於php的$$name
。
自定義變數往往需要參與各種字串拼接,如果不加括號,既不利於閱讀,也很容易導致邏輯錯誤。
# goodprefix="pre"
echo
"$_dir/file"
# bad
# 會把prefix_dir視為變數名,由於無定義,會輸出/file,若設定了set -u,則會報錯。
prefix="pre"
echo
"$prefix_dir/file"
語法特點為:
if [[ 0-eq2 ]]
then
echo
'if'
elif [ 2 ]; then
echo
'else if'
else
echo
'else'
fi
字串
檔案狀態
邏輯操作
例如
[ 1 -lt 2 ]echo $?
#true
[ "a" != "a" -o "b" = "c" ]
echo $?
#false
[ "a" != "a" ] || [ "b" = "c" ]
echo $?
#false
#從標準輸出獲取陣列list1=$(echo
'aaa bbb ccc ddd' | awk '')
for i in
$#初始化陣列
list2=(123
4)for i in$do
echo
$idone
#構建迴圈條件列表
for i in
$ "}
}
functionfoo()
return
22; #返回值
}foo 123 abc
echo $?
將輸出
123abc22
echo $(pwd) #語法可讀性更好,且支援巢狀echo `pwd`
使用$(())
, 不使用let
# i自增1$(( i += 1 ))
# 複雜的算數計算
min=5
sec=30
echo $(( (min * 60) + sec ))
shell 學習筆記
shell 是解釋型語言 移植性強課對應不同的直譯器 bin sh f 變數開頭以乙個字母或者下劃線,後接任意長度的字母 數字或者下劃線。命令 commod op 引數 輸入 輸出 重定向管道 echo printf 大口如小口出。特殊檔案 dev null bit bucket 刪除所有輸入的資料...
shell學習筆記
1 shell檔案的第一行都必須是 bin sh 也可以有其他路徑,這裡我們只以這個為例 2 定義變數 a value 中間不能有空格 呼叫方法 echo a 3 shell常用的條件測試 備註 方括號兩側必須要有空格,f lt等兩側也必須要有空格 a f file 判斷 file是否是乙個檔案 b...
Shell學習筆記
0 序言 由於linux圖形化介面 x視窗系統 不是linux自帶程式 相當耗費系統資源,會極大降低linux系統的效能。因此推薦使用shell工具。shell是個命令語言直譯器,在linux的命令列介面下使用。使用者在提示符下輸入的命令都有shell先解釋然後再傳給linux核心。一 shell呼...