天天看點

玩轉shell-bash shell程式設計學習(進階篇)

文章目錄

  • 前言
  • 括号規則
  • 變量
  • 作用域
  • 運算符
  • 函數
  • 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 是無錯誤,其他表示有錯誤
$?
           

繼續閱讀