1. 程式人生 > 實用技巧 >學習shell指令碼遇到的小知識!

學習shell指令碼遇到的小知識!

>>> hot3.png

首先說一下shell指令碼的一些規則:

變數在linux裡面分為兩種,1:臨時變數(使用者自定義變數、位置變數). 2:永久變數(環境變數)

shell中使用者自定義的變數的名字由字母或下劃線開頭!自定義變數必須是 字母 數字 下劃線組成,並且區分大小寫,變數名字的長度沒有限制。

在使用自定義變數的時候前面需要加上"$"符號. (一般自定義的變數名用大寫)。

變數賦值的方法
變數名=賦值 例子:NUM=100 (使用變數的時候$NUM,變數賦值的時候等號兩邊沒有空格).

將一個命令的結果賦值給變數的2個方法
TIME=`date` 這個符號"`"不是單引號哦!


TIME=$(date)

如果把多個字元賦值給一個變數,需要用""或''把值引起來!(單引號裡面如果還有定義的變數會當作字元輸出!)



1. 執行shell指令碼的時候加上 -x ,執行指令碼時會把過程列出來!(有利於我這種新手學習)

sh -x shell (./shell 也可以執行shell指令碼 但是沒有-x引數)

2. 傳的值的個數大於 read 定義的接受變數的時候會把多餘的值都給最後一個變數!!

4. 在shell腳本里面 執行一條輸出的命令(pgrep mysqld)怎麼吧輸出的結果作為值賦給變數?

web=$(/usr/bin/pgrep mysqld) #可以用 變數=$(命令) 和 變數=`命令` 來吧命令執行的結果賦給變數


if [ "$web" = "" ]
then
/etc/init.d/mysql start
fi

5.檢視某個命令所在的位置可以用 whereis /which/type 三個命令來檢視


6.awk命令的應用

作用:分段提取! (一行為單位來進行分段)

awk -F [分隔符] '條件 動作' /物件 (如果不指定分隔符預設會用空格作為分隔符!)

例: awk -F : '$3==0 {print $1}' /etc/passwd

例: awk -F : '$1 == "root" {print $1} ' /etc/passwd

# -F : 用:分割passwd每行的內容 ($1 指第一段內容 $2 指第二段內容$n 指第n段內容 $NF 最後一段內容)

# ' 匹配 動作' 單引號裡面寫的是 匹配命令和列印動作 匹配$3==0 第三段等於0 列印{print $1} 列印第一段內容 ($3 == 0 匹配出行 在打印出這些行的第一段內容 )

7.位置變數的學習!

概念:shell在解釋執行使用者命令時,將命令的第一個部分作為命令名,其它部分作為引數.由出現在命令上的位置確定的引數成為位置引數! 看個例子吧!!

ls -l file1 file2 file3 file4

$0 是這個程式的命令名,即 ls -l $1是第一個位置引數代表 file1 $2是第二位置引數代表file2 以此類推最大到$9

例項:

[[email protected] /]# sh autobak.sh /etc (autobak.sh指令碼那內容如上!!)

用上面的命令執行指令碼autobak.sh時, 命令sh autobak.sh 就是位置引數$0. 引數/etc 就是位置引數$1.

我的理解就是在執行指令碼的時候傳進去了一個引數(也可以是多個),在腳本里面直接使用位值變數($1 $2 $3 等)代替具體的引數(/etc 等),這樣增強了指令碼的可用性也簡化了指令碼!

8. shell指令碼中一些特殊的變數!

$? :代表上一個命令的返回值,返回的值都是數字.(如果上一個命令執行成功返回0,執行不成功是其它的數字)

$$ :代表這個程式的PID.

$* :代表這個程式的所有引數.

$# :代表這個程式的引數的個數.

$! :代表執行的上一個命令的PID

例項!

9. read 命令的使用! (實現互動式的指令碼.)

**如果少寫一個值第三個變數就沒有值,如果多寫一個第三個變數就有兩個值.**(可以自己試試)

