我试图让用户输入循环,直到输入/名称是唯一的(不包含在输出/变量中)。
我已经尝试过这样的事情,我认为这样做了:
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等的各种解决方案但没有成功。我已经尝试了if
,while
,until
,!=
,==
,=~
,但没有成功。
我已经通过简单的调试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
的默认变量值并向用户输出正确的信息非常重要。
答案 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