shell编程增强

一 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

一般不建议使用,一般使用于错误处理

猜你喜欢

转载自blog.csdn.net/m0_52592798/article/details/126002773