1. 程式人生 > >基本語法掌握(shell 學習第二天)

基本語法掌握(shell 學習第二天)

Shell 傳遞引數

  • 執行 Shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為:$n。n 代表一個數字,1 為執行指令碼的第一個引數,2 為執行指令碼的第二個引數,以此類推……

  • 其中 $0 為執行的檔名

#!/bin/bash

echo "Shell 傳遞引數例項!";
echo "執行的檔名:$0";
echo "第一個引數為:$1";
echo "第二個引數為:$2";
echo "第三個引數為:$3";

執行 及 結果:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 傳遞引數例項!
執行的檔名:./test.sh
第一個引數為:1
第二個引數為:2
第三個引數為:3
引數處理 說明
$# 傳遞到引數的個數
$* 以一個單字串顯示所有向指令碼傳遞的引數。以"$1$2 3... 3... n"的形式輸出所有引數
$$ 指令碼執行的當前程序的ID號
$! 後臺執行的最後一個程序的ID號
[email protected] 和$*不同,以"$1" " 2 " . . .
" 2" ... "
n"輸出
$- 顯示shell使用的當前選項,與set命令功能相同
$? 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤

陣列:

  • 獲取陣列中的所有元素
    使用@ 或 * 可以獲取陣列中的所有元素。
 echo "陣列的元素為: ${my_array[*]}"
 echo "陣列的元素為: ${my_array[@]}"
  • 獲取陣列的長度
    獲取陣列長度的方法與獲取字串長度的方法相同
  echo "陣列元素個數為: ${#my_array[*]}"
echo "陣列元素個數為: ${#my_array[@]}"
  • 注:陣列的值也可以寫入變數。

  • 根據陣列元素索引獲取該陣列元素值時,陣列下標可為變數。

  • 遍歷陣列,在就新手學習的時候注意一下 [ 和 $ 之間要有空格,沒有空格執行會報錯:

  • 提前感受一下遍歷!!!

#!/bin/bash

my_arry=(a b "c","d" abc)
echo "-------FOR迴圈遍歷輸出陣列--------"
for i in ${my_arry[@]};
do
  echo $i
done

echo "-------::::WHILE迴圈輸出 使用 let i++ 自增:::::---------"
j=0
while [ $j -lt ${#my_arry[@]} ]
do
  echo ${my_arry[$j]}
  let j++
done

echo "--------:::WHILE迴圈輸出 使用 let  "n++ "自增: 多了雙引號,其實不用也可以:::---------"
n=0
while [ $n -lt ${#my_arry[@]} ]
do
  echo ${my_arry[$n]}
  let "n++"
done

echo "---------::::WHILE迴圈輸出 使用 let m+=1 自增"
m=0
while [ $m -lt ${#my_arry[@]} ]
do
  echo ${my_arry[$m]}
  let m+=1
done

echo "-------::WHILE迴圈輸出 使用 a=$[$a+1] 自增,個人覺得這種寫法比較麻煩::::----------"
a=0
while [ $a -lt ${#my_arry[@]} ]
do
 echo ${my_arry[$a]}
 a=$[$a+1]
done

結果:

-------FOR迴圈遍歷輸出陣列--------
a
b
c,d
abc
-------::::WHILE迴圈輸出 使用 let i++ 自增:::::---------
a
b
c,d
abc
--------:::WHILE迴圈輸出 使用 let  n++ 自增: 多了雙引號,其實不用也可以:::---------
a
b
c,d
abc
---------::::WHILE迴圈輸出 使用 let m+=1 自增
a
b
c,d
abc
-------::WHILE迴圈輸出 使用 a=1 自增,個人覺得這種寫法比較麻煩::::----------
a
b
c,d
abc

shell基本運算子

  • Shell 和其他程式語言一樣,支援多種運算子,包括:

    • 算數運算子
    • 關係運算符
    • 布林運算子
    • 字串運算子
    • 檔案測試運算子
  • 原生bash不支援簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。

  • expr 是一款表示式計算工具,使用它能完成表示式的求值操作。
    例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '):

  • 算術運算子

在這裡插入圖片描述

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

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

結果:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等於 b

注:

  • 乘號(*)前邊必須加反斜槓()才能實現乘法運算;
  • if…then…fi 是條件語句,後續將會講解。
  • 在 MAC 中 shell 的 expr 語法是:$((表示式)),此處表示式中的 “*” 不需要轉義符號 “” 。
關係運算符

在這裡插入圖片描述

  • 使用 [[ … ]] 條件判斷結構,而不是 [ … ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、< 和 > 操作符能夠正常存在於 [[ ]] 條件判斷結構中,但是如果出現在 [ ] 結構中的話,會報錯。
  1. 進行數值比較時,可以使用 [ expression1 OPexpression2 ],OP 可以為 -gt、-lt、-ge、-le、-eq、-ne 也可以使用 ((expression1 OP expression2)),OP 可以為 >、<、>=、<=、==、!=。這幾個關係運算符都是測試整數表示式 expression1 和 expression2 之間的大小關係。
  2. <、==、!= 也可以進行字串比較。

  3. 進行字串比較時,== 可以使用 = 替代。
  4. == 和 !=進行字串比較時,可以使用 [ string1 OP string2 ] 或者 [[ string1 OP string2 ]] 的形式。
  5. 和 < 進行字串比較時,需要使用[[ string1 OP string2 ]] 或者 [ string1 \OP string2 ]。也就是使用 [] 時,> 和 < 需要使用反斜線轉義。

布林運算子

在這裡插入圖片描述

邏輯運算子

在這裡插入圖片描述

字元運算子

在這裡插入圖片描述

檔案測試運算子

在這裡插入圖片描述

加法幾種寫法

Shell 相加目前發現有 3 種寫法:
1.

a=10
b=20
c=`expr ${a} + ${b}`
echo "$c"
c=$[ `expr 10 + 20` ]
echo "$c"
c=$[ 10 + 20 ]
echo "$c"
  1. val=$(expr 10 + 20)
a=10
b=20
c=$(($a+$b))

初學者推薦第一種寫法,雖然看著複雜,但邏輯清晰,不易混淆。