Bash 在字符串中找不到子字符串

Bash 在字符串中找不到子字符串,bash,Bash,我使用bash版本3.2.51(1) 我与工作链一起工作,希望在旧工作完成后开始新工作。 因此,我检查当前正在运行的作业,只有在找不到上次运行的作业编号时,才会提交新作业 以下是我脚本的一部分: Job_ID=$(msub -E fvcom.pbs) # test whether job is still running CONTINUE="just started" # do this loop, until the CONTINUE variable is

我使用bash版本3.2.51(1)

我与工作链一起工作,希望在旧工作完成后开始新工作。 因此,我检查当前正在运行的作业,只有在找不到上次运行的作业编号时,才会提交新作业

以下是我脚本的一部分:

    Job_ID=$(msub -E fvcom.pbs)

    # test whether job is still running

    CONTINUE="just started"
    # do this loop, until the CONTINUE variable is empty (i.e. job is finished)
    until [ -z "$CONTINUE" ] ; do
       # wait $WAIT seconds
       sleep $WAIT
       # query if job is still running
       RUNNING=$(./show_my_run)
      echo $RUNNING
      echo $Job_ID 

       # check whether specific job is still running
       # then job ID is present in job overview
       if [[ $RUNNING == *"$Job_ID"* ]] ; then
       CONTINUE="Job_ID found"
       echo $CONTINUE
       else 
       CONTINUE=""
       echo "Job_ID not found"
       fi

    done
输出为:

city.12345/1202110.batch.com kdd046运行4 00:59:14星期二7月4日
城市12345
找不到作业ID

显然,我可以看到作业ID存在,并且作业仍在运行。。。 仅当有多个作业正在运行且模式位于中间某个位置时,才能识别该模式:

city.54321/1202133.batch.com kdd046运行4 00:59:14星期二7月4日city.12345/1202110.batch.com kdd046运行4 00:56:19星期二7月4日
城市12345
找到工作ID

我也试过使用


如果echo“$RUNNING”| grep-q“$Job_ID”;然后
...

但结果是一样的

我做错了什么?

试试这个:

RUNNING="city.12345/test"
Job_ID="city.12345"

if [[ "$RUNNING" =~ ".*$Job_ID*" ]]; then
echo "match"
fi
(编辑:现在,如果X包含Y)

尝试以下操作:

RUNNING="city.12345/test"
Job_ID="city.12345"

if [[ "$RUNNING" =~ ".*$Job_ID*" ]]; then
echo "match"
fi

(编辑:现在,如果X包含Y)使用
声明-p作业ID
我发现变量作业ID的开头有一个换行符,没有使用
echo
显示

现在,我加入了一个改变,以摆脱这一额外的行,它的工作:

  Job_ID=$(msub -E fvcom.pbs | perl -p -e 'chomp' )

使用
declare-p Job_ID
我发现变量Job_ID的开头有一个换行符,没有使用
echo
显示

现在,我加入了一个改变,以摆脱这一额外的行,它的工作:

  Job_ID=$(msub -E fvcom.pbs | perl -p -e 'chomp' )

结尾的
*
看起来是错误的,现在只匹配字符串的开头,我认为这是不对的。你能重现OP的问题吗?是的,我知道,我在考虑用这个来表示OR。。无论如何,我编辑了答案,它与Bash 4.3配合使用,我希望它也能与3.2配合使用。只要我手动设置运行字符串和作业ID,一切都正常。问题是,为什么OP看似有效的方法不起作用?最后的
*
看起来是错误的,现在只匹配字符串的开头,我认为这是不对的。你能重现OP的问题吗?是的,我知道,我在考虑用这个来表示OR。。无论如何,我编辑了答案,它适用于Bash 4.3,我希望它也适用于3.2。只要我手动设置运行字符串和作业ID,一切都正常。问题是,为什么OP的看似有效的方法不起作用?您确定调用返回的字符串只包含文本字符吗?我想知道你是否有一些非ascii字符隐藏在那里,混淆了比较。特别是在你在下面的评论中提到,如果你手动设置变量,它是有效的;然后echo“Running contains Non-ASCII”else echo“Running not contains Non-ASCII”fi根据Running和Job_ID都没有非ASCII字符(我希望这是检查这一点的正确方法,我对bash是完全陌生的…)您是否可以尝试
declare-p RUNNING
转储变量的内容,而不是“echo”它?参考:我不知道你是否能得到一个好的答案,除非你提供一个好的答案。你确定你从通话中返回的字符串只包含文本字符吗?我想知道你是否有一些非ascii字符隐藏在那里,混淆了比较。特别是在你在下面的评论中提到,如果你手动设置变量,它是有效的;然后echo“Running contains Non-ASCII”else echo“Running not contains Non-ASCII”fi根据Running和Job_ID都没有非ASCII字符(我希望这是检查这一点的正确方法,我对bash是完全陌生的…)您是否可以尝试
declare-p RUNNING
转储变量的内容,而不是“echo”它?我不知道你是否能得到一个好的答案,除非你提供一个答案