2017-07-04 140 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