3-Shell分支语句

Shell 分支语句

单分支if

语法:

if 条件测试; then

命令序列

fi

注:条件测试可以是判断语句也可以是任何有返回值的命令(执行成功—返回0—假)

实例:

  • 输入用户名和密码新建用户

    #!/bin/bash
    read -p "请输入用户名:" user
    read -p "请输入密码:" pass
    if [[ ! -z "$user" && ! -z "$pass" ]]; then
        useradd "$user"
        echo "$pass" | passwd --stdin "$user"
    fi
    
  • 脚本自动测试

    #!/bin/bash
    if ! mkdir "/media/cdrom"; then
        echo "failed to create cdrom directory"
    fi
    if ! yum -y -q install ABC; then
        echo "failed to install ABC"
    fi
    
  • 判断服务状态:启动、关闭、自启动

    #!/bin/bash
    if [ -z $1 ]; then
        echo "错误:未输入服务名称"
        echo "用法:脚本名 服务名"
        exit        #退出脚本
    fi
    if systemctl is-active $1 &>/dev/null ; then
        echo "$1 已经启动"
    else
        echo "$1 未启动"
    fi
    if systemctl is-enabled $1 &>/dev/null ; then
        echo "$1 是开机自动启动"
    else
        echo "$1不是开机自动启动"
    fi
    
  • 配置VNC远程桌面访问服务端

    #!/bin/bash
    rpm --quiet -q tigervnc-server			#检查是否安装tigervnc-server
    if [[ $? -ne 0 ]]; then
        yum -y install tigervnc-server
    fi
    x0vncserver AcceptKeyEvents=0 AcceptPointerEvents=0 \
    AlwaysShared=1 SecurityTypes=None rfbport=5908
    

    AcceptPointerEvents:是否接受鼠标控制;0——禁止,1——允许

    AcceptKeyEvents:是否接受键盘控制;0——禁止,1——允许

    AlwaysShared:是否支持多人共享;0——禁止,1——支持

    SecurityType:是否需要输入密码;None——不需要,VncAuth——需要

    rfbport:远程桌面连接端口

    客户端:

    yum -y install tigervnc
    vncviewer server_ip:5908
    

双分支if

语法:

if 条件测试; then

命令序列1

else

命令序列2

fi

实例:

  • 判断主机是否可以ping通

    #!/bin/bash
    if [[ -z "$1" ]]; then
        echo -n "用法: 脚本"
        echo -e "\033[32m 域名或IP\033[0m"
        exit
    fi
    
    ping -c2 -i0.1 -W1 "$1" &>/dev/null
    if [[ $? -eq 0 ]]; then
        echo "$1 is up"
    else
        echo "$1 is down"
    fi
    

多分支if

语法:

if 条件测试1; then

命令序列1

elif 条件测试2; then

命令序列2

elif 条件测试3; then

命令序列3

else

命令序列n

fi

实例:

  • 猜数游戏

    #!/bin/bash
    clear
    num=$[RANDOM%10+1]
    read -p "请输入1~10之间的整数:" guess
    if [[ ${guess} -eq ${num} ]]; then
        echo "恭喜,猜对了!"
    elif [[ ${guess} -lt ${num} ]]; then
        echo "Oops, 猜小了"
    else
        echo "Oops, 猜大了"
    fi
    

多分支case

语法:

case value in

模式1|模式2|模式3)

命令序列1;;

模式4|模式5|模式6)

​ 命令序列1;;

*)

​ 命令序列n;;

esac

实例:

  • 字母比较

    #!/bin/bash
    read -p "请输入一个a~c之间的字母:" key
    case $key in
    a)
    	echo "I am a.";;
    b)
    	echo "I am b.";;
    c) 	
    	echo "I am c.";;
    
  • 通配符

    符号描述
    *匹配任意字符串
    匹配任意单个字符
    […]匹配括号中任意单个字符
    #!/bin/bash
    read -p "请输入任意字符:" key
    case $key in
    [a-z])
    	echo "小写字母";;
    [A-Z])
    	echo "大写字母";;
    [0-9])
    	echo "数字";;
    
