【发布时间】:2014-05-17 22:00:55
【问题描述】:
我正在尝试查看用户输入的输入是否包含在以空格分隔的列表中。
interfaces=`ls /sys/class/net | awk '{ ORS=" "; print; }'`
# Loop until valid input for interface is received
while [[ -z "$interface" || ! "$interfaces" =~ "$interface" ]]
do
echo -n "Select the interface ( "$interfaces"): "
read interface
done
$interfaces 可能包含类似于"eth0 lo wlan0 wlan1 " 的内容,我正在尝试查看用户是否输入了该列表中的接口,如果没有告诉他们再做一次。
我似乎无法弄清楚如何做到这一点。我尝试使用通配符和== 运算符以及与=~ 匹配的正则表达式,但运气不佳。
是否有一种简单而干净的方法来检查用户输入的值是否在我创建的列表/字符串中?
感谢您的帮助!
【问题讨论】:
-
您在当前版本中遇到的问题是什么?
-
@thatotherguy 根据我是使用通配符还是正则表达式,一旦输入有效输入,它就永远不会退出循环,或者无论输入什么输入它都会退出循环。目前使用此代码 sn-p 无论输入如何,它都会退出。
-
确保您正在测试您发布的代码,而不是其他版本或更大的脚本,这是其中的一部分。它对我有用,并一直询问直到我输入
$interfaces的子字符串。 -
仅供参考——见mywiki.wooledge.org/ParsingLs;以编程方式使用
ls绝不是好的做法。interfaces=( /sys/class/net/* ); interfaces=( "${interfaces[@]##*/}" )是获取接口名称数组的更好方法。 (请注意,作为实际数组而不是空格分隔的字符串,扩展它的过程有点不同) -
...或:
interfaces=( /sys/class/net/* ); if [[ " ${interfaces[*]} " =~ " $foo " ]]; then ...,如果您想坚持使用字符串比较来确定成员资格。