ネストされたループでシェルスクリプトを終了する

user923487

ネストされたループを持つシェルスクリプトがあり、「exit」が実際にはスクリプトを終了せず、現在のループのみを終了することがわかりました。特定のエラー状態でスクリプトを完全に終了する別の方法はありますか?

「set-e」は使いたくありません。許容できるエラーがあり、書き直しが多すぎるからです。

現在、killを使用してプロセスを手動で強制終了していますが、これを行うにはもっと良い方法があるはずです。

マイクS

あなたの問題は、それ自体がネストされたループではありません。1つ以上の内部ループがサブシェルで実行されているということです。

これは機能します:

#!/bin/bash

for i in $(seq 1 100); do
        echo i $i
        for j in $(seq 1 10) ; do
                echo j $j
                sleep 1
                [[ $j = 3 ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        echo "After the j loop."
done
echo "After all the loops."

出力:

i 1
j 1
j 2
j 3
I've had enough!

これはあなたが説明した問題を提示します:

#!/bin/bash

for i in $(seq 1 100); do
        echo i $i
        cat /etc/passwd | while read line; do
                echo LINE $line
                sleep 1
                [[ "$line" = "daemon:x:2:2:daemon:/sbin:/sbin/nologin" ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        echo "After the j loop."
done    
echo "After all the loops."

出力:

i 1
LINE root:x:0:0:root:/root:/bin/bash
LINE bin:x:1:1:bin:/bin:/sbin/nologin
LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!
After the j loop.
i 2
LINE root:x:0:0:root:/root:/bin/bash
LINE bin:x:1:1:bin:/bin:/sbin/nologin
LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!
After the j loop.
i 3
LINE root:x:0:0:root:/root:/bin/bash
(...etc...)

これが解決策です。サブシェルで実行される内部ループの戻り値をテストする必要があります。

#!/bin/bash

for i in $(seq 1 100); do
        echo i $i
        cat /etc/passwd | while read line; do
                echo LINE $line
                sleep 1
                [[ "$line" = "daemon:x:2:2:daemon:/sbin:/sbin/nologin" ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        err=$?; [[ $err != 0 ]] && exit $err
        echo "After the j loop."
done
echo "After all the loops."

テストに注意してください: [[ $? != 0 ]] && exit $?

出力:

i 1
LINE root:x:0:0:root:/root:/bin/bash
LINE bin:x:1:1:bin:/bin:/sbin/nologin
LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!

編集:現在のサブシェルを確認するには、「answer」スクリプトを変更して、現在のシェルのプロセスIDを通知します。注:これはbash4でのみ機能します。

#!/bin/bash

for i in $(seq 1 100); do
        echo pid $BASHPID i $i
        cat /etc/passwd | while read line; do
                echo pid $BASHPID LINE $line
                sleep 1
                [[ "$line" = "daemon:x:2:2:daemon:/sbin:/sbin/nologin" ]] && { echo "I've had enough!" 1>&2; exit 1; }
        done
        err=$?; [[ $err != 0 ]] && echo pid $BASHPID && exit $err
        echo "After the j loop."
done
echo "After all the loops."

出力:

pid 31793 i 1
pid 31796 LINE root:x:0:0:root:/root:/bin/bash
pid 31796 LINE bin:x:1:1:bin:/bin:/sbin/nologin
pid 31796 LINE daemon:x:2:2:daemon:/sbin:/sbin/nologin
I've had enough!
pid 31793

変数「i」と「j」は、Fortranの好意で提供されました。良い一日を。:-)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Expectシェルスクリプトで生成されたプロセスの終了コードを取得する方法

分類Dev

JavaScriptでネストされたオブジェクトをループする

分類Dev

UNIXシェルスクリプトのネストされたforループ

分類Dev

ネストされたループを終了する方法

分類Dev

makeコマンドを実行した後、リモートマシンで実行されているシェルスクリプトが終了します

分類Dev

ネストされた.zipファイルを名前シェルスクリプトで解凍します

分類Dev

昇格された特権でシェルスクリプトをリモートで実行する方法

分類Dev

シェルスクリプトで整列された列を生成する

分類Dev

シェルスクリプトでplistネストされた辞書から値を読み取る

分類Dev

forループでネストされたオブジェクトをループする方法

分類Dev

シェルスクリプトへのネストされた呼び出し全体でbash / shell「set-x」をスティッキーにする方法

分類Dev

同じスクリプトからコンパイルされたacプログラムからシェルスクリプトを終了する

分類Dev

BashシェルスクリプトIFSでネストされたwhileループ

分類Dev

ネストされたforループ内のシェルスクリプトクローンリポジトリ

分類Dev

シェルに埋め込まれたスクリプトを期待する:リモートシェルで定義された値を指定する方法は?

分類Dev

指定された時間後にシェルスクリプトを終了する方法

分類Dev

シェルスクリプト+ mutt:whileループで終了するmutt

分類Dev

シェルスクリプト+ mutt:whileループで終了するmutt

分類Dev

シェルスクリプト:whileループが途中で終了する

分類Dev

ネストされたforループでネストされたリストを処理する

分類Dev

ネストされたオブジェクトのJavaScriptをループする

分類Dev

ネストされたjsonオブジェクトをループする

分類Dev

ネストされたオブジェクトをループする

分類Dev

ネストされたオブジェクトをループする

分類Dev

javascript / es6で比較した後、ネストされたオブジェクトをループしてフィールドをプッシュする方法

分類Dev

Elasticsearchフィルタースクリプトでネストされたフィールドを使用する方法

分類Dev

FreeBSDでロックされたパッケージを一覧表示するシェルスクリプト

分類Dev

Rでネストされたリストをループする

分類Dev

Rのループでネストされたリストを作成する

Related 関連記事

  1. 1

    Expectシェルスクリプトで生成されたプロセスの終了コードを取得する方法

  2. 2

    JavaScriptでネストされたオブジェクトをループする

  3. 3

    UNIXシェルスクリプトのネストされたforループ

  4. 4

    ネストされたループを終了する方法

  5. 5

    makeコマンドを実行した後、リモートマシンで実行されているシェルスクリプトが終了します

  6. 6

    ネストされた.zipファイルを名前シェルスクリプトで解凍します

  7. 7

    昇格された特権でシェルスクリプトをリモートで実行する方法

  8. 8

    シェルスクリプトで整列された列を生成する

  9. 9

    シェルスクリプトでplistネストされた辞書から値を読み取る

  10. 10

    forループでネストされたオブジェクトをループする方法

  11. 11

    シェルスクリプトへのネストされた呼び出し全体でbash / shell「set-x」をスティッキーにする方法

  12. 12

    同じスクリプトからコンパイルされたacプログラムからシェルスクリプトを終了する

  13. 13

    BashシェルスクリプトIFSでネストされたwhileループ

  14. 14

    ネストされたforループ内のシェルスクリプトクローンリポジトリ

  15. 15

    シェルに埋め込まれたスクリプトを期待する:リモートシェルで定義された値を指定する方法は?

  16. 16

    指定された時間後にシェルスクリプトを終了する方法

  17. 17

    シェルスクリプト+ mutt:whileループで終了するmutt

  18. 18

    シェルスクリプト+ mutt:whileループで終了するmutt

  19. 19

    シェルスクリプト:whileループが途中で終了する

  20. 20

    ネストされたforループでネストされたリストを処理する

  21. 21

    ネストされたオブジェクトのJavaScriptをループする

  22. 22

    ネストされたjsonオブジェクトをループする

  23. 23

    ネストされたオブジェクトをループする

  24. 24

    ネストされたオブジェクトをループする

  25. 25

    javascript / es6で比較した後、ネストされたオブジェクトをループしてフィールドをプッシュする方法

  26. 26

    Elasticsearchフィルタースクリプトでネストされたフィールドを使用する方法

  27. 27

    FreeBSDでロックされたパッケージを一覧表示するシェルスクリプト

  28. 28

    Rでネストされたリストをループする

  29. 29

    Rのループでネストされたリストを作成する

ホットタグ

アーカイブ