ファイル名がすべて数字 (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]
コメントを追加