
これを行う方法が混乱しています。 CDにいくつのトラックがあるかを尋ね、トラック名を何度も尋ね、各トラックをフォーマットしてファイルにエクスポートするスクリプトを作成したいとします。これまで試してみましたが間違っていました。
#!/bin/bash
read -p 'How many tracks are there?' TRACKCOUNT
#while not amount of tracks
TRACK=1
while [ $TRACK -le $TRACKCOUNT ]
do
#indirection not a good idea?
#http://mywiki.wooledge.org/BashFAQ/006#Indirection
#ask for track<count> title save to variable TTITLE
read -p 'Track '$(($TRACK + 1))': ' TTITLE
TTITLE="${TTITLE:-No Name}"
set TTITLE$TRACK=TTITLE
echo ${!TTITLE$TRACK}
(( TRACK++ ))
done
私が期待するのは、次のファイルです。
TTITLE1=Uptown Funk!
TTITLE2=Thinking Out Loud
TTITLE3=See You Again
私が得るものは何も返されないline 14: ${!TTITLE$TRACK}: bad substitution
ので、set | grep TITLE
変数が設定されていません。
答え1
修正する:
指示に従ってファイルに印刷するには、更新されたスクリプトは次のとおりです。
#!/bin/bash
read -p 'How many tracks are there?' TRACKCOUNT
TRACK=1
while [ $TRACK -le $TRACKCOUNT ]
do
read -p "Track $TRACK: " TTITLE
echo "TTITLE$TRACK=${TTITLE:-No Name}" >> ./track_output.txt
(( TRACK++ ))
done
質問のタイトルに答えるには、スクリプトが機能するように変更し、結果をトラック番号でインデックス付けされた配列に追加します(あなたの意見に従って)。
#!/bin/bash
declare -a TRACK_ARRAY
read -p 'How many tracks are there?' TRACKCOUNT
TRACK=1
while [ $TRACK -le $TRACKCOUNT ]
do
read -p "Track $TRACK: " TTITLE
TRACK_ARRAY[$TRACK]="${TTITLE:-No Name}"
(( TRACK++ ))
done
echo "${TRACK_ARRAY[*]}"
これにより入力が承認され、ループが発生し、ユーザーに入力した数字がどこにあるかをTRACK1
正確に尋ねますTRACKN
。N
最後に、どのように使用するのか分からないので、配列のすべてのインデックスを印刷します。このページbashでこの配列を使用する方法の開始です(TLDPから)。
インデックスを誤って作成していますが(実行するとすぐにわかります)、もう1つの問題は、$
その中に含まれる変数名を割り当てようとすることです。 where Yes valueというset TTITLE$TRACK=TTITLE
変数です。私はこれが何をしているのか自信を持って話すことはできません。TTITLE#
#
$TRACK
変数を使用しようとすると、次のことが行われました。echo ${!TTITLE$TRACK}
、ここでbang(!
)は実際には爆発の順序TTITLE...
(必要ではない)で始まる最新のコマンドを見つけようとしています。
答え2
変数名を動的に割り当てようとするたびに、問題を解決できる高次データ構造があるかどうかを尋ねる必要があります。つまり、変数名の外にデータを保持。配列が良い解決策だと思います。
答え3
コメントするカーニングハム3私は変数や配列を使用する必要がないことに気づきました。 1つのステップですべてをファイルにリストできました。これが私が終わったものです。
#!/bin/bash
i=1
#clear the template file and start blank
echo "#Template file of CD Tracks"> ./template.txt
read -p 'How many tracks are there?' TRACKCOUNT
while [ $i -le $TRACKCOUNT ]
do
read -p 'Track '$i': ' TRACK
TRACK="${TRACK:-Track #"$i"}"
echo ""TTITLE"$((i-1))"="$TRACK" >> ./template.txt
(( i++ ))
done
答え4
ユーザーがトラックのタイトルを1行に1つずつファイルに書き込むようにします。
スクリプトからタイトルを配列として読み込みます。
mapfile -t titles < track_title_file.txt
次に要素を処理します。たとえば、
for index in "${!titles[@]}"; do
printf "TITLE%d=%s\n" "$index" "${titles[index]}"
done