for循环以及数字、字符和文件测试

 

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"

f

五:字符串测试

         >:大于

         <:小于

         ==:等于,等值比较

         =~:左侧是字符串,右侧是一个模式,判断左侧的字符串能否被右侧的模式匹配,通常指放在[[]]中使用

             模式中可以使用行首、行尾锚定符,单目模式不要加引号

         单目:

         -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  测试file1file2是否引用了相同的设备或inode

 

|| 只执行一个,当A执行失败执行BA执行成功则不执行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

你可能感兴趣的:(for循环,字符测试)