関数を呼び出した後にループが終了する BASH

空の兵器庫

ファイル名がすべて数字 (0001、0002 など) で始まるディレクトリのコンテンツ全体を本質的にシフトする bash スクリプトに取り組んでいます。これらのファイルを逆の順序で繰り返して、最初に最後のファイルを下にシフトします。

ファイルを繰り返し処理し、別の関数を呼び出して実際にファイルをシフトする関数が 1 つあります。2 番目の関数を呼び出すと、 for ループがショートして終了します。理由がわかりません。

validation_dir="scripts/validation"
content_directories=($validation_dir "tutorials")

function shift_contents() {
    local start_index=$1
    local positions=$2

    local files=(${validation_dir}/*)
    for ((i=${#files[@]}-1; i>=0; i--)); do
        # Only gets called once
        echo $i
        local f="${files[$i]}"
        local old_index=$(echo $f | tr -dc '0-9' | sed -e 's/^0*//')
        if [ "$old_index" -lt "$start_index" ]
        then
            # Only start when we're at the start index
            continue
        fi
        local new_index=$((old_index + positions))
        # When this is called, it exits the loop
        move_exercise $old_index $new_index
    done
}

シフトを行う関数は次のとおりです。

function move_exercise() {
    local start_index=$1
    local end_index=$2
    local start_prefix=$(echo_filename_prefix $start_index)
    local end_prefix=$(echo_filename_prefix $end_index)

    for i in ${content_directories[@]}; do
        start_file_glob="${i}/${start_prefix}*"

        for f in $start_file_glob; do
            if [ -e $f ]
            then
                start_filename=$f
            else
                log_error "No content found with index ${start_index}"
                exit 1
            fi
            break
        done

        end_file_glob="${i}/${end_prefix}*"

        if [ -e $end_file_glob ]
        then
            log_error "Content was already found for end index ${end_index}: ${end_file_glob}"
            exit 1
        fi

        # Generate the new file name
        new_filename="${start_filename/$start_prefix/$end_prefix}"
        # We get down here once
        echo $start_filename $new_filename
    done

    return
}

2 番目の関数が原因で最初の関数が早期に終了しているように見えますが、それがどのように起こるかわかりません。何が起こっているか見ますか?

編集:

で実行するとbash -x script.sh、もう 1 回反復する必要があるときに次の出力で終了します。

+ echo path/to/second-to-last-file new-path
+ return
+ (( i-- ))
+ (( i>=0 ))

これは for ループ条件チェックに失敗していることを意味しますか? もしそうなら、どのようにmove_exercise影響する可能性がありますか?その行をコメントアウトすると、期待どおりに機能します。

チャールズ・ダフィー

iローカルになりたい場合は、次のように宣言する必要があります。

shift_contents() {
  local i
  # ...etc...
}

move_exercise() {
  local i
  # ...etc...
}

それ以外の場合i、両方の関数間で共有される変数は 1 つだけです。その変数にファイル名が含まれている場合、その数値は 0 です (そのファイル名が、ゼロ以外の数値が割り当てられたシェル変数の名前でもある場合を除きます)。したがって、ファイル名を割り当てた後にデクリメントすると、負になります。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

関数呼び出しを変数に割り当てるときにbashスクリプトを終了します

分類Dev

ループから呼び出された関数でBashトラップが呼び出されない

分類Dev

GNU ParallelがBashで呼び出したサブルーチン(関数)から値を返したい

分類Dev

bash関数がローカル変数を使用せずに自分自身を再帰的に呼び出すことができるのはなぜですか?

分類Dev

bash関数呼び出しで「echo」と「printf」を使用する

分類Dev

Bash配列に格納された環境変数を提供するbash関数を呼び出す方法は?

分類Dev

関数内で「break」が呼び出された場合、Bash4.4 +はエラーを返します

分類Dev

関数を呼び出した後、whileループが終了します

分類Dev

非同期関数がループバック3で終了した後にcb関数を呼び出す方法

分類Dev

このbashスクリプトが終了時に呼び出しプロセスを終了するのはなぜですか?

分類Dev

これはbashのバグですか?パイプから呼び出された場合、 `return`は関数を終了しません

分類Dev

bashスクリプトで、ある関数から別の関数への関数呼び出しで引数/パラメーターを渡す方法

分類Dev

ForAwaitループが終了した後にコールバック関数を呼び出す方法

分類Dev

BashでPHPを呼び出し、PHPプロセスが終了するのを待ちますか?

分類Dev

bashスクリプトのループを使用してCURL呼び出しを適切に作成する

分類Dev

bash関数に埋め込まれたダイアログ呼び出しの結果をキャプチャする

分類Dev

再起動する代わりに、Bashスクリプトを呼び出して終了します

分類Dev

関数を呼び出すforループは、関数が呼び出される前に終了しますか?

分類Dev

$(functionname)を介して関数を呼び出すbashが機能しない

分類Dev

BASHスクリプトの関数内で呼び出したときにSUDOが見つかりません

分類Dev

コードブロックの繰り返しを減らすためにFILEとSCREENへの出力のために呼び出すことができるテキストブロックを保持するBASH関数を作成できますか?

分類Dev

Bash、新しいシェルを呼び出した後にコマンドを実行します

分類Dev

bashシェルスクリプトから.bashrc関数を呼び出す

分類Dev

exitを呼び出した後、Bashで何が起こりますか?

分類Dev

関数内から呼び出される bash スクリプトに環境変数を渡す

分類Dev

名前がbashの変数に格納されている関数を呼び出す

分類Dev

別のbashスクリプトで関数を呼び出す

分類Dev

bashスクリプトで、whileループ条件で関数を呼び出す方法

分類Dev

ajax呼び出しが終了した後に関数を呼び出す

Related 関連記事

  1. 1

    関数呼び出しを変数に割り当てるときにbashスクリプトを終了します

  2. 2

    ループから呼び出された関数でBashトラップが呼び出されない

  3. 3

    GNU ParallelがBashで呼び出したサブルーチン(関数)から値を返したい

  4. 4

    bash関数がローカル変数を使用せずに自分自身を再帰的に呼び出すことができるのはなぜですか?

  5. 5

    bash関数呼び出しで「echo」と「printf」を使用する

  6. 6

    Bash配列に格納された環境変数を提供するbash関数を呼び出す方法は?

  7. 7

    関数内で「break」が呼び出された場合、Bash4.4 +はエラーを返します

  8. 8

    関数を呼び出した後、whileループが終了します

  9. 9

    非同期関数がループバック3で終了した後にcb関数を呼び出す方法

  10. 10

    このbashスクリプトが終了時に呼び出しプロセスを終了するのはなぜですか?

  11. 11

    これはbashのバグですか?パイプから呼び出された場合、 `return`は関数を終了しません

  12. 12

    bashスクリプトで、ある関数から別の関数への関数呼び出しで引数/パラメーターを渡す方法

  13. 13

    ForAwaitループが終了した後にコールバック関数を呼び出す方法

  14. 14

    BashでPHPを呼び出し、PHPプロセスが終了するのを待ちますか?

  15. 15

    bashスクリプトのループを使用してCURL呼び出しを適切に作成する

  16. 16

    bash関数に埋め込まれたダイアログ呼び出しの結果をキャプチャする

  17. 17

    再起動する代わりに、Bashスクリプトを呼び出して終了します

  18. 18

    関数を呼び出すforループは、関数が呼び出される前に終了しますか?

  19. 19

    $(functionname)を介して関数を呼び出すbashが機能しない

  20. 20

    BASHスクリプトの関数内で呼び出したときにSUDOが見つかりません

  21. 21

    コードブロックの繰り返しを減らすためにFILEとSCREENへの出力のために呼び出すことができるテキストブロックを保持するBASH関数を作成できますか?

  22. 22

    Bash、新しいシェルを呼び出した後にコマンドを実行します

  23. 23

    bashシェルスクリプトから.bashrc関数を呼び出す

  24. 24

    exitを呼び出した後、Bashで何が起こりますか?

  25. 25

    関数内から呼び出される bash スクリプトに環境変数を渡す

  26. 26

    名前がbashの変数に格納されている関数を呼び出す

  27. 27

    別のbashスクリプトで関数を呼び出す

  28. 28

    bashスクリプトで、whileループ条件で関数を呼び出す方法

  29. 29

    ajax呼び出しが終了した後に関数を呼び出す

ホットタグ

アーカイブ