Linux-shell高階進階
阿新 • • 發佈:2022-05-19
Shell高階進階
算數符的分類
算數運算子
運算子 | 說明 | 舉例 |
---|---|---|
+ | 加法 | 'expr $a + $b' 為 30。 |
- | 減法 | 'expr $a-$b'結果為-10。 |
* | 乘法 | 'expr $a * $b' 結果為 200。 |
/ | 除法 | 'expr$b/$a'結果為2。 |
% | 取餘 | 'expr $b % $a' 結果為0。 |
= | 賦值 | a=$b將把變數b的值賦給a |
== | 相等,用於比較兩個數字,相同返回true | [$a == $b]返回false。 |
!= | 不相等,用於比較兩個數字,不相同返回true | [$a != $b]返回true。 |
關係運算符
運算子 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回true | [$a -eq $b ]返回 false。 |
-ne | 檢測兩個數是否不相等,不相等返回true | [$a -ne $b ]返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,如果是,返回true | [$a -gt $b ]返回 false. |
-lt | 檢測左邊的數是否小於右邊的,如果是,返回true | [$a -It $b ]返回 true。 |
-ge | 檢測左邊的數是否大於等於右邊的,如果是,返回true | [$a -ge $b ]返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,如果是,返回true | [$a -le $b ]返回 true. |
布林運算子
運算子 | 說明 | 舉例 |
---|---|---|
! | 非運算,表示式為true則返回false,否則退回true。 | [! false ]返回 true。 |
-o | 或運算,有一個表示式為true則返回true。 | [$a -It 20 -o $b -gt100 ]返回 true。 |
-a | 與運算,兩個表示式都為true才返回true. | [$a -It 20 -a $b -gt100 J 返回 false。 |
字串運算子
運算子 | 說明 | 舉例 |
---|---|---|
&& | 邏輯的AND | [[$a -It 100 && $b-gt 100 ]]返回 false |
|| | 邏輯的OR | [[$a -It 100 || $b -gt 100 ]]返回 true |
檔案測試運算子
運算子 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字串是否相等,相等返回true。 | [$a = $b ]返回 false。 |
!= | 檢測兩個字串是否相等,不相等返回true。 | [$a != $b ]返回 true。 |
-z | 檢測字串長度是否為0,為0返回true。 | [-z $a ]返回 false。 |
-n | 檢測字串長度是否不為不為0返回true。 | [n "$a"]返回 true. |
$ | 檢測字串是否為空,不為空返回trueo | [$a]返回 true. |
3.1.1 算數運算子
expr 是一款表示式計算工具,使用它能完成表示式的求值操作。
#!/bin/bash
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
注意事項:
1.在運算式中必須加飄號
2.運算式前面加上 expr 關鍵字
3.1.2 關係運算符
關係運算符只支援數字,不支援字串,除非字串的值是數字。
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等於 b"
else
echo "$a -eq $b: a 不等於 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等於 b"
else
echo "$a -ne $b : a 等於 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大於 b"
else
echo "$a -gt $b: a 不大於 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小於 b"
else
echo "$a -lt $b: a 不小於 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大於或等於 b"
else
echo "$a -ge $b: a 小於 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小於或等於 b"
else
echo "$a -le $b: a 大於 b"
fi
注意事項:
- 儘量用雙重 [[ ]] ,而不用 單個的 [ ]
- [ 左右都是空格,必須留空格
- if 開頭, fi 結尾
- if 下面 緊跟 then 而 else 後面不需要
執行結果:
3.1.3布林運算子
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等於 b"
else
echo "$a == $b: a 等於 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小於 100 且 $b 大於 15 : 返回 true"
else
echo "$a 小於 100 且 $b 大於 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小於 100 或 $b 大於 100 : 返回 true"
else
echo "$a 小於 100 或 $b 大於 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小於 5 或 $b 大於 100 : 返回 true"
else
echo "$a 小於 5 或 $b 大於 100 : 返回 false"
fi
注意事項:
- -a 即 : and 並且
- -o 即: or 或者
- 其他的和 java語法差不多
執行結果
3.1.4 邏輯運算子
#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true" elseecho "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true" elseecho "返回 false"
fi
3.1.5 字串運算子
#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b : a 等於 b"
else
echo "$a = $b: a 不等於 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等於 b"
else
echo "$a != $b: a 等於 b"
fi
if [ -z $a ]
then
echo "-z $a : 字串長度為 0"
else
echo "-z $a : 字串長度不為 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字串長度不為 0"
else
echo "-n $a : 字串長度為 0"
fi
if [ $a ]
then
echo "$a : 字串不為空"
else
echo "$a : 字串為空"
fi
注意事項:
- -z 即 zero 字串長度是 0
- -n 即 null 字串長度為0
- -a 即 ampty 字串是否為空
執行結果
3.1.6 檔案測試運算子
#!/bin/bash
file="/var/node/test.sh"
if [ -r $file ]
then
echo "檔案可讀"
else
echo "檔案不可讀"
fi
if [ -w $file ]
then
echo "檔案可寫"
else
echo "檔案不可寫"
fi
if [ -x $file ]
then
echo "檔案可執行"
else
echo "檔案不可執行"
fi
if [ -f $file ]
then
echo "檔案為普通檔案"
else
echo "檔案為特殊檔案"
fi
if [ -d $file ]
then
echo "檔案是個目錄"
else
echo "檔案不是個目錄"
fi
if [ -s $file ]
then
echo "檔案不為空"
else
echo "檔案為空"
fi
執行結果:
3.2 echo列印資料
Shell的echo指令用於字串的輸出。
## 顯示普通字串
echo "Hello World"
## 顯示轉義字元
echo "\"Hello World\""
## 顯示變數
name="zhangsan"
echo "$name Hello World"
## 顯示換行
echo -e "OK! \n"
echo "Hello World"
## 顯示不換行
echo -e "OK! \c"
echo "Hello World"
## 顯示結果定向至檔案
echo "Hello World" > myfile
## 原樣輸出字串
echo '$name\"'
## 顯示命令執行結果
echo `date`
執行結果:
3.4 Shell流程控制
3.4.1 if
if conditionl
then
commandl
elif condition2
then
command2
else
commandN
fi
#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
echo "a 等於 b"
elif [ $a -gt $b ]
then
echo "a 大於 b"
elif [ $a -lt $b ]
then
echo "a 小於 bn"
else
echo "沒有符合的條件"
fi
Shell case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹
配的命令。
case 值 in
模式1)
command1
command2
...
commandN ;;
模式2)
command1
command2
...
commandN
;;
esac
echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字為:'
read num
case $num in
1) echo '你選擇了 1'
;;
2) echo '你選擇了 2'
;;
3) echo '你選擇了 3'
;;
4) echo '你選擇了 4'
;;
*) echo '你沒有輸入 1 到 4 之間的數字'
;;
esac
3.4.2 for
當變數值在列表裡,for迴圈即執行一次所有命令,使用變數名獲取列表中的當前取值。
命令可為田可有效的shell命令和語句。in列表可以包含替換、字串和檔名。
in列表是可選的,如果不用它,for迴圈使用命令列的位置引數。
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
for str in 'This is a string','hello moto'
do
echo $str
done
3.4.3 while迴圈
while迴圈用於不斷執行一系列命令,也用於從輸入檔案中讀取資料;命令通常為測試條件。
while condition
do
command
done
# Bash let 命令,它用於執行一個或多個表示式,變數計算中不需要加上 $ 來表示變數
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
# 無限迴圈
while true
do
command
done
3.4.4 break
break命令允許跳出所有迴圈(終止執行後面的所有迴圈)。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束"
break
;;
esac
done
3.4.5 continue
continue命令不會跳出所有迴圈,僅僅跳出當前迴圈。
#!/bin/bash
while :
do
echo -n "輸入 1 到 5 之間的數字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你輸入的數字為 $aNum!"
;;
*) echo "你輸入的數字不是 1 到 5 之間的!"
continue
echo "遊戲結束"
;;
esac
done
3.5 Shell函式
linux shell 可以使用者定義函式,然後在shell指令碼中可以隨便呼叫。
可以帶function fun() 定義,也可以直接fun() 定義,不帶任何引數。
引數返回,可以顯示加:return 返回,如果不加,將以最後一條命令執行結果,作為返回值。return後跟數值n(0-255
#!/bin/bash
## 第一個函式------------------------------
demoFun(){
echo "這是我的第一個 shell 函式!"
}
echo "-----函式開始執行-----"
demoFun
echo "-----函式執行完畢-----"
## 函式返回值------------------------------
funWithReturn(){
echo "這個函式會對輸入的兩個數字進行相加運算..."
echo "輸入第一個數字: "
read aNum
echo "輸入第二個數字: "
read anotherNum
echo "兩個數字分別為 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
# 函式返回值在呼叫該函式後通過 $? 來獲得。
echo "輸入的兩個數字之和為 $? !"
## 函式引數------------------------------
funWithParam(){
echo "第一個引數為 $1 !"
echo "第二個引數為 $2 !"
echo "第十個引數為 $10 !"
echo "第十個引數為 ${10} !"
echo "第十一個引數為 ${11} !"
echo "引數總數有 $# 個!"
echo "作為一個字串輸出所有引數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9
小練習一:
#1.根據考試成績輸出對應的禮物,90分以上爸爸給買電腦,80分以上爸爸給買手機, 60分以上爸爸請吃一頓大餐,60分以下爸爸給買學習資料。
要求:該題使用多重if完成
echo "請輸入你的成績:"
read gread
if [ $gread -ge 90 ]
then
echo "爸爸給你買個電腦吧!"
elif [ $gread -ge 80 ]
then
echo "爸爸給你買個手機吧!"
elif [ $gread -ge 60 ]
then
echo "爸爸請你吃大餐吧!"
elif [ $gread -le 60 -a $gread -ge 0 ]
then
echo "爸爸獎勵你一套學習資料!"
else
echo "成績不合法!"
fi
小練習二:
#2.輸入一批整數,使用迴圈求出最大值與最小值,輸入0時結束。
#! /bin/bash
#輸入一批整數,使用迴圈求出最大值與最小值,輸入0時結束。
max=0
min=0
while :
do
echo -e "請輸入一個整數:"
read number
if [[ $number -eq 0 ]]
then
break
fi
if [[ $number -ge $max || $max -eq 0 ]]
then
max=$number
fi
if [[ $number -le $min || $min -eq 0 ]]
then
min=$number
fi
done
echo "the max number is $max"
echo "the min number is $min"
小練習三:
#3.給20塊錢買可樂,每瓶可樂3塊錢,喝完之後退瓶子可以換回1塊錢,問最多可以喝到多少瓶可樂。
#! /bin/bash
money=20
count=0
while [[ $money -ge 3 ]]
do
money=`expr $money - 3`
count=`expr $count + 1`
money=`expr $money + 1`
done
echo "最多可以喝到 $count 瓶"