Bashからループの先頭に移動

Bashからループの先頭に移動

forループでif条件を使用しています。 if条件がyesを返す場合は、forループの先頭に戻りたいと思います。バッシュでこれは可能ですか?

#!/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がないことを知っています。脱出口をご提案ください。

答え1

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意味がありません。返品変数とコマンドの置換には二重引用符を入れる必要があります。

ここでロジックを参照してください。検索文字列は次のとおりです。いいえ存在する場合は、クエリを繰り返します。

スクリプトは緊密なループでデータベースを照会するので、ここに何かがありました(質問を単純にするためにコードを省略してください)。

答え2

はい、方法があります。ただし、これは単なる回避策であるため、開発中の新しいスクリプトでは絶対に使用しないでください。

.BATしかし、デスクトップからWindowsからLinuxに移動したときに変換する必要がある既存のファイルが多く、.CMDそのためのロジックを書き換えるつもりはありませんでした。確立されたgotoBashでこれを行う1つの方法は、実行してはいけないスクリプト部分を削除するために独自に実行され、次にすべてを評価するためにgoto function機能します。sed

#!/bin/bash

# BAT / CMD goto function
function goto
{
    label=$1
    cmd=$(sed -n "/^:[[:blank:]][[:blank:]]*${label}/{:a;n;p;ba};" $0 | 
          grep -v ':$')
    eval "$cmd"
    exit
}

apt update

# Just for the heck of it: how to create a variable where to jump to:
start=${1:-"start"}
goto "$start"

: start
goto_msg="Starting..."
echo $goto_msg
# Just jump to the label:
goto "continue"

: skipped
goto_msg="This is skipped!"
echo "$goto_msg"

: continue
goto_msg="Ended..."
echo "$goto_msg"

# following doesn't jump to apt update whereas original does
goto update

Linus Torvaldsが言ったように、私はまったく罪悪感を感じません。

送信者:Linus Torvalds
タイトル:返信:2.6.0-テスト*の可能性はありますか?
日付:2003年1月12日日曜日11:38:35 -0800(PST)

私はgotosが良いと思います。それは特にコードフローが実際に自然にインデントされていない場合はTrueです(この場合はそのため、gotoを使用することは意味がないと思います)。より明確にいいえ、しかし一般的にgotoはとても読みやすいです。)

もちろん、ラベルが説明的ではないPascalのような愚かな言語では、gotoが悪いかもしれません。しかし、これはgotoのせいではなく、言語デザイナーの脳障害です。

コードのソースソース (エラーの可能性を減らすように修正しました)
引用ソース

関連情報