Bash

在 bash 中轉到循環的開頭

  • February 28, 2019

我在 for 循環中使用 if 條件。如果 if 條件返回 yes,那麼我想再次進入 for 循環的開頭。這在bash中可能嗎?

#!/bin/bash
for i in /apps/incoming/*.sql
do
j=$(egrep "[A-Z]{6}[ ]{1}[@abc_id]{10}[ ]{1}[=]{1}[ ]{1}[0-9]*" $i | awk '{ print $4 }')
#echo $j

#Query database

export ORACLE_HOME=/apps/uc/tmd/oracle/instantclient_11_2
export LD_LIBRARY_PATH=/apps/uc/tmd/oracle/instantclient_11_2
sqlplus=/apps/oracle/instantclient_11_2/sqlplus

tmprnt=$($sqlplus -s abcsd/sakfdj@'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = odsakjfldkjf)(PORT = 1111)))(CONNECT_DATA =(SERVICE_NAME = SFDDFD)(SRVR = DEDICATED)))' << EOF

SELECT name from blabla where abc_id='$j';
EOF)

if `echo ${tmprnt} | grep "${searchString1}" 1>/dev/null 2>&1`
then
 GO TO the start of FOR IN loop and run the query again. 

因此,如果 IF 條件中的上述 tmprnt 變數與搜尋字元串匹配,那麼我想再次執行該東西(SQL 查詢有時會返回“未選擇行”,但它會以某種方式在我們再次執行時返回正確的結果)。我知道 bash 中沒有 GO TO。請提出出路。

如果要繼續下一個查詢,請使用該continue語句。

如果要重複相同的查詢,請使用循環。您想重複查詢,因此請編寫一個執行此操作的腳本,而不是使用您正在使用的語言中甚至不存在的低級構造來掩飾您的意圖。

for i in /apps/incoming/*.sql
do
 while
   j=$(…)
   …
   ! echo "${tmprnt}" | grep "${searchString1}" 1>/dev/null 2>&1
 do
   … # whatever you want to do when $tmprnt has the right format
 done
done

我將您編寫的條件語句更正為您可能的意思——將輸出grep作為 shell 片段執行沒有意義。還要記住在變數和命令替換周圍加上雙引號

注意這裡的邏輯:當搜尋字元串存在時,重複查詢。

該腳本將在一個緊密的循環中查詢數據庫,因此這裡缺少一些東西(希望您只是省略了程式碼以保持問題簡單)。

引用自:https://unix.stackexchange.com/questions/355078