Bash用户输入而不匹配变量循环

时间:2016-09-27 23:19:45

标签: bash loops user-input

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

我已经尝试过这样的事情,我认为这样做了:

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确认变量包含数据的每一步,但循环不起作用。

编辑(解决方案,在问题的上下文中,感谢@ LinuxDisciple的答案):

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的默认变量值并向用户输出正确的信息非常重要。

1 个答案:

答案 0 :(得分:1)

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循环中回显变量值,只需在|cat -A之后立即添加done,它就会显示所有字符:

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