文章目錄
- 前言
- 括号規則
- 變量
- 作用域
- 運算符
- 函數
- if 條件語句
- for 和 while 循環語句
- 輸入輸出語句
- 一些内置變量
- 其他
環境
- linux centos7
- bash shell 3
- vim 編輯器
玩轉shell-那些反人類的括号使用規則大彙總!
下方的變量的介紹還不夠充分,想要全面了解 shell 的變量相關的知識請看這篇博文:玩轉shell-各種變量類型的運算和使用總結
變量使用
命名也基本遵從其他程式的命名規則,引用變量用美元符
# 設定變量,變量的作用範圍目前指令視窗
a="123"
# readonly 隻讀變量
readonly a
# unset 删除,但是這裡删除不了,因為是隻讀的
unset a
# 引用基本變量
$a
# 引用數組
${a[1]}
# 引用指令語句的輸出,等價于 ` `
$(cat tmp.log)
# 數組變量聲明
arr=(1 2 3)
# 數組變量追加元素
arr+=(4)
# 删除數組某個元素要借助下标去删除,此操作隻能删除值但是下标還是指向一個空值的
# 數組本質應該看成鍵值對,我這裡删除了,後面下标的元素還存在,删的是整個鍵值對,并且總個數少了一個
unset arr[$i];
# 取所有元素
echo "${arr[@]}"
# 取所有下标
echo "${!arr[@]}"
# 擷取數組長度
echo "${#arr[@]}"
變量類型
# 字元串類型,這個是預設類型,即使開始時 a=1,預設 a 還是字元串
# 拼接字元串,簡單粗暴
a="world"
b="hello"$a
# 數字類型有整形和浮點型,整型不說了
# 浮點型,(()) 中隻支援整型計算,shell 對于數字類型也是預設支援整型,浮點型需要 scale 和 bc 的支援,scale 表示幾位小數
echo "scale=2;3/2" | bc
# 數組
arr=(1 2 3)
# 取數組
a=${arr[0]}
# 即使數組沒有全部位置聲明,也可以單獨指派,這說明其他位置可以為空值
arr[1]=1
# 取出所有數
${arr[*]}
${arr[@]}
注意:bash 4.0 開始支援數組下标是字元型了,和 awk 數組一樣,但是目前市面上大部分 shell 都是 3.0,這就很坑爹了。。。
# shell 中定義變量預設是 global 型,作用域是從定義開始到 shell 結束
a=1;
# 設定 local 變量往往是在函數類去使用,作用域在函數内,同名的話和其他程式一樣 local 會屏蔽掉 global
local a=1;
# 加減乘除取餘相等不相等如下,(加減乘數是數字,字元串直接寫在一起即可拼接,""aaa,不能寫加号)
`expr $a + $b`
`expr $a - $b`
`expr $a \* $b`
`expr $a / $b`
`expr $a % $b`
`expr $a == $b`
`expr $a != $b`
# 也可支援算數運算指派
+=
-=
*=
/=
%=
# 關系運算符支援數字
-eq
-gt
-lt
# >=
-ge
# <=
-le
fsum 2 5
fsum(){
echo $1,$2;
return $1+$2;
}
if…then…fi
# if 語句基本格式一
if 條件
then
語句1
語句2
elif
then
語句3
else
語句4
fi
# if 語句基本格式二
if 條件; then 語句1; 語句2; fi
# 條件中括号的使用
# 大于或者小于要用兩個中括号,要想使用一個中括号,要用-gt和-lt分别代表大于和小于
if [[ 2 > 1 ]]
if [ 2 -gt 1 ]
# 等于用一個中括号,等号等價于-eq
if [ 2 == 2 ]
if [ 2 -eq 2 ]
# && || 這兩個符号也可以用作條件語句
# 指令1為真後面的指令才會執行
command1 && command2
# 指令1為假後面的指令才會執行
command1 || command2
for…do…done
while 條件…do…done
# for 循環基本格式,将這三個值依次賦給變量
# 注意如果将 值1 值2 值3 用雙引号框了起來,那麼循環隻進行一次,輸出字元串
for 變量 in 值1 值2 值3
do
語句1
語句2
done
# for 從檔案中讀,但是讀取不是按行劃分,而是按空格劃分,$(cat tmp.log) 表示一個表達式的輸出,效果等價于 `cat tmp.log`
for a in $(cat tmp.log)
do
echo $a;
done
# for 從輸出的表達式中讀
for a in `表達式`
do
echo $a;
done
# 也支援和其他語言類似的寫法,注意嚴格的打空格!
for (( i=0;i<10;i++ ))
do
語句1
語句2
done
# while 循環基本格式
while 條件
do
語句1
語句2
done
# while 舉例
a=0
while (( $a<=3 ))
do
let "a++";
done
# 從檔案中讀每一行舉例,讀取是按照行劃分
while read a
do
echo $a;
done<tmp.log
# 普通輸入
read
< file
# read 指令,把值讀到 a 中
read a
123
# 讀入一行,謹記當我們讀入一行 a b c d 這樣的内容時候,不可以把其視為數組,其本質是字元串,是以 ${...} 的操作就相當于把這一行字元串指派給數組第一個元素了!
echo "一行" | read line
# 循環讀入每一行,且按照 FS 基本符号切割成數組形式,FS 基本符号是空格
while read -a arr
do
myArr+=(${arr[@]});
done;
# 輸出
echo
printf
|
> file
>>
# 随機數,每次輸出不同
echo "$RANDOM"
# 腳本名稱
$0
# 擷取參數
$1~$n
# 傳遞腳本的參數個數
$#
# 腳本運作的目前程序 id 号
$$
# 用一個單字元串展示所有腳本傳遞的參數
$*
# 顯示最後指令的退出狀态,0 是無錯誤,其他表示有錯誤
$?