我试图让用户输入循环,直到输入/名称是唯一的(不包含在输出/变量中(。
我试过做这样的事情,我认为这会奏效:
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
确认了变量包含数据,但循环不起作用。
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