1. 程式人生 > 實用技巧 >shell指令碼學習

shell指令碼學習

Shell指令碼是什麼

一個Shell指令碼是一個文字檔案,包含一個或多個命令。

作為系統管理員,我們經常需要使用多個命令來完成一項任務,我們可以新增這些命令在一個文字檔案(Shell指令碼)來完成這些日常工作任務。


什麼是預設登入Shell,如何改變指定使用者的登入Shell

在Linux作業系統,“/bin/bash”是預設登陸shell,是在建立使用者時分配的。使用chsh命令可改變預設的shell

wKiom1df-g7CsjO3AAAbWQ0IGJA606.png


可在Shell指令碼中使用哪些型別的變數

兩種型別的變數:

系統定義變數

使用者定義變數

“set”命令或 echo $變數名 可檢視變數值


特殊變數

test.sh檔案中

wKiom1dgCaGhGwo0AAAZGLtj_xo609.png

執行結果:

wKioL1dgComQbQxhAAA1Vn6Ii×××9.png


“#!/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

執行結果:

wKiom1dgD-KxVG8NAAB8Rx0_50g679.png


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

執行結果:

wKiom1dgEH3SZSWYAAAO3y2ZqHk099.png

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

執行結果:

wKiom1dgE2bTT3vwAAAXPmvNp3s379.png


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

執行結果:

wKiom1dgERLywbpGAAAxeeMoEno499.png


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$?

結果:

wKioL1dgECHz4x1uAAAM6AmTcjk647.png

test.sh:

readstr

["X$str"=="X"]
echo$?
[-z"$str"]
echo$?
[!-z"$str"]
echo$?
[-n"$str"]
echo$?
[!-n"$str"]
echo$?

[!"X$str"!="Xhello"]
echo$?

結果:

wKioL1dgDxDjtCX4AAAh-lOBXbM473.png


在shell指令碼中,如何測試檔案

test命令 或[命令 ,舉例如下:


wKioL1dgA0Xyhv4HAAAVXIu8NVA177.png

[ -d 檔名 ]

[ -d "$str" ]

其中-d表示如果檔案存在且是目錄,返回true,當然也可以是別的選項,不止-d

-e表示如果檔案存在,返回true

-f表示如果檔案存在且是普通檔案,返回true

-r表示如果檔案存在並且可讀,返回true

-s表示如果檔案存在且不為空,返回true

-w表示如果檔案存在並且可寫,返回true

-x表示如果檔案存在並且可執行,返回true


如何執行算術運算

兩種方法:

1、使用expr命令

wKioL1dgB33TU_5xAAAx9CT0qCw004.png

2、$[ 表示式 ],如:

wKioL1dgByWj-Ns8AAAWdn2M9SA058.png



如何將標準輸出和錯誤輸出重定向到同一位置

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