1. 程式人生 > 其它 >Linux-shell高階進階

Linux-shell高階進階

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

注意事項:

  1. 儘量用雙重 [[ ]] ,而不用 單個的 [ ]
  2. [ 左右都是空格,必須留空格
  3. if 開頭, fi 結尾
  4. 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

注意事項:

  1. -a 即 : and 並且
  2. -o 即: or 或者
  3. 其他的和 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

注意事項:

  1. -z 即 zero 字串長度是 0
  2. -n 即 null 字串長度為0
  3. -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 瓶"