shell指令碼學習
Shell指令碼是什麼
一個Shell指令碼是一個文字檔案,包含一個或多個命令。
作為系統管理員,我們經常需要使用多個命令來完成一項任務,我們可以新增這些命令在一個文字檔案(Shell指令碼)來完成這些日常工作任務。
什麼是預設登入Shell,如何改變指定使用者的登入Shell
在Linux作業系統,“/bin/bash”是預設登陸shell,是在建立使用者時分配的。使用chsh命令可改變預設的shell
可在Shell指令碼中使用哪些型別的變數
兩種型別的變數:
系統定義變數
使用者定義變數
“set”命令或 echo $變數名 可檢視變數值
特殊變數
test.sh檔案中
執行結果:
“#!/bin/bash”的作用
這是shell指令碼的第一行,成為(shebang)行,這裡#叫做hash,!叫做bang
它的意思是命令通過/bin/bash來執行
如何使指令碼可執行
chmod u+x test.sh
如何加入註釋
註釋以#開頭
如何取消變數或變數賦值
unset 變數名
如何讓shell就指令碼得到來自終端的輸入
read命令得到使用者的輸入並置於你給出的變數中
if
if [ 條件 ];then
命令1
命令2
...
elif [ 條件 ];then
命令1
命令2
...
else
if [ 條件 ];then
命令1
命令2
...
else
命令1
命令2
...
fi
fi
test.sh:
printf"PleaseEnterYourName:" readname printf"PleaseEnterYourscore:" readscore #[[$score-lt90]]||{ [$score-lt90]||{ echo"hi,$name,youareverygood!" } if[$score-ge90];then echo"hi${name},youareverygood!" elif[$score-ge80-a$score-lt90];then echo"hi$name,youaregood!" elif[$score-ge60-a$score-lt80];then echo"hi$name,youarenormal!" else echo"whoareyou??" fi
執行結果:
for
for 變數 in 迴圈列表
do
命令1
命令2
...
done
test.sh:
foriin{a..z} do if[-b/dev/sd${i}];then echo"yes!,diskid/dev/sd${i}" fi done
執行結果:
test.sh:
sum=0 foriin{1..100} do letsum+=i done echo"$sum"
執行結果:
5050
test.sh:
sum=0 for((i=0;i<=100;i++)) do letsum+=i done echo$sum
執行結果:
5050
while
while [ 條件 ]
do
命令
done
test.sh:
while[$#-gt0] do echo$1 shift1 done
執行結果:
do-while
do
{
命令
}while(條件)
case
case 變數 in
值1)
命令
;;
值2)
命令
;;
*)
命令
;;
esac
test.sh:
case"$1"in start|-s|-S) echo"yourcmdisstart" ;; st[oO]p) echo"yourcmdisstop" ;; restart) echo"yourcmdisrestart" ;; *) echo"yourcmdisdefault" ;; esac
執行結果:
until
test.sh:
i=0 sum=0 until[$i-gt100] do letsum+=i leti++ done echo$sum
執行結果:
5050
shell指令碼中“$?”標記的用途是什麼
在寫一個shell指令碼時,如果你想要檢查前一條命令是否執行成功,“$?”可以來檢查前一條命令的結束狀態,0為成功
在shell指令碼中如何比較兩個數字
可用test 或[ 測試,如:
#!/bin/bash x=10 y=20 if[x-gty];then echo"x>y" else echo"y<=x" fi
在shell指令碼中如何比較兩個字串
test.sh:
str="helloWORLD" ["X$str"=="Xhelloworld"-o"X$str"=="XhelloWORLD"] echo$? ["X$str"=="XhelloWORLD"-a-f"test.sh"-a-d"dir"-a!"Xstr"=="Xhellobit"] echo$?
結果:
test.sh:
readstr ["X$str"=="X"] echo$? [-z"$str"] echo$? [!-z"$str"] echo$? [-n"$str"] echo$? [!-n"$str"] echo$? [!"X$str"!="Xhello"] echo$?
結果:
在shell指令碼中,如何測試檔案
test命令 或[命令 ,舉例如下:
[ -d 檔名 ]
[ -d "$str" ]
其中-d表示如果檔案存在且是目錄,返回true,當然也可以是別的選項,不止-d
-e表示如果檔案存在,返回true
-f表示如果檔案存在且是普通檔案,返回true
-r表示如果檔案存在並且可讀,返回true
-s表示如果檔案存在且不為空,返回true
-w表示如果檔案存在並且可寫,返回true
-x表示如果檔案存在並且可執行,返回true
如何執行算術運算
兩種方法:
1、使用expr命令
2、$[ 表示式 ],如:
如何將標準輸出和錯誤輸出重定向到同一位置
1、如 ls /usr/share/doc > out.txt 2>&1
2、如 ls /usr/share/doc &> out.txt
在shell指令碼中如何定義函式
函式是擁有名字的程式碼塊。當我們定義程式碼塊,我們就可以在我們的指令碼呼叫函式名字,該程式碼塊就會被執行。
function 函式名(){
命令
return 0
}
如何除錯shell指令碼
1、使用‘-x’引數(bash -x test.sh)
2、使用 '-nv'引數(bash -nv test.sh)
-n,讀一遍指令碼中的命令但不執行,用於檢查指令碼中的語法錯誤。
-v,一邊執行指令碼,一邊將執行過的指令碼命令列印到標準錯誤輸出。
-x,提供跟蹤執行資訊,將執行的每一條命令和結果依次打印出來。
除錯方法:
(1) 命令列提供引數
(2) 指令碼開頭提供引數
#! /bin/bash -x
(3) 指令碼中用set命令啟用或禁用除錯選項
#!/bin/bash
foo() { echo "Shell bash function iscalled"; }
echo "---start--"
set -v
foo
set +v
echo"---end--"
set -v和set+v分別表示啟用和禁用-x引數,這樣可以只對指令碼中的某一段進行跟蹤除錯。
下面有三段程式碼
1.
#!/bin/sh
cd ..
ls
其中cd是Shell的內建命令,ls不是Shell的內建命令(可以用which ls檢視)
則Shell執行此指令碼的過程如下:
互動Shell(bash)fork/exec一個子Shell(sh)用於執行指令碼,父程序bash等待子程序sh終止。
sh讀取指令碼中的cd..命令,呼叫相應的函式執行內建命令,改變當前工作目錄為上一級目錄。
sh讀取指令碼中的ls命令,fork/exec這個程式,列出當前工作目錄下的檔案,sh等待ls終止。
ls終止後,sh繼續執行,讀到指令碼檔案末尾,sh終止。
sh終止後,bash繼續執行,列印提示符等待使用者輸入。
2.
VAR=45
echo $(($VAR/3))
echo $((16#2a))
3.
DATA=`date`
echo ${DATA}
echo $DATA
DATA=$(date)
echo $DATA
echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
《完》
轉載於:https://blog.51cto.com/lingdandan/1789336