サブプロセスとして実行( echo "ERROR: ${file} does not exist" >&2 && exit )
している可能性があります (コマンドは () 内にあります)。したがって、サブプロセスを終了しています。これはシェル スクリプトのトレースです (私は で取得しましたset -x
):
+ FILES=(file1.txt file2.txt file3.txt)
+ for file in '${FILES[@]}'
+ '[' -e file1.txt ']'
+ echo 'ERROR: file1.txt does not exist'
ERROR: file1.txt does not exist
+ exit
+ for file in '${FILES[@]}'
+ '[' -e file2.txt ']'
+ echo 'ERROR: file2.txt does not exist'
ERROR: file2.txt does not exist
+ exit
+ for file in '${FILES[@]}'
+ '[' -e file3.txt ']'
+ echo 'ERROR: file3.txt does not exist'
ERROR: file3.txt does not exist
+ exit
これは機能します:
set -x
FILES=( file1.txt file2.txt file3.txt )
for file in ${FILES[@]}; do
[ -e "${file}" ] || echo "ERROR: ${file} does not exist" >&2 && exit
done
set -x
ファイルに入れて、自分自身を見てください。
または、このように
set -x
FILES=( file1.txt file2.txt file3.txt )
for file in ${FILES[@]}; do
[ -e "${file}" ] || (echo "ERROR: ${file} does not exist" >&2) && exit
done
更新bash
について質問していると思います-コマンドのグループ化
これは、同じプロセスでグループ化して実行しています
FILES=( file1.txt file2.txt file3.txt )
for file in ${FILES[@]}; do
[ -e "${file}" ] || { echo "ERROR: ${file} does not exist" >&2; exit; }
done
これは、サブプロセスでグループ化して実行しています
FILES=( file1.txt file2.txt file3.txt )
for file in ${FILES[@]}; do
[ -e "${file}" ] || ( echo "ERROR: ${file} does not exist" >&2; exit )
done