2017-07-04 88 views
1

我使用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 0时59分14秒星期二7月4日
城市0.12345
JOB_ID没有找到

很显然,我可以看到,JOB_ID是当前和作业仍在运行... 该模式只认是否有Severa的l作业正在运行,模式在中间:

city.54321/1202133.batch.com kdd046运行4 00:59:14星期二七月4 city.12345/1202110.batch.com kdd046运行4 00: 56:19周二7月4日
city.12345
JOB_ID发现

我使用

也试过...
如果回声 “$ RUNNING” | grep -q“$ Job_ID”;然后
...

但具有相同的结果。

我在做什么错?

+1

你确定从调用返回的字符串,你只包含文本字符?我想知道是否有一些非ascii字符隐藏在那里,使比较混乱。特别是在你的评论如下,如果你手动设置变量,它的工作原理。 – mikea

+0

我试图用以下方法检查:if [[$ RUNNING = * [![:ascii:]] *]];然后 echo“Running contains Non-ASCII” else echo“运行时不包含非ASCII” fi根据既没有RUNNING也没有Job_ID有非ASCII字符(我希望这是正确的方法来检查这一点,我对于bash来说绝对是新的......) – Julia

+1

你可以尝试'声明-p RUNNING'来转储变量的内容而不是'echo'它吗?参考:https://stackoverflow.com/a/41409536/1168342 – Fuhrmanator

回答

1

使用declare -p Job_ID我发现有在变量JOB_ID,这不是一开始换行使用echo显示。

现在,我包括改变摆脱这种额外的线路和它的作品:

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

试试这个:

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

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

(编辑:现在,如果X包含Y)

+0

这'*'最后看起来是错误的,现在只会匹配字符串的开头,我认为这不正确。你能重现OP的问题吗? –

+0

是的,我知道,我正在考虑用OR语句来使用它。无论如何,我编辑了答案,它适用于Bash 4.3,我希望它也可以与3.2一起使用。 –

+0

只要我手动设置字符串运行和Job_ID一切正常。 – Julia