Bash用户输入,但与变量循环不匹配



我试图让用户输入循环,直到输入/名称是唯一的(不包含在输出/变量中(。

我试过做这样的事情,我认为这会奏效:

read -p "$QlabelName" input
while [[ "$input" == "$(/usr/sbin/networksetup -listallnetworkservices |grep "$input")" ]]; do
read -p "Name already in use, please enter a unique name:" input
done

我还尝试过将$(/usr/sbin/networksetup -listallnetworkservices |grep "$input")位放入变量本身,然后使用条件[[ "$input" == "GREPVARIABLE" ]],但没有成功。

原始用户输入菜单,无循环(工作(:

labelName=NJDC
QlabelName=$(echo Please enter the name of connection to be displayed from within the GUI [$labelName]: )
read -p "$QlabelName" input
labelName="${input:-$labelName}"
echo "The connection name will be set to: '$labelName'"

我尝试过SO、Unix、ServerFault等各种解决方案,但都没有成功。我也尝试过ifwhileuntil!====~,但都没有成功。

我已经在每个步骤中用简单的调试echo确认了变量包含数据,但循环不起作用。

EDIT(解决方案,在问题的上下文中,感谢@Linux门徒的回答(:

labelName=NJDC
QlabelName=$(echo Please enter the name of connection to be displayed from within the GUI [$labelName]: )
read -p "$QlabelName" input
while /usr/sbin/networksetup -listallnetworkservices |grep -q "^${input}$"; do
    read -p "Name already in use, please enter a unique name:" input
done
labelName="${input:-$labelName}"
echo "The connection name will be set to: '$labelName'"

对我来说,保持labelName的默认变量值并向用户输出正确的信息非常重要。

read -p "$QlabelName" input
while /usr/sbin/networksetup -listallnetworkservices |grep -q "^${input}$"; do
    read -p "Name already in use, please enter a unique name:" input
done

grep的返回代码对于while来说已经足够好了,因为我们不想实际看到输出,所以我们可以使用-q来抑制它。你也可以在没有-q的情况下运行它,看看grep实际找到了什么,直到你确信它运行正确为止。

为了进一步的可调试性,我将输出管道传输到cat -A。您可以在while循环中回显您的变量值,只需在done之后立即添加|cat -A,它就会显示所有字符:

read -p "$QlabelName" input
while /usr/sbin/networksetup -listallnetworkservices |grep -q "^${input}$"; do
    read -p "Name already in use, please enter a unique name:" input
    echo "Input was:'$input'"
done |cat -A

相关内容

  • 没有找到相关文章

最新更新