文章目录
一 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
一般不建议使用,一般使用于错误处理