<think>嗯,用户询问了Shell分支语句中“commandnotfound”错误的原因和解决方法。需要结合引用的内容来思考这个问题。回顾一下用户提到的四个引用内容。引用1中的exit.sh脚本在运行后显示“haha:commandnotfound127”,这个错误和用户的问题一致。引用3提到了Shell根据$?返回值判断命令是否成功执行,非0值代表失败,127这个错误码正是命令未找到的返回值。引用4中的inputwhat.sh脚本运行出错,错误信息是语法错误。用户的问题在于执行Shell分支语句时遇到命令未找到错误。这可能由三个原因导致:1.脚本中直接使用了未被定义的命令,如引用1中的haha命令,因为它没有被安装或路径错误2.分支语句语法结构错误,例如引用4中脚本报语法错误3.函数调用错误或未定义的函数被使用在解决方法上需要考虑:-使用type命令检查命令是否真实存在-正确配置PATH环境变量-使用相对路径调用命令时应该明确路径-需要检查分支控制语句的格式,如if和case是否完整闭合-通过ShellCheck工具检测语法这个回答应当包含两个主要部分:错误原因分析(从使用、语法、函数三方面展开)和具体的解决方法。解决方案需要包含实用的代码片段示例(如引用2中的case语法和引用4中的if语句)来直观说明正确写法。相关问题部分需要覆盖脚本调试、返回值处理、分支语句应用等实用技术点。</think> Shell脚本分支语句(如`if`/`case`)中出现`command not found`错误的常见原因及解决方案如下: ### 错误原因分析 1. **命令不存在或拼写错误** - 分支条件中调用了未安装的命令(如引用1的`haha`命令) - 命令名称拼写错误(如`ls`写成`sl`) 2. **路径配置问题** - 未将命令所在路径加入`$PATH`环境变量 - 使用了相对路径但未明确执行路径(如`./script.sh`写成`script.sh`) 3. **语法结构错误** - 分支语句闭合错误(如引用4中缺失`fi`导致的后续`elif`报错) - 条件表达式格式错误(如`[ ]`内缺少空格) 4. **函数未定义** - 调用了未声明的函数(引用2的`case`语句中调用未定义函数) --- ### 解决方案及代码示例 1. **检查命令是否存在** ```bash if type -p command_name >/dev/null; then command_name # 确保命令存在再执行 else echo "命令不存在" fi ``` 2. **显式指定命令路径** ```bash # 使用绝对路径 if /usr/bin/command_name; then ... fi # 或添加到PATH export PATH="/custom/path:$PATH" ``` 3. **验证语法结构(引用2/4示例修正)** ```bash # 正确if结构(注意空格和闭合) if [ -f "$file" ]; then # 方括号内两侧必须有空格 echo "Regular file" fi # 必须有闭合标签 # 正确case结构(引用2) case $var in pattern1) /bin/valid_command ;; # 使用完整路径 pattern2) func_defined ;; # 确保函数已定义 esac ``` 4. **调试方法** ```bash # 检查命令返回值(引用1/3) command_to_run if [ $? -ne 0 ]; then # $?获取上条命令返回值 echo "命令执行失败,错误码: $?" fi # 使用-x参数调试 bash -x script.sh # 显示每条执行命令 ``` --- ### 关键检查点 | 检查项 | 命令/方法 | 作用 | |----------------|--------------------------|-------------------------| | 命令是否存在 | `type -p command` | 验证命令路径 | | 语法验证 | `shellcheck script.sh` | 静态语法分析工具 | | 返回值检测 | `echo $?` | 确认上条命令状态(引用1/3)| | 路径检查 | `echo $PATH` | 查看环境变量配置 | > 注:当报错行号指向`if`/`case`等关键词时(如引用4的`line 21: elif`),通常是前序语句缺少闭合标签(如遗漏`fi`)导致解释器无法识别分支结构[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值