一:bash命令有执行状态返回值;
echo $? 可以查看命令的状态返回值,判断是否成功执行
bash的变量类型:
本地变量
局部变量
环境变量
位置变量
特殊变量:
$?: 用于保存刚刚执行的命令的状态返回值;
0:成功执行;
1-255:失败
可以使用exit命令在脚本中自定义脚本执行状态返回值;如果不定义,脚本执行状态返回值取决于脚本执行结束前最后执行的那个语句的状态
$@, $*: 所有位置参数;
$#: 位置参数的个数;
二:单分支if语句:
if 条件; then
语句1
语句2
...
fi
1:写一个脚本,实现如下功能:
如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数;
#!/bin/bash
#
File='/etc/rc.d/rc.sysinit'
if grep "^$" $File &> /dev/null; then
grep "^$" $File | wc -l
fi
三:双分支if语句:
if 条件; then
语句1
语句2
...
else
语句1
语句2
...
fi
四:bash条件测试:
整数测试:expression: 数值1 比较符号 数值2
$A 比较符号 $B
大于:-gt, 例如 $A -gt $B
大于或等于:-ge
等于:-eq
小于:-lt
小于或等于:-le
不等于:-ne
bash有个内置变量:$RANDOM可以随机生成不同的数
1:写一脚本,随机生成一个整数,判定,显示其奇偶性;
#!/bin/bash
#
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
echo "$A: Even"
else
echo "$A: Odd"
fi
bash编程: 位置变量$1, $2, $3, $4, ...
2:计算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]"
shift [n]:实现位置参数轮替;
3:通过参数传递n个正整数给脚本,求其和;
#!/bin/bash
#
Sum=0
for I in `seq 1 $#`; do
Sum=$[$Sum+$1]
shift
done
echo $Sum
五:bash字符测试:
>: 大于
<: 小于
==: 等于
=~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];
[[ $opt1 =~ $opt2 ]]一般做行首、行尾锚定;不要加引号;
单目:
-z $STRING: 为空则为真,不空则为假;
-n $STRING: 为空则为假,不空则真;
1:写一个脚本,判定用户的shell是否为bash;[ "$Shell" == "/bin/bash" ]
#!/bin/bash
#
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then
echo "No such user or User's shell is null."
exit 10
fi
if [ "$Shell" == "/bin/bash" ]; then
echo "Bash User."
Ret=0
else
echo "Not Bash User."
Ret=9
fi
exit $Ret
bash知识点:组合条件测试
-a: 与
-o: 或
!: 非,单目操作符
bash命令组合测试:
&&: 与
||: 或
!: 非
六:bash条件判断之多分支if语句:
语法格式:
if 条件1; then
语句1
语句2
...
elif 条件2; then
语句1
语句2
...
elif 条件3; then
语句1
语句2
...
else
语句1
语句2
...
fi
1:写一个脚本,其可以接受三个参数,最后一个参数为文件名,但参数可变化,形如:
script.sh -a MageEdu /magedu.com/scripts/test1.sh
script.sh -d 2013-07-19 /magedu.com/scripts/test1.sh
script.sh -D 'some infomation' /magedu.com/scripts/test1.sh
此脚本能够创建/magedu.com/scripts/test1.sh文件,并且,如果给出了-a MageEdu,则文件前两行为:
#!/bin/bash
# Author: MageEdu
如果给出了-d 2013-07-19,则文件前两行为:
#!/bin/bash
# Date: 2013-07-19
如果给出了-D "some infomation",则文件前两行为:
#!/bin/bash
# Description: some infomation
其它任何参数,均提示错误并退出;
进一步:如果没有退出,则使用vim打开此文件,并使用光标默认处于最后一行;
再进一步:保存退出后,如果文件有语法错误提示用户有错误;
更进一步:如果没有语法错误,则给些文件赋予执行权限;
a.sh -a mageedu /tmp/test.sh
#!/bin/bash
# Author: mageedu
a.sh -d 2013-07-19 /tmp/test.sh
#!/bin/bash
# Date: 2013-07-19
a.sh -D "test script" /tmp/test.sh
#!/bin/bash
# Description: test script
mkscript
#!/bin/bash
if [ $# -ne 3 ]; then
echo "the number of arguements is wrong."
exit 4
fi
echo '#!/bin/bash' >> $3
if [ $1 == '-a' ]; then
echo "# Author: $2" >> $3
elif [ $1 == '-d' ]; then
echo "# Date: $2" >> $3
elif [ $1 == '-D' ]; then
echo "# Description: $2" >> $3
else
echo "Unknown option, ignore it."
rm -f $3
exit 5
fi
vim + $3
if bash -n $3 &> /dev/null; then
chmod +x $3
else
echo "Syntax wrong in $3."
fi
七:bash测试之文件测试:
操作符 文件路径
-f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;
-d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;
-e: 测试文件是否存在;存在为真,否则为假;
-r: 测试文件对当前用户来说是否可读;
-w: 测试文件对当前用户来说是否可写;
-x: 测试文件对当前用户来说是否可执行;
-s: 测试文件大小是否不空,不空则真,空则假;
短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;
与运算:
真 && 真 = 真
真 && 假 = 假
假 && {真|假} = 假
或运算:
假 || 假= 假
假 || 真= 真
真 || 真=真
! id $UserName &> /dev/null && useradd $UserName || echo "$UserName exists."
1假设用户存在,对其取反! id $UserName为假,根据与运算的特点可以得! id$UserName &> /dev/null && useradd $UserName 为假,根据或运算的特点并结合假设,所以echo "$UserName exists.为真。
2假设用户不存在,对其取反! id $UserName为真,根据与运算的特点并结合假设,所以 useradd $UserName 为真。根据或运算的特点结合已知得到echo "$UserName exists为假。
id $UserName &> /dev/null && echo "$UserName exists." || useradd $UserName
1:给定一个路径,判断
如果为普通文件,显示之;如果为目录,显示之;否则,说无法识别;
#!/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
本文转自 宋鹏超 51CTO博客,原文链接:http://blog.51cto.com/qidian510/1253358,如需转载请自行联系原作者