1. 程式人生 > >linux下的shell指令碼

linux下的shell指令碼

Linux下的shell指令碼

Shell是一種指令碼語言,那麼,就必須有直譯器來執行這些指令碼,常見的指令碼直譯器有:

bash:是Linux標準預設的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。

sh: 由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準預設的shell。
另外還有:ash、 csh、 ksh等。

關於註釋的問題: 在shell中使用#進行註釋,注意,sh裡面沒有多行註釋,只能每一行加一個#號

  • shell指令碼格式以 #!/bin/bash 開頭
#!/bin/bash
echo "helloworld"
  • shell執行方式
首先賦予執行許可權
chmod 777 helloworld.sh

./helloworld.sh
/opt/helloworld.sh
sh ./helloworld.sh
bash ./helloworld.sh
bash opt/helloworld.sh
sh ./helloworld.sh
sh /opt/helloworld.sh
  • shell變數 變數分為“系統變數”和“使用者自定義變數”,可以通過set命令檢視系統變數 系統變數:$HOME、$PWD,$SHELL、$USER等等
[[email protected]
opt]# echo $HOME /root [[email protected] opt]# echo $PWD /opt [[email protected] opt]# echo $USER root [[email protected] opt]# echo $SHELL /bin/bash

顯示當前shell中的所有變數:set

[[email protected]ost ~]$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=141
....

定義變數:變數=值(=等號左右沒有空格)

[[email protected] ~]$ A=1  
[[email protected] ~]$ echo $A
1

撤銷變數: unset 變數

[[email protected] ~]$ unset A
[[email protected] ~]$ echo $A

宣告靜態變數: readonly 變數=值

[[email protected] ~]$ readonly A=1
[[email protected] ~]$ A=2
-bash: A: readonly variable
[[email protected] ~]$ echo $A
1
[[email protected] ~]$ unset A
-bash: unset: A: cannot unset: readonly variable
定義變數規則:
變數名稱可以由字母、數字和下劃線組成,但不能以數字開頭
等號兩側不能有空格
變數名稱一般習慣為大寫

將命令的返回值賦給變數:

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

位置引數變數

$n (n為數字,$0代表命令本身,$1-$9代表第一到第九個引數,十個引數需要大括號,如${10})
$* (這個變數代表命令列中所有的引數,$*把所有的引數看成一個整體)
[email protected] (這個變數代表命令列中所有的引數,[email protected]把每個引數區分對待)
$# (這個變數代表命令列中所有引數的個數)
#!/bin/bash

echo "$1"
echo "$2"
echo "$*"
echo "[email protected]"
echo "$#"
[[email protected] opt]# ./p.sh  10 20
10
20
10 20
10 20
2

預定義變數

$$ (當前程序的程序號:PID)
S! (後臺執行的最後一個程序的PID)
$? (最後一次執行的命令的返回狀態。
如果這個變數的值為0證明上一個命令正確執行,
如果非0,則上一個命令執行不正確)
#!/bin/bash
echo "$$"
./helloworld.sh & 後臺程序
echo "S!" #列印後臺程序
echo "$?"

[[email protected] opt]# ./d.sh 
1817
1818
0

運算子

$((運算子))
[[email protected] ~]# A=$((2+3))  
[[email protected] ~]# echo $A
5

$[運算子]
[[email protected] ~]# A=$[2+8]                   
[[email protected] ~]# echo $A
10

expr m + n 運算子之間有空格
[[email protected] ~]# expr 2 + 5  
7
expr m - n 運算子之間有空格
[[email protected] ~]# expr 2 - 5                   
-3
(2+3)*4示例
A=$[(2+3)*4]
[[email protected] ~]# A=$[(2+1)*5] #注意沒空格
[[email protected] ~]# echo $A
15

[[email protected] ~]# expr `expr 2 + 5` \* 5  #注意有空格
35

推薦使用 $[運算子]

判斷

1.[ condition ] 注意condition前後要有空格
案例
[ hello ] 返回true
[] 返回false

[condition]&&echo OK || echo notok 條件滿足,執行後面的語句

兩個整數之間比較
=字串比較
-lt 小於
-le 小於等於
-eq 等於
-gt 大於
-ge 大於等於
-ne 不等於

按照檔案許可權判斷
-r 有讀的許可權
-w 有寫的許可權
-x 有執行的許可權

按照檔案型別進行判斷
-f 檔案存在並且是一個常規的檔案
-e 檔案存在並且是一個常規的檔案
-d 檔案存在並是一個目錄

例子
[ 23 -ge 22 ]
[ -w student.txt ]
[ -e /root/install.sh]

if判斷

if[條件判斷是];then
 程式
fi

if[條件判斷是]
 then
   程式
fi

注意 [條件判斷式],中括號和條件判斷式之間有空格

#!/bin/bash

if [ $1 -eq "123" ]
        then
        echo "123"
elif [ $1 -eq "456" ]
        then
        echo "456"
fi

[[email protected] opt]# ./if.sh  123
123
[[email protected] opt]# ./if.sh  456
456

case語句

 case $變數名 in
 "值1")
  如果變數的值等於值1,則執行程式1
  ;;
  "值2")
  如果變數的值等於值2,則執行程式2
  ;;
  ...其他分支...
  *)
  ;;
  esac

示例:輸入1輸出1;輸入2,輸出2,輸入其他,輸出other  
#!/bin/bash

case $1 in
"1")
        echo "1"
;;

"2")    echo "2"
;;

*)
        echo "other"
;;
esac

[[email protected] opt]# ./cash.sh  1
1
[[email protected] opt]# ./cash.sh  2
2
[[email protected] opt]# ./cash.sh  3
other

迴圈

1)for 變數 in 值1 值2 值3 ...
  do
    程式
  done
  
#!/bin/bash

for i in "$*"
do
    echo "$i"
done

for j in "[email protected]"
do
        echo "$j"
done

執行
[[email protected] opt]# ./for1.sh  2 4 6 8
2 4 6 8
2
4
6
8

2)for((初始值;迴圈控制條件;變數變化))
  do
    程式
  done

  1加到100
#!/bin/bash

s=0
for((i=1; i<=100; i++))
do
        s=$[$s+$i]
done

echo $s

./for2.sh 
5050

3)while

while[ 條件判斷式 ]
 do
   程式
 done
 
#!/bin/bash

s=0
i=0
while [ $i -le 100 ]
do
   s=$[$s+$i]
   i=$[$i+1]
done

echo "$s"

./while.sh 
5050

read讀取控制檯的輸入

read(選項)(引數)
選項 
-p:指定讀取值時的提示符
-t:指定讀取值時等待的時間(秒)

[[email protected] opt]# read -p "input your name " NAME
input your name xiaoming
[[email protected] opt]# echo $NAME

read -t 3 -p "input your name " NAME #3秒內沒輸入 NAME的值為null

自定義函式

[ function ] funname[()]
{
		Action;
		[return int;]
}

funname

注意:
(1) 必須在呼叫函式地方之前,先宣告函式
(2) 函式返回值,只能通過$?系統變數獲得,可以顯示加:
return返回,如果不加,將以最後一條命令執行結果,作為返回值
return後跟數值n

#!/bin/bash

function sum(){

  s=0
  s=$[$1+$2]
  echo "$s"
}

read -p "input num1 " NUM1
read -p "input num2 " NUM2

sum $NUM1 $NUM2;

[[email protected] opt]# ./function.sh 
input num1 1
input num2 4
5