基本上寻找一个包含星号的字符串,四处寻找一个与直接循环有关但却无济于事的字符串!
e.g。用户基本上会继续键入字符串,程序将拒绝它们,直到弹出一个星号。
然后在这一点上它将回复一条消息[无法详细说明抱歉]
代码:
until [ "string" == "[asteriskstuff]" ]
do
echo "just give me a string with an asterisk for crying out loud"
read "string"
done
当用户停止输入hi然后决定输入hi *时,它将显示回声消息 基本上我只想绕过bleedin'星号,因为[asteriskstuff]是我总是动摇的地方!
所有人都非常感谢!
总结:如何以简单的方式绕过星号来进行直接循环?
答案 0 :(得分:6)
chepner's helpful answer很好地解释了原始方法的问题。
以下提示,直到在用户输入中的任何位置找到文字*
:
until [[ $string == *'*'* ]]; do
echo "just give me a string with an asterisk, for crying out loud"
read -r string
done
[[ ... ]]
而不是[ ... ]
才能在==
(=
)的RHS上启用模式匹配
/bin/sh
),但只支持[ ... ]
,请考虑定期使用[[ ... ]]
,因为它提供了更多功能和更少的惊喜:见我的this answer。 *'*'*
是pattern,其中包含:匹配文字 *
- 单引用的部分 - 字符串中的任何地方; 未加引号的 *
实例表示任何字符的运行。
[[ ... =~ ... ]]
提供正则表达式匹配。因此,条件也可以写为[[ $string =~ '*' ]]
或[[ $string =~ \* ]]
-r
应与read
一起使用,以防止意外处理\
字符。
答案 1 :(得分:3)
@mklement's answer实际上提供了一个解决方案;我主要是在描述这个问题。
您没有比较参数string
的值;您正在比较文字字符串string
。这与globs无关(你正在引用正确的东西。
until [ "$string" = "[asteriskstuff]" ]; do
read string
done
您不需要将参数引用到read
,因为它是一个文字字符串,需要是一个有效的标识符,它只能包含_
,字母和数字。然而,引用它并没有伤害。