1. 程式人生 > >Linux的基本操作——Shell程式設計

Linux的基本操作——Shell程式設計

一、基本介紹

        Shell是使用者與核心進行互動操作的一種介面,目前最流行的Shell稱為bash Shell。Shell也是一門程式語言<解釋型的程式語言>,即shell指令碼。一個系統可以存在多個shell,可以通過cat /etc/shells命令檢視系統中安裝的shell,不同的shell可能支援的命令語法是不相同的。

二、Shell指令碼的執行方式

  • 第一種:輸入指令碼的絕對路徑或相對路徑,首先要賦予+x許可權
 chmod +x helloWorld.sh
 /root/helloWorld.sh
 ./helloWorld.sh
  • 第二種:bash或sh +指令碼
 sh /root/helloWorld.sh
 sh helloWorld.sh

第三種:在指令碼的路徑前再加". "

 . /root/helloWorld.sh
 . ./helloWorld.sh

區別:第一種和第二種會新開一個bash,不同bash中的變數無法共享,第三種,就是在同一個shell程序中執行。

三、Shell中的變數

1、變數定義

        Linux Shell中的變數分為“系統變數”和“使用者自定義變數”,可以通過set命令檢視那行系統變數。系統變數:$HOME、$PWD、$SHELL、$USER等等。對應使用者自定義變數語法為:

變數=值 (例如STR=abc,如果值中間沒有空格可以不加“”)

注意:

  • 等號兩側不能有空格
  • 變數名稱一般習慣為大寫
  • 雙引號和單引號有區別,雙引號僅將空格脫意,單引號會將所有特殊字元脫意,例如:
A="fell"
B="hello $A" 
echo $B   #==>'hello fell'
B='hello $A' 
echo $B   #==>'hello $A'
  • unset A 撤銷變數 A
  • readonly B=2 宣告靜態的變數 B=2 ,不能 unset
  • export 變數名 可把變數提升為全域性環境變數,可供其他shell程式使用

2、將命令的返回值賦給變數

  • A=`ls -la` 反引號,執行裡面的命令,並把結果返回給變數A
  • A=$(ls -la) 等價於反引號

3、Shell中的特殊變數

  • $? 表示上一個命令退出的狀態
  • $$ 表示當前程序編號
  • $0 表示當前指令碼名稱
  • $n 表示n位置的輸入引數(n代表數字,n>=1)
  • $# 表示引數的個數,常用於迴圈
  • $*和[email protected] 都表示引數列表,他們的區別為:$* 和 [email protected] 都表示傳遞給函式或指令碼的所有引數,不被雙引號" "包含時,都以$1 $2 … $n 的形式輸出所有引數。當它們被雙引號" "包含時,"$*" 會將所有的引數作為一個整體,以"$1 $2 … $n"的形式輸出所有引數;"[email protected]" 會將各個引數分開,以"$1" "$2" … "$n" 的形式輸出所有引數

4、運算子

        格式為 expr m + n 或$((m+n)) 注意expr運算子間要有空格,例如計算(2 +3 )×4 的值:

1 .分步計算

S=`expr 2 + 3`
expr $S \* 4

2.一步完成計算

 expr `expr 2 + 3 ` \* 4
 echo `expr \`expr 2 + 3\` \* 4`
 ##或
 $(((2+3)*4))

四、邏輯語句

1、For迴圈

第一種:

for N in 1 2 3
do
 echo $N
done

for N in 1 2 3; do echo $N; done

for N in {1..3}; do echo $N; done

第二種:

for ((i = 0; i <= 5; i++))
do
 echo "welcome $i times"
done

for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

2、While迴圈

第一種:

while expression
do
command
…
done

第二種:

i=1
while ((i<=3))
do
  echo $i
  let i++
done

3、case語句

格式為:

case $1 in
start)
 echo "starting"
 ;;
stop)
 echo "stoping"
 ;;
*)
 echo "Usage: {start|stop} “
esac

4、If判斷

語法格式為:

if condition 
then 
    statements 
[elif condition
     then statements. ..] 
[else
     statements ]
fi

if例子如下:

#!/bin/bash
read -p "please input your name:" NAME
#printf '%s\n' $NAME
if [ $NAME = root ]
        then
                echo "hello ${NAME},  welcome !"
        elif [ $NAME = itcast ]
                then
                        echo "hello ${NAME},  welcome !"
        else
                echo "SB, get out here !"
fi

其中條件語句[ condition ] (注意condition前後要有空格),非空返回true,可使用$?驗證(0為true,>1為false),空返回false([ ]),下面的例子類似於三元運算子, 條件滿足,執行後面的語句:

[ condition ] && echo OK || echo notok

附:常用判斷條件

  • = 字串比較
  • -lt 小於
  • -le 小於等於
  • -eq 等於
  • -gt 大於
  • -ge 大於等於
  • -ne 不等於
  • -r 有讀的許可權
  • -w 有寫的許可權
  • -x 有執行的許可權
  • -f 檔案存在並且是一個常規的檔案
  • -s 檔案存在且不為空
  • -d 檔案存在並是一個目錄
  • -b檔案存在並且是一個塊裝置
  • -L 檔案存在並且是一個連結

五、Shell自定義函式

語法如下:

 [ function ] funname [()]
{
    action;
    [return int;]
}
​
function start()  / function start / start()

​1.必須在呼叫函式地方之前,先宣告函式,shell指令碼是逐行執行。不會像其它語言一樣先預編譯

2.函式返回值,只能通過$? 系統變數獲得,可以顯示加:return 返回,如果不加,將以最後一條命令執行結果,作為返回值。 return後跟數值n(0-255)

六、雜記

1、指令碼除錯

sh -vx helloWorld.sh

或者在指令碼中增加set -x

2、read命令

read -p(提示語句)-n(字元個數) -t(等待時間) 

 read -p "please input your name: " NAME

使用示例: