shell脚本(4)一文解决比较运算符&用户交互

免责声明

学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。

笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。

比较运算符

在Shell脚本中,比较运算符用于比较两个值并返回一个布尔值(真或假)。以下是一些常见的比较运算符及其用法:

数值比较运算符

这些运算符用于比较整数或浮点数。

  • -eq:等于

  • -ne:不等于

  • -lt:小于

  • -le:小于等于

  • -gt:大于

  • -ge:大于等于

    #!/bin/bash

    num1=10
    num2=20

    if [ $num1 -eq $num2 ]; then
    echo "num1 等于 num2"
    elif [ $num1 -ne $num2 ]; then
    echo "num1 不等于 num2"
    fi

    if [ $num1 -lt $num2 ]; then
    echo "num1 小于 num2"
    fi

    if [ $num1 -le $num2 ]; then
    echo "num1 小于等于 num2"
    fi

    if [ $num1 -gt $num2 ]; then
    echo "num1 大于 num2"
    fi

    if [ $num1 -ge $num2 ]; then
    echo "num1 大于等于 num2"
    fi

字符串比较运算符

这些运算符用于比较字符串。

  • =:相等

  • !=:不相等

  • <:小于(按字典顺序)

  • >:大于(按字典顺序)

  • -z:检查字符串是否为空

    #!/bin/bash

    str1="hello"
    str2="world"

    if [ "str1" = "str2" ]; then
    echo "str1 等于 str2"
    elif [ "str1" != "str2" ]; then
    echo "str1 不等于 str2"
    fi

    if [ "str1" \< "str2" ]; then
    echo "str1 小于 str2"
    fi

    if [ "str1" \> "str2" ]; then
    echo "str1 大于 str2"
    fi

    if [ -z "$str1" ]; then
    echo "str1 是空字符串"
    else
    echo "str1 不是空字符串"
    fi

文件比较运算符

这些运算符用于比较文件的状态或属性。

  • -e:文件存在

  • -d:文件是目录

  • -f:文件是普通文件

  • -r:文件可读

  • -w:文件可写

  • -x:文件可执行

  • -s:文件非空

  • -O:文件属于当前用户

  • -G:文件的组ID与当前用户相同

  • -nt:文件1比文件2新

  • -ot:文件1比文件2旧

    #!/bin/bash

    file1="file1.txt"
    file2="file2.txt"

    if [ -e "$file1" ]; then
    echo "file1 存在"
    fi

    if [ -d "$file1" ]; then
    echo "file1 是目录"
    fi

    if [ -f "$file1" ]; then
    echo "file1 是普通文件"
    fi

    if [ -r "$file1" ]; then
    echo "file1 可读"
    fi

    if [ -w "$file1" ]; then
    echo "file1 可写"
    fi

    if [ -x "$file1" ]; then
    echo "file1 可执行"
    fi

    if [ -s "$file1" ]; then
    echo "file1 非空"
    fi

    if [ -O "$file1" ]; then
    echo "file1 属于当前用户"
    fi

    if [ -G "$file1" ]; then
    echo "file1 的组ID与当前用户相同"
    fi

    if [ "file1" -nt "file2" ]; then
    echo "file1 比 file2 新"
    fi

    if [ "file1" -ot "file2" ]; then
    echo "file1 比 file2 旧"
    fi

注意事项

  1. 在比较字符串时,建议将变量放在双引号中,以防止空格和其他特殊字符引起的问题。

  2. 在比较数值时,不需要使用双引号。

  3. 字符串比较时,<> 需要转义,否则会被解释为重定向操作符。

应用场景

在Shell脚本中,比较运算符被广泛应用于各种场景,以实现条件判断和逻辑控制。以下是一些常见的使用场景:

1. 输入验证

在脚本开始时,可以使用比较运算符来验证用户输入或命令行参数是否符合预期。

#!/bin/bash

if [ "$#" -ne 2 ]; then
    echo "用法: $0 <数字1> <数字2>"
    exit 1
fi

num1=$1
num2=$2

if ! [[ "$num1" =~ ^[0-9]+$ ]] || ! [[ "$num2" =~ ^[0-9]+$ ]]; then
    echo "错误: 请输入两个整数"
    exit 1
fi

2. 条件执行

根据不同的条件执行不同的命令或代码块。

#!/bin/bash

num=10

if [ $num -lt 5 ]; then
    echo "数字小于5"
elif [ $num -ge 5 ] && [ $num -le 10 ]; then
    echo "数字在5到10之间"
else
    echo "数字大于10"
fi

3. 循环控制

在循环结构中,可以使用比较运算符来控制循环的执行次数或条件。

#!/bin/bash

for ((i=0; i<10; i++)); do
    echo "当前数字: $i"
done

count=0
while [ $count -lt 5 ]; do
    echo "计数器: $count"
    count=$((count + 1))
done

4. 文件操作

在进行文件操作时,可以使用比较运算符来检查文件的存在性、权限等属性。

#!/bin/bash

file="example.txt"

if [ -e "$file" ]; then
    echo "文件存在"
else
    echo "文件不存在"
fi

