for:通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环。
一:生成列表的方式”:
1、 直接给出
for i in abc;d0
2、 使用文件名统配的机制生成
for I in /etc/*;do
3、使用{}或seq命令生成数字序列
for i in (seq 100 200)
4、手动使用命令生成
列表的生成方法:
for username in $(seq 10 20);do=forusername in {10..20};do= for username in `seq 10 20`;do #username是变量名,引用了后面的列表
二:for循环格式:
forvar_name #(变量名,赋值) in /etc/*#列表;do #当列表满足条件后开始执行
循环体(可执行语句)
fi#结束语
for循环格式:
单分支:if ……;then
xxx
……
fi
双分支:
if……; then
分支1;
else
分支2;
fi
多分支:
if……;then
分支1;
elif…..;then
分支2;
elif……;then
分支3;
else
分支n;
fi
三:条件测试:
bash:每个命令都有执行状态返回值
成功:0
失败:1-255
echo $? 脚本的最后一条命令
引用命令的执行结果:使用`COMMMAND`或$(COMMAND)
引用命令的执行成功与否的状态结果,一定是直接执行命令,此时一般将执行结果重定向到/dev/null
知识点:
组合条件测试:
与: 条件a && 条件b ,双重条件满足为真,
条件1为假结果一定为假,因此条件2将不予执行
如果条件1为真,则最终结果取决于后面的条件,因此条件2必须执行\
或:条件1 || 条件2,有一个满足就为真,第一个为真就一定为真
条件1为真则结果一定为真,则条件2不予执行,如果条件1为假,则最终结果取决于后面的条件,因此条件2必须执行
非: ! 条件 取反结果,
条件测试格式:
test测试表达式
[测试表达式]
[[]]
1、让用户输入一个用户名,如果用户存在就显示用户名和ID,如果不存在就显示用户不存在。
#!/bin/bash
read -t 10 -p "Enter - username : "username
# username=${username:-root}
if id $username &> /dev/null; then
echo "$username: `id -u $username`"
else
echo "$username not exist"
fi
2、写一个脚本,让用户输入一个用户名,如果用户不存在就直接退出,如果UID大于500说明他是系统用户,否则就是普通用户
[root@localhosttmp]# cat yonghu.sh
#!/bin/bash
read -t 10 -p "Enter a username: " username
if !id $username &> /dev/null; then
echo "$username is not exit"
exit 6
fi
useruid=`id -u $username`
if [ $useruid -ge 500 ]; then
echo "$username is A common user"
else
echo "$username is A System username"
fi
四:整数字符测试;
-eq等于
If[[ a �Ceq 0 ]];then #假如a等于0
-ne 不等于
If [[ a �Cne 0 ]];then #假如a不等于0
-le 小于等于
If [[ a �Ceq 0 ]];then #假如a小于等于0
-ge 大于等于
If [[ a �Ceq 0 ]];then #假如a大于等于0
-lt 小于
If [[ a �Ceq 0 ]];then #假如a小于0
-gt 大于
If [[ a �Ceq 0 ]];then #假如a大于0
3、写一个脚本让用户输入用户名,如果用户不存在就 自动退出,如果其UID等于其GID就说是个good guy,否则说你是个bad guy。
[root@localhosttmp]# cat guy.sh
#!/bin/bash
read -t 10 -p "Enter a username: " username
if !id $username &> /dev/null; then
echo "$username is not exit"
exit 6
fi
useruid=`id -u $username`
usergid=`id -g $username`
if [ $useruid -eq $usergid ]; then
echo "$username is a good guy"
else
echo "$username is A bad guy"
fi
五:字符串测试
>:大于
<:小于
==:等于,等值比较
=~:左侧是字符串,右侧是一个模式,判断左侧的字符串能否被右侧的模式匹配,通常指放在[[]]中使用
模式中可以使用行首、行尾锚定符,单目模式不要加引号
单目:
-n$stringVar:判定字符串是否不空,不空为真,空则为假
-z$stringVar:判定字符串是否为空,空则为真,不空则假
4、判定所有用户是的shell类型:
#!/bin/bash
for userName in `cut -d: -f1 /etc/passwd`;do
if[[ `grep "^$userName\>" /etc/passwd | cut -d: -f7` =~ sh$ ]]; then
echo "longin user: $userNname"
else
echo "nologin user: $userName"
fi
done
5、写一个脚本判定用户的shell是否bash,是为0,不是为1.如果用户不存在显示为7
[root@localhost tmp]# cat user.sh
#!/bin/bash
##
read -p "Please Enter a user name:" Username
if ! id $Username &> /dev/null; then
echo"No such user"
exit7
fi
userShell=`grep "^$Username\>"/etc/passwd | cut -d: -f7`
if [[ "$userShell" =="/bin/bash" ]]; then
echo"bash user"
time=0
else
echo"not bash user"
time=1
fi
exit $time
6、写一个脚本,当用户输入cpu显示cpu信息,输入mem显示mem信息,输入quit退出并退出吗为6,其他为7
#!/bin/bash
cat << EOF
cpu) print cpu infomation
mem) print memory infomation
quit) Quit
EOF
read -p "Enter your Option: "userOption
userOption=`echo $userOption | tr 'A-Z''a-z'`
if [[ "$userOption" =="cpu" ]]; then
cat /proc/cpuinfo
elif [[ "$userOption" =="mem" ]]; then
cat /proc/meminfo
elif [[ "$userOption" =="quit" ]]; then
echo "quit"
ret=6
else
echo "unkown option"
ret=7
fi
exit $ret
六:文件测试
[]
[[]]
test
-e=-afile:测试文件是否存在
[root@localhosttmp]# fileName=/tmp/hellodir
[root@localhost tmp]# [ -e$fileName ] || mkdir $filename
-f/path/to/file:测试是否存在且为普通文件,是为真,否则为假
-d/path/to/file:测试是否存在并且为目录文件
-b/path/to/somefile 测试文件是否存在并且是否是一个块设备文件
-c/path/to/file 测试文件是否是否存在并且是否是一个字符设备文件
-h=-l/patn/file 测试文件是否存在并且是否是一个链接文件
-p/path/file 测试文件是否存在并且是否是一个g管道文件
-S/path/file 测试文件是否存在并且是否是一个套接字文件
-r/path/file 测试是否存在且其当前用户是否针对此文件有读取权限
-w /path/file 测试是否存在且其当前用户是否针对此文件有写
-x /path/file 测试是否存在且其当前用户是否针对此文件有执行
-s/path/file 测试文件是否存在并且不空
7、根据用户的文件类型拷贝文件:
[root@localhost ~]# vim 5.sh
#!/bin/bash
dir='/tmp/logs'
[-e $dir ] || mkdir $dir
for filename in /var/log/*;do
if [ -d $filename ]; then
copy='cp -r'
elif [ -f $filename ]; then
copy='cp'
elif [ -h $filename ]; then
copy='cp -d'
else
copy='cp -a'
fi
$copy $filename $dir
done
七:双目测试:
file1 -nt file2 测试file1是否比file2更新一些,如fie1存在而file2不存在测也认为file更新一些
file1 �Cot file2 测试file1是否比file2更老一些
file1 �Cef file2 测试file1和file2是否引用了相同的设备或inode号
|| 只执行一个,当A执行失败执行B,A执行成功则不执行B
&& 执行两个,A执行失败B不执行,只有A执行成功才执行B
command1|| command2 如果command1执行成功,则不执行command2,如果command执行失败,则执行command2
command1&& command2 如果command1执行成功,则执行command2,如果command1执行失败,则不执行command2
8、计算用户给出的任意几个数字之和:
[root@localhost ~]# vim 4.sh
#!/bin/bash
declare -i sum=0
for i in `seq 1 $#`;do
let sum+=$1
shift
done
echo $sum