• 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:判断是否具备可执行权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    #!/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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    练习`

    向脚本输入一个文件的名字,判断输入是否不为空,如果不为空,判断是否是普通文件 如果是普通文件,再
    判断文件是否具备写的权限如果文件不具备就添加写的权限,向文件尾部追加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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    [4] case in语句

    case 变量 in
    匹配选项1)
    语句1;
    匹配选项2)
    语句2;
    匹配选项n)
    语句n;
    匹配选项的格式:
    *:匹配任意字符
    [字符1字符n]:匹配[]内部任意一个字符
    “y”|"yes" :如果有多个可以使用|
    ,|.|:|\"|?: 注意使用者转义字符
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    #!/bin/bash
    read -p "input number >" num
    case $num in
    	1)
    		echo "星期一"
    		;;
    	2)
    		echo "星期二"
    		;;
    	*)
    		echo "输入错误"
    		;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    #!/bin/bash
    read -p "input char > " cc
    case $cc in
    	[0-9]|"10")
    		echo "这是一个数字"	
    		;;
    	[a-zA-Z])
    		echo "这是一个字母"
    		;;
    	,|.|:|\"|?)
    		echo "这是一个标点符号"
    		;;
    	*)
    		echo "输入错误"
    		;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    [5] 循环语句

    (1)while循环

    while 循环条件
    do
    循环体
    done
    
    #!/bin/bash
    sum=0;
    i=0;
    while [ $i -le 100 ]
    do
    	((sum += i++))
    done
    echo $sum
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    练习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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    (2)for 循环

    1. 用法1(c风格)

    for((i = 0 ; i < 100;i++))
    do
    	循环体
    done
    
    • 1
    • 2
    • 3
    • 4

    1. 用法2(shell特有的for循环)

    for 变量 in 单词列表
    do
    	循环体
    done
    注意:单词列表的格式
    格式1: Ubuntu windows ios redhat
    格式2: `ls`
    格式3:{start..end}
    格式4:如果in和后面的单词列表是缺省的,此时单词列表是命令行的参数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    #!/bin/bash
    for var in ubuntu windows ios iphone
    do
    	echo $var
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #!/bin/bash
    for var in `ls`
    do
    	echo $var
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #!/bin/bash
    :<for var in {1..100}
    do
    	((sum += var))
    done
    echo $sum
    EOF
    for var in {A..Z}
    do
    	echo $var
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    1. select in 增强交互效果的循环语句

    select 变量 in 单词列表
    do
    	循环体
    done
    
    • 1
    • 2
    • 3
    • 4
    #!/bin/bash
    select var in windows ubuntu ios Android
    do
    	echo $var
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    #!/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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    [6] break 和continue

    和c语言语法规则一样,语法格式不一样
    break n 退出n层循环
    continue n 跳过n层循环,执行下一次循环
    
    • 1
    • 2
    • 3

    [7] goto

    一般不建议使用,一般使用于错误处理
    
    • 1
  • 相关阅读:
    栈、队列、字符串
    Spring基础(九):代理模式介绍
    使用GPT-4训练数据微调GPT-3.5 RAG管道
    面试官:3 种缓存更新策略是怎样的?
    Hadoop搭建HA遇到的坑
    数仓工具—Hive进阶之Statistics与Analyze Table命令(20)
    三分钟带你了解内网穿透的什么
    环保主题网页制作作业 保护环境网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
    计算机组成原理
    数据结构C++——二叉树的实现
  • 原文地址:https://blog.csdn.net/m0_52592798/article/details/126002773