首先說一下shell腳本的一些規則:
變量在linux裡面分為兩種,1:臨時變量(使用者自定義變量、位置變量). 2:永久變量(環境變量)
shell中使用者自定義的變量的名字由字母或下劃線開頭!自定義變量必須是 字母 數字 下劃線組成,并且區分大小寫,變量名字的長度沒有限制。
在使用自定義變量的時候前面需要加上"$"符号. (一般自定義的變量名用大寫)。
變量指派的方法
變量名=指派 例子:NUM=100 (使用變量的時候$NUM,變量指派的時候等号兩邊沒有空格).
将一個指令的結果指派給變量的2個方法
TIME=`date` 這個符号"`"不是單引号哦!
TIME=$(date)
如果把多個字元指派給一個變量,需要用""或''把值引起來!(單引号裡面如果還有定義的變量會當作字元輸出!)
1. 執行shell腳本的時候加上 -x ,執行腳本時會把過程列出來!(有利于我這種新手學習)
sh -x shell (./shell 也可以執行shell腳本 但是沒有-x參數)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0MTM0MzNf1mZZJ2XwMjNwQTMvwVOyETMvwlMxAjMvwVZjFGcz9CXzRWYvxGc19CX0VmbuEmbph2Yz9mLjlGdhR3cvw1LcpDc0RHaiojIsJye.png)
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. 變量測試語句的使用方法!
作用:用于測試變量是否相等、是否為空、檔案的類型等。測試的範圍:整數、字元串、檔案
檔案比較運算符
-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循環的使用.
例子:
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
版權聲明:本文為CSDN部落客「weixin_34337265」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_34337265/article/details/91762274