#死循环示例 while [ 1 ] do echo"run" sleep 1 done #死循环输出输入的内容,直到输入end whiletrue do echo"input" read line if [ "$line" = end ] then break fi echo"line=$line" done #输出0-9 while [ "$i" -lt 10 ] do echo"i=$i" #let "i+=1" #((++i)) i=`expr$i + 1` done
until
条件没满足时,循环执行;一旦条件满足则退出。
1 2 3 4 5 6 7
#本地找file.txt文件,隔一秒找一遍,直到找到,退出。 until [ -f file.txt ] do echo"not find file.txt" sleep 1 done echo"find file.txt"
read
read命令 -n(不换行) -p(提示语句) -n(字符个数)-t(等待时间) -s(不回显)
case
结合正则表达式的示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
whiletrue do echo"input:" read line case"$line"in yes | Y) echo"this is yes";; no | N) echo"this is no";; end) break;; *) echo"$line";; esac done #可以搭配正则表达式使用。 read line case"$line"in [Yy][Ee][Ss] | [Yy])echo"this is yes";; [Nn][Oo] | [Nn]) echo"this is no";; end) break;; *) echo"$line";; esac
练习:把多行IP地址转换为10进制
先生成n行(192.168.0.1开始)
对n个ip地址进行转换,转换后的数据放在IPint.txt文件内。
生成n行IP
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#! /bin/sh # $1: nums of ip address FILE="IPs.txt" I=1 if [ -e $FILE ] then rm$FILE fi
while [ $I -le $1 ] do echo"192.168.0.$I" >> $FILE I=$(expr$I + 1) done
read -p "请输入一个正整数:" number [$number -eq 1] && echo"$number 不是质数" && exit#错误 for i in `seq 2 $(($number-1))` do [$[$number % $i] -eq 0] && echo"$number不是质数" $$ exit#错误 done echo"$number是质数" && exit # 测试: # 输入 1 # 输出 ./zhishu.sh: line 4: [1: command not found # 1是质数 # 测试: # 输入 7 # 输出 ./zhishu.sh: line 7: [1: command not found # ./zhishu.sh: line 7: [1: command not found # ./zhishu.sh: line 7: [3: command not found # ./zhishu.sh: line 7: [2: command not found # ./zhishu.sh: line 7: [1: command not found # 7是质数
intFindPos(constint * br, int n, int val) { if(br == NULL || n < 1)return-1; int pos = n - 1; while(pos >= 0 && br[pos]!=val) { --pos; } return pos; } intmain() { int ar[] = {12,56,34,78}; int n = sizeof(ar)/sizeof(ar[0]); int val = 78; int pos = FindPos(ar,n,val); cout << pos << endl; }
递归版本-自己写的初版
1 2 3 4 5 6 7 8 9 10 11 12 13
intFind(constint * br, int n, int val) { if(n > 0) { if(br[n - 1] == val) return n - 1; returnFind(br, n - 1, val); } } intFindPos(constint * br, int n, int val) { if(br == NULL || n < 1) return-1; returnFind(br, n, val); }
//杨版 intFind(constint * br, int n, int val) { if(n <= 0 || br[n-1] == val) { return n - 1; } else { returnFind(br, n - 1, val); } } intFindPos(constint * br, int n, int val) { if(br==NULL || n<1)return-1; returnFind(br,n,val); }
递归版本-标准版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
//初版和杨版结合、改进 //杨版 intFind(constint * br, int n, int val) { if(n > 0) { if(br[n-1] == val) return n - 1; elsereturn Find(br, n - 1, val); } return-1; } intFindPos(constint * br, int n, int val) { if(br==NULL || n < 1)return-1; return Find(br, n, val); }