天天看點

學習shell腳本遇到的小知識!

首先說一下shell腳本的一些規則:

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

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

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

變量指派的方法

變量名=指派 例子:NUM=100 (使用變量的時候$NUM,變量指派的時候等号兩邊沒有空格).

将一個指令的結果指派給變量的2個方法

TIME=`date` 這個符号"`"不是單引号哦!

TIME=$(date)

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

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

sh -x shell  (./shell  也可以執行shell腳本  但是沒有-x參數)

學習shell腳本遇到的小知識!

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

學習shell腳本遇到的小知識!

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

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

if [ "$web" = "" ]

then

        /etc/init.d/mysql start

fi

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

學習shell腳本遇到的小知識!

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

執行個體:

學習shell腳本遇到的小知識!

[[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

執行個體!

學習shell腳本遇到的小知識!

9. read 指令的使用! (實作互動式的腳本.)

學習shell腳本遇到的小知識!

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

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

學習shell腳本遇到的小知識!

注意: 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: 用$()

如圖:

學習shell腳本遇到的小知識!

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

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

檔案比較運算符   

-e filename  如果 filename存在,則為真  [ -e /var/log/syslog ]  

-d filename  如果 filename為目錄,則為真  [ -d /tmp/mydir ]  

-f filename  如果 filename為正常檔案,則為真  [ -f /usr/bin/grep ]  

-L filename  如果 filename為符号連結,則為真  [ -L /usr/bin/grep ]  

-r filename  如果 filename可讀,則為真  [ -r /var/log/syslog ]  

-w filename  如果 filename可寫,則為真  [ -w /var/mytmp.txt ]  

-x filename  如果 filename可執行,則為真  [ -x /usr/bin/grep ]  

filename1-nt filename2  如果 filename1比 filename2新,則為真  [ /tmp/install/etc/services -nt /etc/services ]  

filename1-ot filename2  如果 filename1比 filename2舊,則為真  [ /boot/bzImage -ot arch/i386/boot/bzImage ]  

字元串比較運算符 (請注意引号的使用,這是防止空格擾亂代碼的好方法)   

-z string  如果 string長度為零,則為真  [ -z "$myvar" ]  

-n string  如果 string長度非零,則為真  [ -n "$myvar" ]  

string1 = string2  如果 string1與 string2相同,則為真  [ "$myvar" = "one two three" ]  

string1 != string2  如果 string1與 string2不同,則為真  [ "$myvar" != "one two three" ]  

算術比較運算符    ( 算數比較不用加""雙引号 )

num1 -eq num2  等于 [ 3 -eq $mynum ]  

num1 -ne num2  不等于 [ 3 -ne $mynum ]  

num1 -lt num2  小于 [ 3 -lt $mynum ]  

num1 -le num2  小于或等于 [ 3 -le $mynum ]  

num1 -gt num2  大于 [ 3 -gt $mynum ]  

num1 -ge num2  大于或等于 [ 3 -ge $mynum ]

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

if ...elif循環的使用.    

例子:

學習shell腳本遇到的小知識!

for ... done 循環!       

例子:

學習shell腳本遇到的小知識!

    for...done循環 + awk指令 + 位置變量 + read指令  T掉終端的使用者的執行個體!!

學習shell腳本遇到的小知識!

select 語句的使用!!

例子:

學習shell腳本遇到的小知識!

case 語句的使用!!

例子:

學習shell腳本遇到的小知識!

select語句 + case 語句 的執行個體!!

學習shell腳本遇到的小知識!

while 語句的使用

執行個體:

學習shell腳本遇到的小知識!

數組 + while循環 + curl 指令 組成的腳本!!

學習shell腳本遇到的小知識!

數組的使用方法!

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

echo ${aaa[1]}    //數組的使用[]内的數組從0開始對應數組的裡的元素!

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

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

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

sehll 腳本函數的學習

學習shell腳本遇到的小知識!

函數的調用必須在函數的定義之後!

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 

版權聲明:本文為CSDN部落客「weixin_34337265」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_34337265/article/details/91762274