测试字符串是否包含文字星号

时间:2016-12-12 15:07:54

标签: string bash loops unix

基本上寻找一个包含星号的字符串,四处寻找一个与直接循环有关但却无济于事的字符串!

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]是我总是动摇的地方!

所有人都非常感谢!

总结:如何以简单的方式绕过星号来进行直接循环?

2 个答案:

答案 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上启用模式匹配

    • 除非您正在编写符合POSIX标准的脚本(适用于/bin/sh),但只支持[ ... ],请考虑定期使用[[ ... ]],因为它提供了更多功能和更少的惊喜:见我的this answer
  • *'*'*pattern,其中包含:匹配文字 * - 单引用的部分 - 字符串中的任何地方; 未加引号的 *实例表示任何字符的运行。

    • 这些模式与文件名通配符中使用的模式相同,并且不是正则表达式。
    • 但是,Bash还通过[[ ... =~ ... ]]提供正则表达式匹配。因此,条件也可以写为[[ $string =~ '*' ]][[ $string =~ \* ]]
  • -r应与read一起使用,以防止意外处理\字符。

答案 1 :(得分:3)

@mklement's answer实际上提供了一个解决方案;我主要是在描述这个问题。

您没有比较参数string;您正在比较文字字符串string。这与globs无关(你正在引用正确的东西。

until [ "$string" = "[asteriskstuff]" ]; do
  read string
done

您不需要将参数引用到read,因为它是一个文字字符串,需要是一个有效的标识符,它只能包含_,字母和数字。然而,引用它并没有伤害。