這兩天學習了shell腳本編程進階,作為一枚文科生,小編覺得...恩..腳本很燒腦.....,不過小編還是做了些題,稍作總結后,呈給各位看官,內容如下:
一、條件選擇if語句
選擇執行:
注意:if語句可嵌套
單分支
if 判斷條件;then
條件為真的分支代碼
fi
雙分支
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
fi
多分支
if 判斷條件1; then
條件為真的分支代碼
elif 判斷條件2; then
條件為真的分支代碼
elif 判斷條件3; then
條件為真的分支代碼
else
以上條件都為假的分支代碼
fi
1、編寫腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示 其存在,否則添加之;顯示添加的用戶的id號等信息
1 #!/bin/bash 2 read -p "please input username:" username 3 useradd $username &> /dev/null 4 if [ $? -eq 0 ];then 5 echo "add $username user" && id $username 6 else 7 echo "the user already exits" 8 fi
2、編寫腳本/root/bin/checkint.sh,判斷用戶輸入的參數是 否為正整數
1 #!/bin/bash 2 read -p "please input a digit:" int 3 if [[ $int =~ (^[0-9]*[1-9][0-9]*$) ]];then 4 echo "this digit is positive integer" 5 else 6 echo "this digit is not positive integer" 7 fi
二、條件判斷case語句
語法格式:
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認分支
;;
esac
3、編寫腳本/root/bin/yesorno.sh,提示用戶輸入yes或no, 並判斷用戶輸入的是yes還是no,或是其它信息
1 #!/bin/bash 2 read -p "can i help you? yes or no " ans 3 case $ans in 4 [yY][eE][sS]|[yY]) 5 echo "ok,come on" 6 ;; 7 [nN][oO]|[nN]) 8 echo "no,thanks" 9 ;; 10 *) 11 echo "byebye" 12 ;; 13 esac
4、編寫腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑 ,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
1 #!/bin/bash 2 read -p "please input file path:" path 3 a=`ls -l $path|grep -o "^."` #腳本里面不能使用別名,所以用ls -l 4 case $a in 5 -) 6 echo "common file" 7 ;; 8 d) 9 echo "directory file" 10 ;; 11 l) 12 echo "linked file" 13 ;; 14 *) 15 echo "other file" 16 ;; 17 esac
三、for循環
語法格式:
for 變量名 in 列表;do
循環體
done
執行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
for循環列表生成方式:
(1)直接給出列表
(2)整數列表:
(a){start..end}
(b)$(seq [start [step]] end)
(3)返回列表的命令
$(COMMAND)
(4)使用glob,如:*.sh
(5)變量引用;
$@, $*
5、編寫腳本,提示輸入正整數n的值,計算1+2+…+n的總和
1 #!/bin/bash 2 read -p "please input a positive integer:" n 3 i=1 4 sum=0 5 for i in `seq 1 $n`;do 6 if [[ $n =~ (^[0-9]*[1-9][0-9]*$) ]];then #判斷n是否為正整數 7 let sum+=i 8 else 9 echo "a wrong int" && exit 10 fi 11 let i++ 12 done 13 echo "sum is $sum"
6、計算100以內所有能被3整除的整數之和
1 #!/bin/bash 2 sum=0 3 i=1 4 for i in {1..100};do 5 if [ $[$i%3] -eq 0 ];then 6 let sum+=i 7 fi 8 let i++ 9 done 10 echo $sum
7、打印九九乘法表
1 #!/bin/bash 2 for i in {1..9};do 3 for j in `seq 1 $i`;do 4 echo -n "$i*$j=$[i*j] " 5 done 6 echo 7 done
8、打印等腰三角形
1 #!/bin/bash 2 . functions 3 read -p "please input line:" line 4 is_digit $line 5 #i=*的個數 s=空格個數 l=當前行數 6 [ $? -ne 0 ] && exit 7 # 循環打印 8 for l in `seq 1 $line`;do 9 for s in `seq 1 $[$line-$l]`;do 10 echo -en " " 11 done 12 for i in `seq 1 $[2*$l-1]`;do 13 if [ $i -eq 1 ];then 14 color=$[RANDOM%7+31] #定義一個31到37的隨機顏色 15 echo -en "\e[1;${color};5m*\e[0m" #1代表高亮顯示,5m代表閃爍 16 elif [ $i -eq $[$l*2-1] ];then 17 echo -en "\e[1;${color};5m*\e[0m" 18 else 19 echo -en "*" 20 fi 21 done 22 echo 23 done
四、while循環
語法格式:
while CONDITION; do
循環體
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環
因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件:CONDITION為true
退出條件:CONDITION為false
9、編寫腳本,求100以內所有正奇數之和
1 #!/bin/bash 2 i=1 3 sum=0 4 while [ $i -le 100 ];do 5 if [ $[$i%2] -ne 0 ];then 6 let sum+=i 7 fi 8 let i++ 9 done 10 echo "sum is $sum"
10、編寫腳本,利用變量RANDOM生成10個隨機數字,輸出 這個10數字,並顯示其中的最大值和最小值
1 #!/bin/bash 2 i=1 3 a=$RANDOM 4 max=$a 5 min=$a 6 while [ $i -le 10 ];do 7 [ $max -lt $a ] && max=$a 8 [ $min -gt $a ] && min=$a 9 a=$RANDOM 10 echo "$a" 11 let i++ 12 done 13 echo "max is $max" 14 echo "min is $min"
11、編寫腳本,實現打印國際象棋棋盤
1 #!/bin/bash 2 red="\e[41m \e[0m" 3 white="\e[47m \e[0m" 4 for i in `seq 1 8`;do #這里定義了一個8行的棋盤 5 if [ $[i%2] -eq 0 ];then #判斷是否為偶行 6 for j in {1..4};do #四個偶數行就循環四遍紅白色 7 echo -en "$red$white" 8 done 9 else 10 for j in {1..4};do #四個奇數行循環白紅行 11 echo -en "$white$red" 12 done 13 fi 14 echo 15 done
12、后續六個字符串:efbaf275cd、4be9c40b8b、 44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63 是通過對隨機數變量RANDOM隨機執行命令: echo $RANDOM|md5sum|cut –c1-10 后的結果,請破解這些字符串對應的RANDOM值
1 #!/bin/bash 2 key_num_array=(efbaf275cd 4be9c40b8b 44b2395c46 f8c8873ce0 b902c16c8b ad865d2f63) #將這些字符串賦值到數組里,方便調用 3 for true_num in `seq 0 65535`;do #RANDOM值為0~65535 4 key_num=`echo $true_num | md5sum | cut -c 1-10` 5 for num in ${key_num_array[*]}; do 6 if [ "$key_num" == "$num" ];then 7 echo "$num --> $true_num" 8 fi 9 done 10 done
五、Until循環(與while條件相反,比較少用)
語法格式:
until CONDITION; do
循環體
done
進入條件: CONDITION 為false
退出條件: CONDITION 為true
13、每隔3秒鍾到系統上獲取已經登錄的用戶的信息;如果發 現用戶hacker登錄,則將登錄時間和主機記錄於日志 /var/log/login.log中,並退出腳本
1 #!/bin/bash 2 until who |grep "^hacker\>";do 3 sleep 3 4 done 5 who|egrep -o "^hacker.*"|sed -r 's/^hacker[[:space:]]+'// >> /app/hacker.log #小編這里記錄於這個路徑 6 echo "you should logout"| mail hacker
14、隨機生成10以內的數字,實現猜字游戲,提示比較大或小 ,相等則退出
1 #!/bin/bash 2 num=$[$RANDOM%10+1] 3 read -p "please guess:" i 4 until [ $num -eq $i ]; do 5 if [ $i -lt $num ]; then 6 echo "less,guess again" 7 else 8 echo "bigger,guess again" 9 fi 10 read -p "please guess:" i 11 done 12 echo "guess succeed!";exit
六、循環控制語句continue
用於循環體中
continue [N]:提前結束第N層的本輪循環,而直接進入下一 輪判斷;最內層為第1層
語法格式:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
Done
舉例奇數相加並跳過51
1 #!/bin/bash 2 for((i=1,sum=0;i<=100;i++));do #奇數相加 3 [ $i -eq 51 ] && continue #結束本輪循環,就是跳過51執行下面的奇數53 4 [ $[i%2] -eq 1 ] && let sum+=i 5 done 6 echo "sum is $sum" 7 unset i sum
七、循環控制語句break
用於循環體中
break [N]:提前結束第N層循環,最內層為第1層
語法格式:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then break
fi
CMDn
...
Done
舉例結束點餐
1 #!/bin/bash 2 cat << EOF 3 1 yangroufan 4 2 mifan 5 3 hulatang 6 4 jiaozi 7 5 lamian 8 6 huimian 9 7 exit 10 EOF 11 while true;do 12 read -p "please choose: " wufan 13 case $wufan in 14 1|4) 15 echo "price 20" 16 ;; 17 2|5) 18 echo "price 15" 19 ;; 20 3|6) 21 echo "price 10" 22 ;; 23 7) 24 break #輸入7就直接退出這個循環 25 ;; 26 *) 27 echo "no this option" 28 ;; 29 esac 30 done
八、循環控制shift命令
shift [n]
用於將參量列表 list 左移指定次數
參量列表 list 一旦被移動,最左端的那個參數就從列表中刪 除。while 循環遍歷位置參量列表時,常用到 shift
舉例:
1 #!/bin/bash 2 while (( $# > 0 ));do 3 echo $* 4 shift 5 done
九、select與case
select 循環主要用於創建菜單,按數字順序排列的,它是個無限循環,因此要記住用 break 命令退 出循環,或用 exit 命令終止腳本。也可以按 ctrl+c 退出循環
select 經常和 case 聯合使用
舉例創建菜單並退出菜單:
1 #!/bin/bash 2 select menu in yangroufan gaojiaofan huimian hulatang quit;do 3 case $REPLY in 4 1|3) 5 echo "price is 20" 6 ;; 7 2|4) 8 echo "price is 15" 9 ;; 10 5) 11 break 12 ;; 13 *) 14 echo "no this option" 15 ;; 16 esac 17 done
十、信號捕捉trap :捕捉到信號后自定義處理
trap '觸發指令' 信號
自定義進程收到系統發出的指定信號后,將執行觸發指令 ,而不會執行原操作 trap '' 信號 忽略信號的操作
trap '-' 信號 恢復原信號的操作
trap -p 列出自定義信號操作
舉例打印數字捕捉信號
1 #!/bin/bash 2 trap 'echo press ctrl+c' 2 #提示按了ctrl+c 3 for((i=0;i<10;i++));do 4 sleep 1 5 echo $i 6 done 7 trap '' INT #不提示 8 for((i=10;i<15;i++));do 9 sleep 1 10 echo $i 11 done 12 trap '-' 2 #恢復ctrl+c的停止作用 13 for((i=15;i<20;i++));do 14 sleep 1 15 echo $i 16 done
腳本雖難,寫好了則“一勞永逸”。好了,到這里小編關於腳本這一節的分享就結束了,歡迎大家評論,多多指教哦。