10. expr 對整數型變數進行運算 如果運算結果不是整數小數點後面的全部省去 (乘號要用轉意字元'\') .

注意: expr進行乘法運算的時候,*號需要用轉義字元"\"來進行轉義.

運算子號兩遍必須有空格!!

expr `expr 3+ 7` / 2 結果是 5 "`" 可以改變運算的順序

let 命令也可對整數進行運算!

a=4 b=5

let c=a+b #用let進行整數運算時,使用變數的時候不用加$符號!

echo $c

bc 命令可以計算小數點後任意位.

echo "scale=2;9/2" | bc #scale=2 表示保留小數點後兩位!


11. 把命令執行的結果賦給變數的方法!

a: 用``符號 b: 用$()

如圖:

12. 變數測試語句的使用方法!

作用:用於測試變數是否相等、是否為空、檔案的型別等。測試的範圍:整數、字串、檔案

檔案比較運算子
-efilename如果filename存在,則為真[-e/var/log/syslog]
-dfilename如果filename為目錄,則為真[-d/tmp/mydir]
-ffilename如果filename為常規檔案,則為真[-f/usr/bin/grep]
-Lfilename如果filename為符號連結,則為真[-L/usr/bin/grep]
-rfilename如果filename可讀,則為真[-r/var/log/syslog]
-wfilename如果filename可寫,則為真[-w/var/mytmp.txt]
-xfilename如果filename可執行,則為真[-x/usr/bin/grep]
filename1-ntfilename2如果filename1比filename2新,則為真[/tmp/install/etc/services-nt/etc/services]
filename1-otfilename2如果filename1比filename2舊,則為真[/boot/bzImage-otarch/i386/boot/bzImage]

字串比較運算子請注意引號的使用,這是防止空格擾亂程式碼的好方法
-zstring如果string長度為零,則為真[-z"$myvar"]
-nstring如果string長度非零,則為真[-n"$myvar"]
string1 =string2如果string1與string2相同,則為真["$myvar"="onetwothree"]
string1 !=string2如果string1與string2不同,則為真["$myvar"!="onetwothree"]

算術比較運算子 (算數比較不用加""雙引號 )
num1 -eqnum2等於[3-eq$mynum]
num1 -nenum2不等於[3-ne$mynum]
num1 -ltnum2小於[3-lt$mynum]
num1 -lenum2小於或等於[3-le$mynum]
num1 -gtnum2大於[3-gt$mynum]
num1 -genum2大於或等於[3-ge$mynum]


13. 各種迴圈語句的使用!! (-a 邏輯與;-o邏輯或;)

if ...elif迴圈的使用.

例子:


for ... done 迴圈!

例子:

for...done迴圈 + awk命令 + 位置變數 + read命令 T掉終端的使用者的例項!!


select 語句的使用!!

例子:

case 語句的使用!!

例子:

select語句 + case 語句 的例項!!


while 語句的使用

例項:

陣列 + while迴圈 + curl 命令 組成的指令碼!!


陣列的使用方法!

aaa=(1 2 3 4 5) //定義一個數組! 元素之間用空格隔開!

echo ${aaa[1]} //陣列的使用[]內的陣列從0開始對應陣列的裡的元素!

echo ${#aaa[*]} //統計陣列內元素的個數*和@都可以! 注意aaa前面必須有#號!

echo ${aaa[*]} //輸出aaa陣列中的所有元素*和@都可以!!!aaa前沒有#號哦!!!!

.......................

sehll 指令碼函式的學習


函式的呼叫必須在函式的定義之後!

return的返回值(0和1)代表的只是函式內最後一條命令的結果.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

例項解析

1.按照規則新增使用者名稱和密碼!

groupadd class1
users=`seq -f 'std%02g' 1 9` #使用者名稱的規則是std01 std02 ....std09 (知識點seq命令的使用,users 是使用者名稱)
for name in $users #知識點 for迴圈的使用

do
useradd -g class1 $name &
echo 123456 | passwd --stdin $name & #知識點passwd命令的--stdin引數的使用!! 123456為密碼
echo "使用者$name新增成功, 預設密碼為123456"
done


2.一句shell命令T掉root以外的其它終端!

kill -9 ` ps aux | grep -v "^root"| grep -v "USER"|awk '{print $2}'` #知識點``這對符號可以改變命令執行的順序!

# ps -aux 可以查出機器執行的所有程序和對應執行程序的使用者以及程序的ID!


3.shell指令碼中的邏輯運算子

cmd1&&cmd2
中的&&是個邏輯"與"運算子,意思就是說如果cmd1成功被執行,那麼執行cmd2,否則,不執行cmd2
類似:
cmd1||cmd2
中的||一個邏輯"或",如果cmd1失敗才執行cmd2,否則,不執行cmd2











轉載於:https://my.oschina.net/denglz/blog/92968