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

Stu*_*Art 4 unix string bash loops

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

例如,用户基本上会继续键入字符串,程序将拒绝它们,直到弹出一个带星号的字符串.

然后在这一点上它会回复一条消息[不能详细说明抱歉]

码:

until [ "string" == "[asteriskstuff]" ]
do

  echo "just give me a string with an asterisk for crying out loud"

  read "string"

done
Run Code Online (Sandbox Code Playgroud)

当用户停止输入hi然后决定输入hi*它将显示回声消息基本上我只想绕过bleedin'星号因为[asteriskstuff]是我总是动摇的区域!

所有帮助赞赏!

摘要:如何以直接循环的简单方式绕过星号?

mkl*_*nt0 6

chepner的有用答案很好地解释了原始方法的问题.

以下提示,直到*在用户输入中的任何位置找到文字:

until [[ $string == *'*'* ]]; do
  echo "just give me a string with an asterisk, for crying out loud"
  read -r string
done
Run Code Online (Sandbox Code Playgroud)
  • [[ ... ]]而不是[ ... ]必须使用,以便在()的RHS上启用模式匹配.===

    • 除非您正在编写符合POSIX标准的脚本(/bin/sh[ ... ]支持),否则请考虑[[ ... ]]常规使用,因为它提供了更多功能和更少的意外:请参阅我的这个答案.
  • *'*'*是一种模式 ,表示:匹配文字 * - 单引号部分 - 字符串中的任何位置; 在不带引号的 *情况下,代表任意字符的运行.

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