linux下的shell指令碼
阿新 • • 發佈:2018-12-11
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