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[*]}"

这将接受您的输入并循环,正确地询问用户输入的数字TRACK1TRACKN哪里。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

相关内容