目录
分支循环语句
一、分支语句
#if 或 elif 后面跟的条件,事实上是一条可执行的程序,判断的依据是该程序是否执行成功 if 条件 then 命令 fi 如果脚本的参数少于3个,则提示用户需要3个参数 if [ $# -lt 3 ] then echo "Sorry,it needs 3 args" fi
if 条件; then 命令 fi if 条件; then 命令1 else 命令2 fi 提示用户输入他的账号,并显示欢迎信息,如为空则提示: echo "Please input your name: " read NAME if [ "$NAME" = "" ]; then echo "Your name is null" else echo "Welcom, $NAME" fi # 用grep查找也可按查找到的具体行数进行判断: grep -c ^$NAME /etc/passwd
利用多支语句完成以下内容:
请完善以下脚本,明确提醒用户,如果输入参数错误,则给予中文提示,如果参数中给定的文件不存在,基于中文不存在的提示。
#!usr/bin/bash # 通过参数来决定对某个文件进行查找,并输出响应行号和行数,只接受一个参数 filename=$1 grep -n root $filename
答案一:
#!/usr/bin/bash # 通过参数来决定对某个文件进行查找,并输出相应行数和行号,只接受一个参数 #参数个数必须是1个,或者至少1个 #参数个数正确后,则需要确认文件存在 if [ $# -ne 1 ];then #如果文件个数不为1 echo "请输入一个参数" elif [ ! -e $1 ];then #如果文件$1不存在 echo "您输入的文件不存在" else grep -n root $1 fi
答案二:
if [ $# -eq 1 -a -e $1 ];then grep -n root $1 else echo "您输入的参数有误或不正确" fi
# 所有的case...in的多重分支,均可用if...elif...elif...else代替 case $1 in 1) echo "Monday" ;; 2) echo "Tuesday" ;; 3) echo "Wednesday" ;; 4) echo "Thursday" ;; 5) echo "Friday" ;; 6) echo "Saturday" ;; 7) echo "Sunday" ;; *) echo "Error" esac
二、循环语句
1.for循环
for 变量名 in 列表 do 命令 done
以脚本的参数作为循环依据,将参数输出 #for loop in 1 2 3 4 5 6 for loop in "$@" do echo $loop done
计算从1加到10的结果 sum=0 for i in 1 2 3 4 5 6 7 8 9 10; do sum = `expr $sum + $i` #let sum=sum+i #let sum+=i #((sum+=i)) #双括号表达式,用于计算 done echo "整数1加到10的结果为:$sum"
双括号表达式的好处在哪里呢?
双括号表达式的作用凸显在计算和赋值这一方面中
上面方框中也就是下面图中用#注释掉的方法都是正确的
#统计出某个目录下有多少文件 counter=0 for file in `ls` do counter=`expr $counter + 1` #也可以使用let counter+=1 或 ((counter+=1)) done echo "There are $counter files in `pwd`" #注意counter赋值时等候前后不能有空格,否则会被认为counter是一条命令
练习: 1.运算脚本所有参数的乘积,如果参数中包含0,则提示用户 2.求1~100之间的所有整数和 for i in {1..100} while 条件 do 命令 done
2.while循环
根据参数1决定循环次数,并将每次结果输出: i=0 while [ $i -lt $1 ] do echo "Hello, $i" i=`expr $i + 1` done
从某文件中一行一行读取内容,并将其加上引号输出: line=1 while read FILE do echo "$line: $FILE" line=`expr $line + 1` done < /etc/group
我们可以理解为:
以 /etc/group 这个文件作为 FILE 然后用 read 去一行一行的读取 FILE ,并在每一行前面输出行号
从某文件中一行一行读取内容,并将其中用空格或TAB分隔的内容按列输出: Data文件为: NAME EMAIL PHONE Denny dq@qq.com 123456789 Qiang qq@dd.net 789456123 Angel an@12.cn 087y8438 代码为: line=0 while read NAME EMAIL PHONE do line=`expr $line + 1` if [ $line -eq 1 ] then continue fi echo "----$line----" echo "$NAME" echo "$EMAIL" echo "$PHONE" done < $1
以下代码如果使用break,则只会输出1,2,3,4,如果使用continue,1到10中则只有5不会输出 i=0 while [ $i -lt 10 ] do i=`expr $i + 1` if [ $i -eq 5 ]; then #continue break fi echo $i done #break会直接跳出整个循环,此时所有循环都会结束,在这里就是跳出while循环,而continue只是跳出当前小循环,在这里就是跳出i等于5的情况