shell脚本编程之for语句、if语句使用介绍
2013-09-22 00:00
1226 查看
上部:
面向过程:
顺序执行
选择执行: if, case
循环执行: for, while, until
一、for语句
格式:
for 变量 in 列表;do
语句1;
语句2;
...
done
例1、写一个脚本,添加10个用户,并让每个用户的密码同用户名】
例2、写一个脚本,分别显示 /tmp/1.dir /tmp/2.dir /tmp/3.dir三个文件的时间戳,并将这三个文件被修改的时间改为201003030303.03
bash的变量类型:
本地变量
局部变量
环境变量
位置变量 :$1、$2、$3、$4....
特殊变量:
$?: 用于保存刚刚执行的命令的状态返回值;
0:成功执行;1-255:失败,1,2,127
可以使用exit命令在脚本中自定义脚本执行状态返回值;如果不定义,脚本执行状态返
回值取决于脚本执行结束前最后执行的那个语句的状态;
$@, $*: 所有位置参数;
$#: 位置参数的个数;
$0: 脚本名称
二、if语句
1、单分支if语句:
格式:
if 条件; then
语句1
语句2
...
fi
例3、写一个脚本,实现如下功能: 如果用户存在,就说明其存在;
例4、写一个脚本,实现如下功能:如果设备/dev/sda3已经挂载,就显示其挂载点;
例5、写一个脚本,实现如下功能: 如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数;
2、双分支if语句:
格式:
if 条件; then
语句1
语句2
...
else
语句1
语句2
...
fi
例6、写一个脚本,实现如下功能:
如果设备/dev/sda3已经挂载,就显示其挂载点;否则,就说明其未挂载或设备不存在;
3、多分支if语句:
格式:
if 条件1; then
语句1
语句2
...
elif 条件2; then
语句1
语句2
...
elif 条件3; then
语句1
语句2
...
else
语句1
语句2
...
fi
例7、写一个脚本:
判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
如果其生产商为GenuineIntel,就显示其为Intel公司;
如果其生产商为AuthenticAMD,就显示其为AMD公司;
否则,就显示无法识别;
下部:
一、bash条件测试:
整数测试 [ expression ]
字符测试 [[ expression ]]
条件测试 test expression test 根据表达式求值的结果返回 0(真)或 1(假)
1、整数测试:数值比较
-gt 大于
-ge 大于或等于
-eq 等于
-lt 小于
-le 小于或等于
-ne 不等于
例1:写一个脚本,生成两个随机数,比较其大小;显示大数;
bash有个内置变量:$RANDOM
例2:写一脚本,随机生成一个整数,判定,显示其奇偶性;
例3、写一个脚本:
计算100以内所有奇数的和以及所有偶数的和;分别显示之;
例4、计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数;
例5、写一个脚本,完成以下要求:
1、添加10个用户user1, user2, ..., user10;但要先判断用户是否存在,不存在而后再添加;
2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
3、最后显示当前系统上共有多少个用户;
2、bash字符测试:
>: 大于
<: 小于
==: 等于
=~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];
[[ $opt1 =~ $opt2 ]]一般做行首、行尾锚定;不要加引号
单目:
-z $STRING: 为空则为真,不空则为假;
-n $STRING: 为空则为假,不空则真;
例6、写一个脚本,判定用户的shell是否为bash;
例7、根据用户shell的结束符是否为sh来判定其是否为登录用户:
二、bash测试之文件测试:
操作符 文件路径
-f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;
-d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;
-e: 测试文件是否存在;存在为真,否则为假;
-r: 测试文件对当前用户来说是否可读;
-w: 测试文件对当前用户来说是否可写;
-x: 测试文件对当前用户来说是否可执行;
-s: 测试文件大小是否不空,不空则真,空则假;
短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;
与运算:
真 && 真 = 真
真 && 假 = 假
假 && {真|假} = 假
或运算:
假 || 0 = 0
假 || 1 = 1
真 || =1
例8、给定一个路径,判断如果为普通文件,显示之;如果为目录,显示之;
否则,说无法识别;
综合例子:
写一个脚本:可以接受一个参数,其使用形式如下:
script.sh {start|stop|restart|status}
如果参数为start,创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;
如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;
如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示“Restarting script successfully.”;
如果参数为status,那么:
如果/var/lock/subsys/script文件存在,则显示为“script is running.”
否则,则显示为“script is stopped.”
其它任何参数:则显示“script.sh {start|stop|restart|status}”
面向过程:
顺序执行
选择执行: if, case
循环执行: for, while, until
一、for语句
格式:
for 变量 in 列表;do
语句1;
语句2;
...
done
例1、写一个脚本,添加10个用户,并让每个用户的密码同用户名】
#!/bin/bash for I in {1..10}; do useradd user$I; echo user$I | passwd --stdin user$I done
例2、写一个脚本,分别显示 /tmp/1.dir /tmp/2.dir /tmp/3.dir三个文件的时间戳,并将这三个文件被修改的时间改为201003030303.03
#!/bin/bash for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do stat $Dir touch -m -t 201003030303.03 $Dir stat $Dir done
bash的变量类型:
本地变量
局部变量
环境变量
位置变量 :$1、$2、$3、$4....
特殊变量:
$?: 用于保存刚刚执行的命令的状态返回值;
0:成功执行;1-255:失败,1,2,127
可以使用exit命令在脚本中自定义脚本执行状态返回值;如果不定义,脚本执行状态返
回值取决于脚本执行结束前最后执行的那个语句的状态;
$@, $*: 所有位置参数;
$#: 位置参数的个数;
$0: 脚本名称
二、if语句
1、单分支if语句:
格式:
if 条件; then
语句1
语句2
...
fi
例3、写一个脚本,实现如下功能: 如果用户存在,就说明其存在;
#!/bin/bash UserName=user1 if grep "^$UserName\>" /etc/passwd &> /dev/null; then echo "$UserName exists." fi
例4、写一个脚本,实现如下功能:如果设备/dev/sda3已经挂载,就显示其挂载点;
#!/bin/bash Device='/dev/sda3' if mount | grep "^$Device" &> /dev/null; then mount | grep "/dev/sda3" | cut -d' ' -f3 fi
例5、写一个脚本,实现如下功能: 如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数;
#!/bin/bash File='/etc/rc.d/rc.sysinit' if grep "^$" $File &> /dev/null; then grep "^$" $File | wc -l fi
2、双分支if语句:
格式:
if 条件; then
语句1
语句2
...
else
语句1
语句2
...
fi
例6、写一个脚本,实现如下功能:
如果设备/dev/sda3已经挂载,就显示其挂载点;否则,就说明其未挂载或设备不存在;
#!/bin/bash Device='/dev/sda3' if mount | grep "^$Device" &> /dev/null; then mount | grep "/dev/sda3" | cut -d' ' -f3 else echo "$Device not mounted or not exist." fi
3、多分支if语句:
格式:
if 条件1; then
语句1
语句2
...
elif 条件2; then
语句1
语句2
...
elif 条件3; then
语句1
语句2
...
else
语句1
语句2
...
fi
例7、写一个脚本:
判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
如果其生产商为GenuineIntel,就显示其为Intel公司;
如果其生产商为AuthenticAMD,就显示其为AMD公司;
否则,就显示无法识别;
#!/bin/bash Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2` if [[ $Vendor =~ [[:space:]]*GenuineIntel$ ]]; then echo "intel" elif [[ $Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then echo "AMD" else echo "Unknown" fi
下部:
一、bash条件测试:
整数测试 [ expression ]
字符测试 [[ expression ]]
条件测试 test expression test 根据表达式求值的结果返回 0(真)或 1(假)
1、整数测试:数值比较
-gt 大于
-ge 大于或等于
-eq 等于
-lt 小于
-le 小于或等于
-ne 不等于
例1:写一个脚本,生成两个随机数,比较其大小;显示大数;
bash有个内置变量:$RANDOM
#!/bin/bash A=$RANDOM B=$RANDOM if [ $A -ge $B ]; then echo "Max number is $A." else echo "Max number is $B." fi
例2:写一脚本,随机生成一个整数,判定,显示其奇偶性;
#!/bin/bash # A=$RANDOM if [ $[$A%2] -eq 0 ]; then echo "$A: Even" else echo "$A: Odd" fi
例3、写一个脚本:
计算100以内所有奇数的和以及所有偶数的和;分别显示之;
#!/bin/bash EvenSum=0 OddSum=0 for I in {1..100}; do if [ $[$I%2] -eq 0 ]; then EvenSum=$[$EvenSum+$I] else OddSum=$[$OddSum+$I] fi done echo "EvenSum is: $EvenSum. OddSum is: $OddSum."
例4、计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数;
#!/bin/bash EvenSum=0 OddSum=0 for I in `seq 1 $1`;do if [ $[$I%2] -eq 1 ]; then OddSum=$[$OddSum+$I] else EvenSum=$[$EvenSum+$I] fi done echo "EvenSum: $EvenSum." echo "OddSUm: $OddSum." echo "Sum: $[$EvenSum+$OddSum]"
例5、写一个脚本,完成以下要求:
1、添加10个用户user1, user2, ..., user10;但要先判断用户是否存在,不存在而后再添加;
2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
3、最后显示当前系统上共有多少个用户;
#!/bin/bash Count=0 for I in {1..10}; do if id user$I &> /dev/null; then echo "user$I exists." else useradd user$I echo "Add user$I successfully." Count=$[$Count+1] fi done echo "Add $Count new users." echo "Total users: `wc -l /etc/passwd | cut -d' ' -f1`."
2、bash字符测试:
>: 大于
<: 小于
==: 等于
=~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];
[[ $opt1 =~ $opt2 ]]一般做行首、行尾锚定;不要加引号
单目:
-z $STRING: 为空则为真,不空则为假;
-n $STRING: 为空则为假,不空则真;
例6、写一个脚本,判定用户的shell是否为bash;
#!/bin/bash Shell=`grep "^$1:" /etc/passwd | cut -d: -f7` if [ "$Shell" == "/bin/bash" ]; then echo "Bash User." Ret=0 else echo "Not Bash User." Ret=9 fi exit $Ret
例7、根据用户shell的结束符是否为sh来判定其是否为登录用户:
#!/bin/bash Shell=`grep "^$1:" /etc/passwd | cut -d: -f7` if [ -z $Shell ]; then echo "No shell." exit 3 fi if [[ "$Shell" =~ sh$ ]]; then echo "Login User." Ret=0 else echo "None Login User." Ret=4 fi exit $Ret
二、bash测试之文件测试:
操作符 文件路径
-f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;
-d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;
-e: 测试文件是否存在;存在为真,否则为假;
-r: 测试文件对当前用户来说是否可读;
-w: 测试文件对当前用户来说是否可写;
-x: 测试文件对当前用户来说是否可执行;
-s: 测试文件大小是否不空,不空则真,空则假;
短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;
与运算:
真 && 真 = 真
真 && 假 = 假
假 && {真|假} = 假
或运算:
假 || 0 = 0
假 || 1 = 1
真 || =1
例8、给定一个路径,判断如果为普通文件,显示之;如果为目录,显示之;
否则,说无法识别;
#!/bin/bash if [ ! -e $1 ]; then echo "No such file." exit 7 fi if [ -f $1 ]; then echo "Common file." elif [ -d $1 ]; then echo "Directory." else echo "Unknown file." fi
综合例子:
写一个脚本:可以接受一个参数,其使用形式如下:
script.sh {start|stop|restart|status}
如果参数为start,创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;
如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;
如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示“Restarting script successfully.”;
如果参数为status,那么:
如果/var/lock/subsys/script文件存在,则显示为“script is running.”
否则,则显示为“script is stopped.”
其它任何参数:则显示“script.sh {start|stop|restart|status}”
#!/bin/bash if [ $1 == start ] ;then touch /var/lock/subsys/script echo "Starting script successfully." elif [ $1 == stop ] ; then rm -f /var/louk/subsys/script echo "Stop script finished." elif [ $1 == restart ];then rm -f /var/louk/subsys/script touch /var/lock/subsys/script echo "Restarting script successfully." elif [ $1 == status ];then [ -e /var/lock/subsys/script ]&& echo "script is running." || echo "script is stopped." else echo "script.sh {start|stop|restart|status}" fi
相关文章推荐
- shell脚本编程之for语句、if语句使用介绍
- shell脚本编程之for语句、if语句使用介绍
- shell脚本编程之for语句、if语句使用介绍
- shell脚本之-if流程控制语句和for循环语句的使用
- shell脚本编程:条件判断if语句使用小结
- 使用for、if语句添加用户的一个shell脚本
- shell脚本编程之if语句学习笔记
- shell脚本之while for if 语句和编写计划任务
- shell脚本编程之if语句学习笔记
- 使用if语句编写Shell脚本
- shell脚本不使用if语句进行选择的脚本
- shell的一些常用的语句(if语句,变量,for、while、until语句、函数调用、脚本调用)
- Shell 脚本基础 - 使用 if 语句进行条件检测
- shell 编程中使用到得if语句内判断参数
- shell脚本--使用for if date awk
- shell脚本编程之选择执行之if语句
- shell脚本练习一(if语句、case语句、for语句、while语句)
- shell脚本编程-使用结构化命令(if/else)(转)
- +++++++脚本练习之for循环和if语句使用
- 【编程题目】求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case和条件语句