1. 选择执行:
1.1. if
单分支的if语句:
if 测试条件 then 代码分支 fi
双分支的if语句:
if 测试条件; then 条件为真时执行的分支 else 条件为假时执行的分支 fi
示例:通过参数传递一个用户名给脚本,此用户不存时,则添加之;
#!/bin/bash # if ! grep "^$1>" /etc/passwd &> /dev/null; then useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi
#!/bin/bash # if [ $# -lt 1 ]; then echo "At least one username." exit 2 fi if ! grep "^$1>" /etc/passwd &> /dev/null; then useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi
#!/bin/bash # if [ $# -lt 1 ]; then echo "At least one username." exit 2 fi if grep "^$1>" /etc/passwd &> /dev/null; then echo "User $1 exists." else useradd $1 echo $1 | passwd --stdin $1 &> /dev/null echo "Add user $1 finished." fi
练习:通过命令行参数给定两个数字,输出其中较大的数值;
#!/bin/bash # if [ $# -lt 2 ]; then echo "Two integers." exit 2 fi if [ $1 -ge $2 ]; then echo "Max number: $1." else echo "Max number: $2." fi
#!/bin/bash # if [ $# -lt 2 ]; then echo "Two integers." exit 2 fi declare -i max=$1 if [ $1 -lt $2 ]; then max=$2 fi echo "Max number: $max."
练习:通过命令行参数给定一个用户名,判断其ID号是偶数还是奇数;
练习:通过命令行参数给定两个文本文件名,如果某文件不存在,则结束脚本执行;
都存在时返回每个文件的行数,并说明其中行数较多的文件;
1.2. case
语法格式:
case $VARAIBLE in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 分支n ;; esac
case支持glob风格的通配符:
*:任意长度的任意字符;
?:任意单个字符;
[]:范围内任意单个字符;
a|b:a或b;
示例:写一个服务框架脚本;
$lockfile, 值/var/lock/subsys/SCRIPT_NAME
(1) 此脚本可接受start, stop, restart, status四个参数之一;
(2) 如果参数非此四者,则提示使用帮助后退出;
(3) start,则创建lockfile,并显示启动;stop,则删除lockfile,并显示停止;restart,则先删除此文件再创建此文件,而后显示重启完成;status,如果lockfile存在,则显示running,否则,则显示为stopped.
#!/bin/bash # # chkconfig: - 50 50 # description: test service script # prog=$(basename $0) lockfile=/var/lock/subsys/$prog case $1 in start) if [ -f $lockfile ]; then echo "$prog is running yet." else touch $lockfile [ $? -eq 0 ] && echo "start $prog finshed." fi ;; stop) if [ -f $lockfile ]; then rm -f $lockfile [ $? -eq 0 ] && echo "stop $prog finished." else echo "$prog is not running." fi ;; restart) if [ -f $lockfile ]; then rm -f $lockfile touch $lockfile echo "restart $prog finished." else touch -f $lockfile echo "start $prog finished." fi ;; status) if [ -f $lockfile ]; then echo "$prog is running" else echo "$prog is stopped." fi ;; *) echo "Usage: $prog {start|stop|restart|status}" exit 1 esac
2. 循环执行
2.1. for
进入条件:列表元素非空
退出条件:列表元素遍历完成
2.2. while
进入条件:条件测试结果为“真”
退出条件:条件测试结果为“假”
2.3. until
进入条件:条件测试结果为“假”
退出条件:条件测试结果为“真”
2.4. continue:提前结束本轮循环,而直接进入下一轮循环的判断
示例:求100以内所有偶数之和
#!/bin/bash # declare -i sum=0 declare -i i=1 until [ $i -gt 100 ]; do let sum+=$i let i++ done echo $sum
#!/bin/bash # declare -i sum=0 declare -i i=1 while [ $i -le 100 ]; do let sum+=$i let i++ done echo $sum
练习:分别使用for, while, until实现
1、分别求100以内所有偶数之和,100以内所奇数之和;
2、创建10个用户,user101-user110;密码同用户名;
3、打印九九乘法表;
4、打印逆序的九九乘法表;