如果bash命令的输出为空,请执行

时间:2017-08-08 08:09:24

标签: linux bash scripting

嗨,我是bash的新手所以请原谅我,如果我有一个非常愚蠢/容易的问题。我正在编写一个脚本,允许用户更改其区域(无线)。我想要做的是检查到位,所以如果他们输入的值不正确,它会再次提示输入该区域。我想通过检查命令sudo iw reg set $reg的输出来做到这一点,如果它是正确的输入,则没有输出。但如果输入错误,则会显示错误消息。我试图这样做,但我得到一个错误:

#!/bin/bash
echo "Please set a region: " 
read reg

if [(sudo iw reg set $reg) -ne 0]; then
    echo "Please set a valid region: "  
    read reg

else    
    echo "Setting reg as $reg"
    sudo iw reg set $reg 
fi

提前致谢

2 个答案:

答案 0 :(得分:3)

您可以在read循环中使用while

while read -r -p "Please set a valid region: " reg; do    
   [[ -z "$(sudo iw reg set $reg)" ]] && break
done

help read给出了这个:

  • -r不允许反斜杠转义任何字符
  • -p prompt输出字符串PROMPT,之前没有尾随换行符         试图阅读
  • $(...)command substitution来执行命令并返回输出
  • 当给定字符串参数(-z命令的输出)为空时,
  • true返回iw

答案 1 :(得分:2)

您可以使用-z测试,在Bash中输入help test了解详情(test[命令相同)。

您应该只调用iw reg set一次,除非失败。

echo "Please set a region: "

while true # infinite loop
do

    # read in the region:
    read reg

    # try the command, and catch its output:
    output=$( sudo iw reg set "$reg" 2>&1 )

    if [ -z "$output" ]
    then
        # output is empty - success - leave the loop:
        break
    else
        # output is non-empty - continue:
        echo "Please set a valid region. "
    fi

done

此代码段会检查您在问题中提供的成功条件(空输出),但应注意,如果可能,通常应使用退出代码。

注意2>&1运算符将stderr重定向到stdout,因此任何文件描述符的输出都将被视为失败。