在字符串中找不到子串
我使用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”;然后
...
但具有相同的结果。
我在做什么错?
使用declare -p Job_ID
我发现有在变量JOB_ID,这不是一开始换行使用echo
显示。
现在,我包括改变摆脱这种额外的线路和它的作品:
Job_ID=$(msub -E fvcom.pbs | perl -p -e 'chomp')
试试这个:
RUNNING="city.12345/test"
Job_ID="city.12345"
if [[ "$RUNNING" =~ ".*$Job_ID*" ]]; then
echo "match"
fi
(编辑:现在,如果X包含Y)
这'*'最后看起来是错误的,现在只会匹配字符串的开头,我认为这不正确。你能重现OP的问题吗? –
是的,我知道,我正在考虑用OR语句来使用它。无论如何,我编辑了答案,它适用于Bash 4.3,我希望它也可以与3.2一起使用。 –
只要我手动设置字符串运行和Job_ID一切正常。 – Julia
你确定从调用返回的字符串,你只包含文本字符?我想知道是否有一些非ascii字符隐藏在那里,使比较混乱。特别是在你的评论如下,如果你手动设置变量,它的工作原理。 – mikea
我试图用以下方法检查:if [[$ RUNNING = * [![:ascii:]] *]];然后 echo“Running contains Non-ASCII” else echo“运行时不包含非ASCII” fi根据既没有RUNNING也没有Job_ID有非ASCII字符(我希望这是正确的方法来检查这一点,我对于bash来说绝对是新的......) – Julia
你可以尝试'声明-p RUNNING'来转储变量的内容而不是'echo'它吗?参考:https://stackoverflow.com/a/41409536/1168342 – Fuhrmanator