使用if選擇結構
if [];then
elif [];then #注意這個地方,java是else if
else ;
fi
使用for循環結構
使用for循環,語法結構如下所示: for 變量名 in 值1 值2 值3 #值的數量決定循環任務的次數 do命令序列 done
#循環輸出1到10
for i in {1..10} #注意的是花括號里面不加空格
doecho $i;
done
#從文件中獲取數據,進行批量的ping,或者用戶創建
# 創建存儲信息的文件,也是數據來源
vim /sh/ip.txt
192.168.88.2
192.168.88.254
192.168.88.3
192.168.88.240
#使用$(cat 路徑)獲取數據
for i in $( cat /sh/ip.txt )
doping -c 1 $i &> /dev/null;if [ $? == 1 ];thenecho $i"可以ping通";else echo $i"bu可以ping通";fi
done
使用while循環結構
寫法 | 特點 | 適用場景 |
---|---|---|
while : | 簡潔,無限循環,需手動退出。 | 簡單守護進程、持續監控 |
while true | 功能相同,但語義更明確(推薦)。 | 同 while : |
while [條件] | 條件滿足時循環,可自動終止。 | 需要動態終止條件的場景 |
使用while循環,語法結構如下所示:
while 條件測試 #根據條件的結果決定是否要執行任務,條件測試成功的話就執行,如果失敗立刻結束循環
do命令序列
done
num=$[RANDOM%10+1] 是一種生成 1 到 10 之間的隨機整數 的方法。
num=$[RANDOM%12+1]
q=1
while [ $q -eq 1 ];
doread -p "shuru[1-12]:" nub;if [ $nub -gt $num ];thenecho "pianda";elif [ $num -gt $nub ];thenecho "pianxiao";else echo "daduil";q=0;fi
done
注意:使用[]一定要記得使用空格
中斷及退出
關鍵字 | 作用范圍 | 功能描述 | 典型場景 | 示例代碼 |
---|---|---|---|---|
break | 循環結構(for /while /until ) | 立即退出當前循環,后續迭代不再執行。 | 提前終止循環(如找到目標后退出)。 | bash<br>for i in {1..5}; do<br> [ "$i" -eq 3 ] && break<br> echo "$i"<br>done<br># 輸出: 1 2<br> |
continue | 循環結構(for /while /until ) | 跳過當前迭代,直接進入下一次循環。 | 跳過特定條件下的處理(如忽略無效輸入)。 | bash<br>for i in {1..5}; do<br> [ "$i" -eq 3 ] && continue<br> echo "$i"<br>done<br># 輸出: 1 2 4 5<br> |
exit | 整個腳本或函數 | 立即終止腳本或函數,并返回退出狀態碼(默認 0 ,非零表示錯誤)。 | 發生致命錯誤時終止腳本,或從函數返回狀態碼。 | bash<br>if [ ! -f "file.txt" ]; then<br> echo "文件不存在"<br> exit 1<br>fi<br># 若文件不存在,腳本終止并返回狀態碼 1<br> |
# 編寫持續創建用戶腳本sum.sh
q=0;
while :
doread -p "請輸入用戶名,輸入0退出:" usern; if [ $usern == 0 ];thenbreak; #break跳出循環,exit結束正在執行的進程elif useradd "$usern";then q=$(($q+1)); continue;else break;fidone
echo $q;
工具 | 語法格式 | 四則運算示例 | 求模運算示例 | 適用場景 | POSIX 兼容性 | 推薦度 |
---|---|---|---|---|---|---|
$(( )) | $((表達式)) | echo $((a + b)) echo $((a * b)) | echo $((a % b)) | 通用算術運算(推薦),支持所有標準運算符(+ , - , * , / , % 等)。 | ? 完全兼容 | ????? |
$[ ] | $[表達式] | echo $[a + b] echo $[a * b] | echo $[a % b] | 舊版 Bash 語法(已過時),功能與 $(( )) 相同,但非 POSIX 標準。 | ? 不兼容(部分 Shell 不支持) | ? 不推薦 |
let | let "表達式" | let "result=a+b" let "result=a*b" | let "result=a%b" | 變量賦值或復雜運算(如 i++ ),但無法直接輸出結果,需結合 echo 或變量。 | ? 完全兼容 | ??? |
基于case分支編寫腳本
case分支屬于匹配執行的方式,它針對指定的變量預先設置一個可能的取值,判斷該變量的實際取值是否與預設的某一個值相匹配,如果匹配上了,就執行相應的一組操作,如果沒有任何值能夠匹配,就執行預先設置的默認操作。case分支的語法結構如下所示:
case 變量 in
模式1)命令序列1 ;;
模式2)命令序列2 ;;.. ..
*)默認命令序列
esac
case $1 in
-f)touch $2;;
-d)mkdir $2;;
-r)remove -f $2;;
*)echo "-d,-f,-r";
esac
使用Shell函數
在Shell腳本中,將一些需重復使用的操作,定義為公共的語句塊,即可稱為函數。通過使用函數,可以使腳本代碼更加簡潔,增強易讀性,提高Shell腳本的執行效率 1)函數的定義方法 格式1: function 函數名 {命令序列.. .. }格式2: 函數名() {命令序列.. .. }2)函數的調用直接使用“函數名”的形式調用,如果該函數能夠處理位置參數,則可以使用“函數名 參數1 參數2 .. ..”的形式調用。注意:函數的定義語句必須出現在調用之前,否則無法執行。3) 測試語法格式[root@sv7 ~]# a() { #定義函數echo abcecho xyz}[root@sv7 ~]# a #調用函數
字符串處理
字符串截取的用法: ${變量名:起始位置:長度}
起始位置從0開始計數
[root@nsd ~]# echo ${phone:0:3}
121字符串替換的兩種用法:
1、只替換第一個匹配結果:${變量名/old/new}
2、替換全部匹配結果:${變量名//old/new}[root@nsd ~]# echo ${phone/2/*}
1*12121212121
[root@nsd ~]# echo ${phone//2/*}
1*1*1*1*1*1*1
[root@nsd ~]# echo $phone ==注:替換數據不會改變原始數據的值==
1212121212121 字符串掐頭去尾:
1、從左向右,最短匹配刪除:${變量名#*關鍵詞}
2、從左向右,最長匹配刪除:${變量名##*關鍵詞}
3、從右向左,最短匹配刪除:${變量名%關鍵詞*}
3、從右向左,最長匹配刪除:${變量名%%關鍵詞*}
[root@nsd ~]# echo ${n##* }
/mnt/dvd
[root@nsd ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 10.5G 0 rom /mnt/dvd
字符串初值的處理
可以通過${var:-初值}判斷變量是否存在,決定變量的初始值。
# 編寫一個腳本可以創建用戶,密碼可以自定義也可以使用默認值123456
read -p "user:" usert
useradd $usert
read -p "password:" pas
echo ${pas:-123} | passwd --stdin $usert
cut
示例:截取以空格分隔的字符串的第二部分
echo “hello world linux” | cut -d’ ’ -f2
輸出:world
-d' ':指定分隔符為空格(可替換為其他字符如 -d':')。
-f2:截取第二個字段。 1開始