Linux Bash程式設計

測試開發小記發表於2021-02-03

Linux系統介紹中,介紹了shell的多個版本,現在的Linux發行版基本都預設使用bash(Bourne Again shell),相容Bourne shell (sh),本文將簡要介紹Bash程式設計語法。

變數

命名規則

  • 只能使用英文字母,數字和下劃線,首個字元不能以數字開頭
  • 中間不能有空格,可以使用下劃線(_)
  • 不能使用標點符號
  • 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)

定義與使用變數

定義變數

your_name="abc"
echo $your_name

拼接字串

your_name="world"
your_name2="hello,$your_name!"
echo $your_name2

陣列

array_name=(value0 value1 value2 value3)
valuen=${array_name[n]} # 陣列取值
array_name[0]=value0 # 賦值

陣列例項:

my_array=(A B "C" D)
echo "第一個元素為: ${my_array[0]}"
my_array[1]=b
echo "陣列的元素為:${my_array[*]}" # 列印所有元素
echo "陣列的元素為:${my_array[@]}"

輸出:

第一個元素為: A
陣列的元素為:A b C D
陣列的元素為:A b C D

只讀變數

a="123"
readonly a

刪除變數

unset variable_name #不能刪除只讀變數

不能刪除只讀變數

# b=10
# readonly b
# echo $b
10
# unset b
-bash: unset: b: cannot unset: readonly variable
#

環境變數

顯示所有環境變數

env
# 或者
printenv

顯示環境變數值

printenv LANG
# 或者
echo $LANG

控制語句

條件分支:if

if定義

if condition
then
    command1
    command2
    ...
    commandN
fi

if和then寫在同一行時,用分號分隔。

if [ 2==2 ]; then 
      echo "true"; 
else 
      echo "false"; 
fi

判斷條件寫法

# 寫法一
test expression
# 寫法二
[ expression ]
# 寫法三
[[ expression ]]
if test 2==2; then echo "true"; fi
if [ 2>1 ]; then echo "true"; fi

if [[ 2>1 ]]; then echo "true"; fi

例項

比較兩個變數的大小

a=10
b=20
if [ $a -eq $b ]; then 
      echo"equal"; 
elif [ $a -lt $b ]; then 
      echo "small"; 
elif [ $a -gt $b ]; then 
      echo "big"; 
fi

迴圈:for

for定義

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

例項

for和do寫在同一行時,用分號分隔。

for Ioop in 1 2 3 4 5
do
    echo "hello"
done

for Ioop in 1 2 3 4 5;do
    echo "hello"
done

迴圈讀取檔案內容並輸出

for i in $(cat test.txt); do echo $i; done

迴圈: while

while定義

while condition
do
    command
done

例項

int=1
while(( $int<=5))
do
    echo $int
    let "int++"
done

迴圈讀取檔案內容並輸出

while read line; do echo $line; done<test.txt

輸出:

test1
test222
test3
test4
test5

read命令

  • read命令是用於從終端或者檔案中讀取輸入的內部命令
  • 讀取整行輸入
  • 每行末尾的換行符不被讀入

read命令使用

從標準輸入讀取輸入並賦值給變數

read var

從標準輸入讀取多個內容

read varl var2 var3

不指定變數(預設賦值給 REPLY)

read

例項

# read a
123
# echo $a
123
# read a b c
1 2 3
# echo $a   
1
# echo $b
2
# echo $c
3
#

預設變數

# read
456
# echo $REPLY
456
#

註釋

# 註釋
# 多行註釋
:<<EOF
內容
.......
EOF

指令碼引數傳遞

  • $0 指令碼名稱
  • $1~$n 獲取第n個引數:
  • $# 傳遞到指令碼的引數個數
  • $$ 指令碼執行的當前程式ID號
  • $* 以一個單字串顯示所有向指令碼傳遞的引數
  • $? 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤

vim param.sh:

#!/bin/bash
echo "指令碼名稱:$0"
echo "指令碼執行的當前程式ID號:$$"
echo "引數個數:$#"
echo "所有引數:$*"
echo "第1個引數:$1"
echo "第10個引數:${10}"
echo "return "$?

執行:

# chmod +x param.sh
# ./param.sh 1 2 3 4 5 6 7 8 9 10 1        
指令碼名稱:./param2.sh
指令碼執行的當前程式ID號:21097
引數個數:11
所有引數:1 2 3 4 5 6 7 8 9 10 1
第1個引數:1
第10個引數:10
return 0
# 

基本運算

bash會把反引號裡面當作一條命令來執行
In:

# echo `date +%y/%m/%d` 
20/12/27
# echo `expr 2 + 2`  
4
# a=10
# b=20
# echo expr $a + $b  
30
# echo $(($a+$b))
30
# echo expr $a - $b
-10
# echo expr $a \* $b
200
# echo expr $b / $a
2
# 
  • % 取餘
  • = 賦值 a=$b 將把變數b的值賦給a
  • == 相等 相同則返回true
  • != 不相等 不相同則返回true
# a=10
# b=20
# echo `expr $b % $a`
0
# echo $[$a == $b] 
0
# echo $[$a != $b]  
1
#
  • -eq 檢測相等
  • -ne 檢測不相等
  • -gt 檢測左邊是否大於右邊
  • -lt 檢測左邊是否小於右邊
  • -ge 檢測左邊是否大於等於右邊
  • -le 檢測左邊是否小於等於右邊

# vim test.sh  
# cat test.sh
#!/bin/bash
a=10
b=20
if [ $a -lt $b ]
then
      echo "equal"
fi
# chmod +x test.sh
# ./test.sh
equal
#

其它例項

記憶體統計

#!/bin/bash
# 記憶體使用百分比
free | sed -n '2p' | gawk 'x = int(( $3 / $2 ) * 100) {print x}' | sed 's/$/%/'

# 統計記憶體
for i in `ps aux | awk '{print $6}' | grep -v 'RSS'`; do
    count=$[$count+$i]
done
echo "$count/kb"
# ./test.sh  
16%
474608/kb

求階乘

vim test.sh

read -p "Enter a number:"
factorial=1
for (( count=1; count<=$REPLY; count++))
do
      factorial=$[ $factorial * $count ]
done
echo "The factorial of $REPLY is $factorial"
# chmod +x test.sh
# ./test.sh 
Enter a number:6
The factorial of 6 is 720
--THE END--

文章標題:Linux Bash程式設計
本文作者:hiyo
本文連結:https://www.cnblogs.com/hiyong/p/14238495.html
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!

相關文章