bash script solicite um valor e, em seguida, pergunte que muitos prompts

0

Estou ficando confuso aqui como fazer isso. Digamos que eu queira fazer um script que pergunte quantas faixas em um cd e, em seguida, pergunte o nome da faixa que muitas vezes com cada faixa formatada e exportada para um arquivo. Eu tentei isso até agora, mas está errado.

#!/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

O que eu espero obter é um arquivo como:

TTITLE1=Uptown Funk!
TTITLE2=Thinking Out Loud
TTITLE3=See You Again

o que recebo é line 14: ${!TTITLE$TRACK}: bad substitution e set | grep TITLE não retorna nada, então nenhuma variável está sendo definida (eu acho).

    
por FoxSam12 18.04.2018 / 18:12

4 respostas

2

ATUALIZAÇÃO:

Para imprimir em um arquivo como você indica, aqui está um script atualizado:

#!/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

Para responder ao título da sua pergunta, consertar seu script para funcionar, e ir um pouquinho mais para cuspir os resultados em uma matriz indexada pelo número da faixa (por seu comentário):

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

Isso leva sua entrada e faz um loop, solicitando corretamente TRACK1 a TRACKN , em que N é o número digitado pelo usuário. No final, simplesmente imprimo todos os índices do array, já que não tenho idéia de como você o utiliza. Esta página é um começo (do TLDP) sobre como você pode trabalhar com esse array em bash

Você estava indexando incorretamente (teria percebido isso rapidamente depois de executá-lo), mas outro problema que você tinha era que estava tentando atribuir um nome de variável que tinha um $ contido nele: set TTITLE$TRACK=TTITLE - isso não criará uma variável chamada TTITLE# , em que # é o valor de $TRACK . Eu não posso dizer com segurança o que isso faz.

Ao tentar usar essa variável, você fez isso: echo ${!TTITLE$TRACK} , em que o estrondo ( ! ) é, na verdade, um estrondo comando tentando encontrar o comando mais recente começando com TTITLE... (não o que você pretendia).

    
por 18.04.2018 / 18:48
1

Sempre que você estiver tentando atribuir dinamicamente nomes de variáveis, pergunte-se se existe uma estrutura de dados de ordem mais alta que possa resolver seu problema. Em outras palavras, mantenha os dados fora dos nomes das variáveis . Eu acho que as matrizes são uma boa solução.

    
por 18.04.2018 / 18:34
1

Comentando a resposta do cunninghamp3 , percebi que não preciso usar variáveis ou matrizes. lista tudo em um arquivo simplesmente passo a passo. Foi com isso que acabei.

#!/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
    
por 18.04.2018 / 19:26
0

faça o usuário gravar os títulos das faixas em um arquivo, um por linha.

no seu script, leia os títulos em uma matriz:

mapfile -t titles < track_title_file.txt

processe os elementos. Por exemplo:

for index in "${!titles[@]}"; do
    printf "TITLE%d=%s\n" "$index" "${titles[index]}"
done
    
por 18.04.2018 / 19:49