一 shell
[3] shell中判断的使用
(1)对数字的判断 -eq 等于 -ne 不等于 -gt 大于 -ge 大于等于 -lt 小于 -le 小于等于 (2)逻辑运算 && ---> -a || ---> -o ! ---> ! (3)判断字符串 -z 判断字符串是否为空 -n 判断字符串是否不为空 =或者== 判断字符串是否相等 != 判断字符串是否不相等 \> 判断是否大于 \< 判断是否小于 (4)对文件类型的判断 -e:判断文件是否存在 -s:判断文件是否存在,并且判断文件是否为空 -b:判断文件是否存在,并且判断文件是否是块设备文件 -c:判断文件是否存在,并且判断文件是否是字符设备文件 -d:判断文件是否存在,并且判断文件是否是目录 -f:判断文件是否存在,并且判断文件是否是普通文件 -L:判断文件是否存在,并且判断文件是否是链接文件 -S:判断文件是否存在,并且判断文件是否是套接字文件 -p:判断文件是否存在,并且判断文件是否是管道文件 (5)对文件权限的判断 -r:判断是否具备可读权限 -w:判断是否具备可写权限 -x:判断是否具备可执行权限
#!/bin/bash read -p "input filename> " file if test -e "$file" -a -n "$file" then if test -L $file then echo "这是链接文件" elif test -f $file then echo "这是普通文件" elif test -d $file then echo "这是一个目录" elif test -c $file then echo "这是字符设备文件" elif test -s $file then echo "这是套接字文件" elif test -p $file then echo "这是g管道文件" fi else echo "file not found ,please check input filename" fi
练习`
向脚本输入一个文件的名字,判断输入是否不为空,如果不为空,判断是否是普通文件 如果是普通文件,再
判断文件是否具备写的权限如果文件不具备就添加写的权限,向文件尾部追加hello world这句话。
#!/bin/bash read -p "input filename >" file if [ -n "$file" ] then if [ -f "$file" ] then if [ ! -w "$file" ] then chmod u+w $file fi echo “hello world” >> $file else echo "输入的不是一个普通文件" exit 1 fi else echo "input try again" exit 1 fi
[4] case in语句
case 变量 in 匹配选项1) 语句1; 匹配选项2) 语句2; 匹配选项n) 语句n; 匹配选项的格式: *:匹配任意字符 [字符1字符n]:匹配[]内部任意一个字符 “y”|"yes" :如果有多个可以使用| ,|.|:|\"|?: 注意使用者转义字符
#!/bin/bash read -p "input number >" num case $num in 1) echo "星期一" ;; 2) echo "星期二" ;; *) echo "输入错误" ;; esac
#!/bin/bash read -p "input char > " cc case $cc in [0-9]|"10") echo "这是一个数字" ;; [a-zA-Z]) echo "这是一个字母" ;; ,|.|:|\"|?) echo "这是一个标点符号" ;; *) echo "输入错误" ;; esac
[5] 循环语句
(1)while循环
while 循环条件 do 循环体 done #!/bin/bash sum=0; i=0; while [ $i -le 100 ] do ((sum += i++)) done echo $sum
练习2
在用户家目录下创建两个目录file-dir和dir-dir
如果目录已经存在了,就不需要创建了,询问用户是否需要对目录清空[Y/N] y n,yes no
输入一个路径,判断这个路径是否存在,如果存在,将这个目录下的文件拷贝到file-dir,将目录拷贝到
dir-dir下
统计拷贝的文件和目录的个数,将文件的个数和目录的个数打印出来
#!/bin/bash arr=("/home/jsetc/file-dir" "/home/jsetc/dir-dir") i=0 while test $i -lt ${#arr[@]} do if [ -d ${arr[$i]} ] then echo -n "是否需要清空${arr[$i]} 目录【Y/N】}" read chose case $chose in "Y"|"y"|"yes"|"YES") echo "正在清空${arr[$i]}中..." rm -rf ${arr[$i]}/* echo "$arr[$i]已经被清空了..." ;; "N"|"n"|"no"|"NO") echo "${arr[$i]}目录下的内容没有被清空..." ;; *) echo "输入错误" ;; esac else mkdir ${arr[$i]} echo "新建了 ${arr[$i]}这个目录" fi ((i++)) done while true do file=0 dir=0 read -p "输入的要操作的路径>" path if [ -d $path ] then arr1=(`ls $path`) j=0 while test $j -lt ${#arr1[@]} do if [ -f $path/${arr1[$j]} ] then echo "正在拷贝 ${arr1[$j]}文件..." cp $path/${arr1[$j]} ${arr[0]} ((file++)) elif [ -d $path/${arr1[$j]} ] then echo "正在拷贝 ${arr1[$j]}目录..." cp $path/${arr1[$j]} ${arr[1]} -r ((dir++)) fi ((j++)) done elif [ "$path" = "quit" ] then echo "退出程序..." exit 1 else echo "输入的路径不存在,请重试..." continue fi echo "拷贝文件的个数:$file" echo "拷贝目录的个数:$dir" done
(2)for 循环
1. 用法1(c风格)
for((i = 0 ; i < 100;i++)) do 循环体 done
1. 用法2(shell特有的for循环)
for 变量 in 单词列表 do 循环体 done 注意:单词列表的格式 格式1: Ubuntu windows ios redhat 格式2: `ls` 格式3:{start..end} 格式4:如果in和后面的单词列表是缺省的,此时单词列表是命令行的参数
#!/bin/bash for var in ubuntu windows ios iphone do echo $var done
#!/bin/bash for var in `ls` do echo $var done
#!/bin/bash :<<EOF sum=0 for var in {1..100} do ((sum += var)) done echo $sum EOF for var in {A..Z} do echo $var done
1. select in 增强交互效果的循环语句
select 变量 in 单词列表 do 循环体 done
#!/bin/bash select var in windows ubuntu ios Android do echo $var done
#!/bin/bash select var in windows ubuntu ios Android do case $var in "windows") echo "welcome to windows" ;; "ubuntu") echo "welcome to ubuntu" ;; "ios") echo "welcome to ios" ;; "Android") echo "welcome to Android" ;; *) echo "error..." ;; esac done
[6] break 和continue
和c语言语法规则一样,语法格式不一样 break n 退出n层循环 continue n 跳过n层循环,执行下一次循环
[7] goto
一般不建议使用,一般使用于错误处理