我在这里很困惑如何做到这一点。假设我想制作一个脚本,询问 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)
您索引不正确(一旦您运行它就会很快发现),但您遇到的另一个问题是您试图分配一个变量名称,该名称本身包含$
在其中:set TTITLE$TRACK=TTITLE
- 这不会创建一个名为TTITLE#
where 的变量#
是 的值$TRACK
。我无法自信地告诉你这是做什么的。
当尝试使用该变量时,您执行了以下操作:echo ${!TTITLE$TRACK}
,其中 bang ( !
) 实际上是爆炸命令TTITLE...
试图找到以(不是您想要的)开头的最新命令。
答案2
每当您发现自己尝试动态分配变量名称时,您应该问自己是否有一个高阶数据结构可以解决您的问题。换句话说,将数据保留在变量名称之外。我认为数组是一个很好的解决方案。
答案3
评论到坎宁安3我意识到我不需要使用变量或数组,我只需一步步将所有内容都列出到文件中即可。这就是我最终得到的结果。
#!/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
让用户将曲目标题写入文件,每行一个。
在您的脚本中将标题读入数组中:
mapfile -t titles < track_title_file.txt
然后处理元素。例如:
for index in "${!titles[@]}"; do
printf "TITLE%d=%s\n" "$index" "${titles[index]}"
done