if [ -r "$file" ]; then
    echo "文件可读"
else
    echo "文件不可读"
fi

5. 数组操作

在处理数组时,可以使用比较运算符来检查数组的长度、元素等。

#!/bin/bash

arr=("apple" "banana" "cherry")

if [ ${#arr[@]} -eq 3 ]; then
    echo "数组长度为3"
else
    echo "数组长度不为3"
fi

if [ "${arr[0]}" = "apple" ]; then
    echo "数组第一个元素为apple"
else
    echo "数组第一个元素不为apple"
fi

6. 逻辑运算

结合逻辑运算符(&&||),可以实现更复杂的条件判断。

#!/bin/bash

num=10

if [ $num -gt 5 ] && [ $num -lt 15 ]; then
    echo "数字在5到15之间"
elif [ $num -le 5 ] || [ $num -ge 15 ]; then
    echo "数字不在5到15之间"
fi

7. 脚本错误处理

在脚本中添加错误处理逻辑,以确保在遇到问题时能够及时退出并给出提示。

#!/bin/bash

command_output=$(some_command)

if [ $? -ne 0 ]; then
    echo "执行some_command时出错"
    exit 1
fi

这些仅仅是Shell脚本中使用比较运算符的一些常见场景,实际上,比较运算符可以应用于任何需要条件判断和逻辑控制的场景。

脚本与用户交互

1. 使用 read 命令

read 命令可以从标准输入读取一行数据,并将其存储到变量中。

#!/bin/bash

echo "请输入你的名字:"
read name
echo "你好,$name!"

2. 使用 select 命令

select 命令可以创建一个菜单供用户选择。

#!/bin/bash

echo "请选择一个选项:"
select option in "选项1" "选项2" "选项3"; do
    case $option in
        "选项1")
            echo "你选择了选项1"
            ;;
        "选项2")
            echo "你选择了选项2"
            ;;
        "选项3")
            echo "你选择了选项3"
            ;;
        *)
            echo "无效的选择"
            ;;
    esac
    break
done

3. 使用 dialog 工具

dialog 是一个用于创建图形化界面的工具,可以在终端中显示对话框。

首先,确保你已经安装了 dialog 工具:

sudo apt-get install dialog  # 在Debian/Ubuntu系统上

然后,你可以使用 dialog 创建一个简单的对话框:

#!/bin/bash

dialog --title "选择操作" --menu "请选择一个操作:" 10 30 3 1 "选项1" 2 "选项2" 3 "选项3" 2> /tmp/menu.result

choice=$(cat /tmp/menu.result)

case $choice in
    1)
        echo "你选择了选项1"
        ;;
    2)
        echo "你选择了选项2"
        ;;
    3)
        echo "你选择了选项3"
        ;;
    *)
        echo "无效的选择"
        ;;
esac

4. 使用 whiptail 工具

whiptail 是另一个用于创建图形化界面的工具,类似于 dialog

首先,确保你已经安装了 whiptail 工具:

sudo apt-get install whiptail  # 在Debian/Ubuntu系统上

然后,你可以使用 whiptail 创建一个简单的菜单:

#!/bin/bash

choice=$(whiptail --title "选择操作" --menu "请选择一个操作:" 10 30 3 1 "选项1" 2 "选项2" 3 "选项3" 3>&1 1>&2 2>&3)

case $choice in
    1)
        echo "你选择了选项1"
        ;;
    2)
        echo "你选择了选项2"
        ;;
    3)
        echo "你选择了选项3"
        ;;
    *)
        echo "无效的选择"
        ;;
esac

5. 使用 expect 工具

expect 是一个用于自动化交互式应用程序的工具,通常用于自动化SSH登录等操作。

首先,确保你已经安装了 expect 工具:

sudo apt-get install expect  # 在Debian/Ubuntu系统上

然后,你可以使用 expect 自动化交互过程:

#!/usr/bin/expect -f

spawn ssh user@hostname
expect "password:"
send "your_password\r"
expect "$ "
send "your_command\r"
expect "$ "
send "exit\r"
expect eof

这些方法可以帮助你在Shell脚本中实现与用户的交互。选择哪种方法取决于你的具体需求和环境。

检测用户输入

在Shell脚本中检测用户输入可以通过条件语句和比较运算符来实现。以下是一些常见的方法:

1. 使用 if 语句和比较运算符

你可以使用 if 语句和比较运算符(如 -eq, -ne, -lt, -le, -gt, -ge)来检测用户输入的数值。

#!/bin/bash

echo "请输入一个整数:"
read number

if [ $number -eq 0 ]; then
    echo "你输入的是0"
elif [ $number -gt 0 ]; then
    echo "你输入的是正数"
else
    echo "你输入的是负数"
fi

2. 使用 case 语句

case 语句可以用于检测用户输入的字符串。

#!/bin/bash

echo "请输入一个选项(A/B/C):"
read option

case $option in
    A)
        echo "你选择了A"
        ;;
    B)
        echo "你选择了B"
        ;;
    C)
        echo "你选择了C"
        ;;
    *)
        echo "无效的选择"
        ;;
esac

