bashスクリプトは金額を尋ねてから、あまりにも多くのプロンプトを求めます。

bashスクリプトは金額を尋ねてから、あまりにも多くのプロンプトを求めます。

これを行う方法が混乱しています。 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正確に尋ねますTRACKNN最後に、どのように使用するのか分からないので、配列のすべてのインデックスを印刷します。このページ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

関連情報