bashスクリプトは、最初のループ後に読み取り専用値を失います。

bashスクリプトは、最初のループ後に読み取り専用値を失います。

for-inループを最初に通過した後、読み取り専用定数の値を失ったように見えるbashスクリプトがあります。たとえば、

#!/bin/bash
readonly DIR="./groups/"
for output in "${array[@]}"
do
   catstring+="$DIR$output "
done
printf "$catstring"
cat $catstring > outputfile

配列には次のようないくつかの名前があります(例:file1 file2 file3など)。

printf 文の出力は「./groups/file1 file2 file3」です。私が期待しているのは「./groups/file1 ./groups/file2 ./groups/file3」です。

for-inループを初めて通過した後、bashが$ DIR値を失うのはなぜですか?

答え1

それはおそらく、次のファイルリストをキャプチャしたことでしょう。

array=$(ls file* )
#or
array="$(ls file*)"

# array looks like:
# array[0]="file1 file2 file3"

追加の「(」と「)」を使用して、このような配列の複数のインデックスをキャプチャできます。

array=( $(ls file*) )

# array looks like:
# array[0]="file1"
# array[1]="file2"
# array[2]="file3" 

これでコードが機能します

あるいは、「read」を使用して値を読み取ることもできます。

ls > files.txt
read array < files.txt

その後、代わりに "read -a"を使用したいと思います。

read -a < files.txt

関連情報