3. 使用正则表达式

你可以使用正则表达式来检测用户输入的格式。

#!/bin/bash

echo "请输入一个邮箱地址:"
read email

if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
    echo "有效的邮箱地址"
else
    echo "无效的邮箱地址"
fi

4. 使用 grep 命令

你还可以使用 grep 命令来检测用户输入是否匹配某个模式。

#!/bin/bash

echo "请输入一个URL:"
read url

if echo "$url" | grep -qE '^(https?|ftp)://[^"]+$'; then
    echo "有效的URL"
else
    echo "无效的URL"
fi

5. 使用 getopts 命令

getopts 是一个用于解析命令行选项的Shell内置命令。

#!/bin/bash

while getopts ":a:b:" opt; do
    case $opt in
        a)
            echo "选项a被设置,值为:$OPTARG"
            ;;
        b)
            echo "选项b被设置,值为:$OPTARG"
            ;;
        \?)
            echo "无效的选项:$OPTARG" >&2
            ;;
        :)
            echo "选项 -$OPTARG 需要一个参数。" >&2
            ;;
    esac
done

shift $((OPTIND-1))

echo "剩余的参数:$@"

这些方法可以帮助你在Shell脚本中检测用户输入,并根据输入执行相应的操作。选择哪种方法取决于你的具体需求和环境。

编写交互式shell脚本

编写一个交互式Shell脚本通常涉及接收用户输入并根据输入执行相应的操作。以下是一个简单的示例,展示了如何编写一个交互式Shell脚本:

示例:简单的交互式Shell脚本

#!/bin/bash

# 提示用户输入名字
echo "请输入你的名字:"

# 使用read命令读取用户输入并存储在变量name中
read name

# 输出问候语
echo "你好,$name!"

# 提示用户输入年龄
echo "请输入你的年龄:"

# 使用read命令读取用户输入并存储在变量age中
read age

# 输出年龄信息
echo "你的年龄是:$age岁"

# 提示用户选择操作
echo "请选择一个操作:"
echo "1. 显示当前日期"
echo "2. 显示当前时间"
echo "3. 退出"

# 使用read命令读取用户选择并存储在变量choice中
read choice

# 根据用户选择执行相应的操作
case $choice in
    1)
        echo "当前日期是:$(date +%Y-%m-%d)"
        ;;
    2)
        echo "当前时间是:$(date +%H:%M:%S)"
        ;;
    3)
        echo "退出程序"
        exit 0
        ;;
    *)
        echo "无效的选择"
        ;;
esac

解释

  1. Shebang (#!/bin/bash):

    • 这行告诉系统使用/bin/bash解释器来执行这个脚本。
  2. 提示用户输入名字:

    • echo "请输入你的名字:" 输出提示信息。
  3. 读取用户输入:

    • read name 读取用户输入的名字并存储在变量name中。
  4. 输出问候语:

    • echo "你好,$name!" 使用变量name输出问候语。
  5. 提示用户输入年龄:

    • echo "请输入你的年龄:" 输出提示信息。
  6. 读取用户输入:

    • read age 读取用户输入的年龄并存储在变量age中。
  7. 输出年龄信息:

    • echo "你的年龄是:$age岁" 使用变量age输出年龄信息。
  8. 提示用户选择操作:

    • echo "请选择一个操作:" 和后续的echo命令输出操作选项。
  9. 读取用户选择:

    • read choice 读取用户选择的操作并存储在变量choice中。
  10. 根据用户选择执行相应的操作:

    • case $choice in ... esac 结构根据用户的选择执行相应的操作。

运行脚本

  1. 将上述脚本保存到一个文件中,例如interactive_script.sh

  2. 赋予脚本执行权限:

    chmod +x interactive_script.sh
    
  3. 运行脚本:

    ./interactive_script.sh
    

这样,你就可以看到一个简单的交互式Shell脚本,它会提示用户输入名字和年龄,并根据用户的选择显示当前日期或时间。

相关推荐
2401_857439695 分钟前
药香科技:Spring Boot中药实验管理新探索
数据库·spring boot·科技
简简单单一天吃六顿8 分钟前
rootfs根文件系统在Linux下制作动态库
linux·服务器·arm开发·iot
AirDroid_cn9 分钟前
投屏软件有没有Linux版本?怎样让两台Linux(远程)相互投屏?
linux·运维·服务器·电脑投屏·远程投屏
五月高高13 分钟前
Linux 实现自动登陆远程机器
linux·运维
TJ-周月年33 分钟前
24首届数证杯(流量分析部分)
网络安全
不会调制解调的猫36 分钟前
笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像
服务器·笔记·macos·docker·容器
始终奔跑在路上36 分钟前
安全见闻-泷羽sec课程笔记
笔记·安全·网络安全
不想睡觉的橘子君40 分钟前
【MySQL】explain之type类型
数据库·mysql
小小不董1 小时前
Oracle OCP认证考试考点详解082系列19
java·运维·服务器·数据库·oracle·dba
踩着阴暗的自己向上爬1 小时前
第2章-PostgreSQL 15安装及登录
数据库·postgresql·dba