基本語法掌握(shell 學習第二天)
阿新 • • 發佈:2018-11-14
Shell 傳遞引數
-
執行 Shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為:$n。n 代表一個數字,1 為執行指令碼的第一個引數,2 為執行指令碼的第二個引數,以此類推……
-
其中 $0 為執行的檔名
#!/bin/bash
echo "Shell 傳遞引數例項!";
echo "執行的檔名:$0";
echo "第一個引數為:$1";
echo "第二個引數為:$2";
echo "第三個引數為:$3";
執行 及 結果:
$ chmod +x test.sh $ ./test.sh 1 2 3 Shell 傳遞引數例項! 執行的檔名:./test.sh 第一個引數為:1 第二個引數為:2 第三個引數為:3
引數處理 | 說明 |
---|---|
$# | 傳遞到引數的個數 |
$* | 以一個單字串顯示所有向指令碼傳遞的引數。以"$1$2 n"的形式輸出所有引數 |
$$ | 指令碼執行的當前程序的ID號 |
$! | 後臺執行的最後一個程序的ID號 |
[email protected] | 和$*不同,以"$1" " n"輸出 |
$- | 顯示shell使用的當前選項,與set命令功能相同 |
$? | 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤 |
陣列:
- 獲取陣列中的所有元素
使用@ 或 * 可以獲取陣列中的所有元素。
echo "陣列的元素為: ${my_array[*]}"
echo "陣列的元素為: ${my_array[@]}"
- 獲取陣列的長度
獲取陣列長度的方法與獲取字串長度的方法相同
echo "陣列元素個數為: ${#my_array[*]}"
echo "陣列元素個數為: ${#my_array[@]}"
-
注:陣列的值也可以寫入變數。
-
根據陣列元素索引獲取該陣列元素值時,陣列下標可為變數。
-
遍歷陣列,在就新手學習的時候注意一下 [ 和 $ 之間要有空格,沒有空格執行會報錯:
-
提前感受一下遍歷!!!
#!/bin/bash
my_arry=(a b "c","d" abc)
echo "-------FOR迴圈遍歷輸出陣列--------"
for i in ${my_arry[@]};
do
echo $i
done
echo "-------::::WHILE迴圈輸出 使用 let i++ 自增:::::---------"
j=0
while [ $j -lt ${#my_arry[@]} ]
do
echo ${my_arry[$j]}
let j++
done
echo "--------:::WHILE迴圈輸出 使用 let "n++ "自增: 多了雙引號,其實不用也可以:::---------"
n=0
while [ $n -lt ${#my_arry[@]} ]
do
echo ${my_arry[$n]}
let "n++"
done
echo "---------::::WHILE迴圈輸出 使用 let m+=1 自增"
m=0
while [ $m -lt ${#my_arry[@]} ]
do
echo ${my_arry[$m]}
let m+=1
done
echo "-------::WHILE迴圈輸出 使用 a=$[$a+1] 自增,個人覺得這種寫法比較麻煩::::----------"
a=0
while [ $a -lt ${#my_arry[@]} ]
do
echo ${my_arry[$a]}
a=$[$a+1]
done
結果:
-------FOR迴圈遍歷輸出陣列--------
a
b
c,d
abc
-------::::WHILE迴圈輸出 使用 let i++ 自增:::::---------
a
b
c,d
abc
--------:::WHILE迴圈輸出 使用 let n++ 自增: 多了雙引號,其實不用也可以:::---------
a
b
c,d
abc
---------::::WHILE迴圈輸出 使用 let m+=1 自增
a
b
c,d
abc
-------::WHILE迴圈輸出 使用 a=1 自增,個人覺得這種寫法比較麻煩::::----------
a
b
c,d
abc
shell基本運算子
-
Shell 和其他程式語言一樣,支援多種運算子,包括:
- 算數運算子
- 關係運算符
- 布林運算子
- 字串運算子
- 檔案測試運算子
-
原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
-
expr 是一款表示式計算工具,使用它能完成表示式的求值操作。
例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '): -
算術運算子
#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等於 b"
fi
if [ $a != $b ]
then
echo "a 不等於 b"
fi
結果:
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等於 b
注:
- 乘號(*)前邊必須加反斜槓()才能實現乘法運算;
- if…then…fi 是條件語句,後續將會講解。
- 在 MAC 中 shell 的 expr 語法是:$((表示式)),此處表示式中的 “*” 不需要轉義符號 “” 。
關係運算符
- 使用 [[ … ]] 條件判斷結構,而不是 [ … ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、< 和 > 操作符能夠正常存在於 [[ ]] 條件判斷結構中,但是如果出現在 [ ] 結構中的話,會報錯。
- 進行數值比較時,可以使用 [ expression1 OPexpression2 ],OP 可以為 -gt、-lt、-ge、-le、-eq、-ne 也可以使用 ((expression1 OP expression2)),OP 可以為 >、<、>=、<=、==、!=。這幾個關係運算符都是測試整數表示式 expression1 和 expression2 之間的大小關係。
-
<、==、!= 也可以進行字串比較。
- 進行字串比較時,== 可以使用 = 替代。
- == 和 !=進行字串比較時,可以使用 [ string1 OP string2 ] 或者 [[ string1 OP string2 ]] 的形式。
-
和 < 進行字串比較時,需要使用[[ string1 OP string2 ]] 或者 [ string1 \OP string2 ]。也就是使用 [] 時,> 和 < 需要使用反斜線轉義。
布林運算子
邏輯運算子
字元運算子
檔案測試運算子
加法幾種寫法
Shell 相加目前發現有 3 種寫法:
1.
a=10
b=20
c=`expr ${a} + ${b}`
echo "$c"
c=$[ `expr 10 + 20` ]
echo "$c"
c=$[ 10 + 20 ]
echo "$c"
- val=$(expr 10 + 20)
a=10
b=20
c=$(($a+$b))
初學者推薦第一種寫法,雖然看著複雜,但邏輯清晰,不易混淆。