이 작업을 수행하는 방법이 혼란 스럽습니다. 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에서).
색인을 잘못 작성 하고 있지만(실행하면 빨리 알 수 있음), 또 다른 문제는 $
그 안에 포함된 변수 이름을 할당하려고 한다는 것입니다. where Yes value 라는 set TTITLE$TRACK=TTITLE
변수 입니다 . 나는 이것이 무엇을 하는지 자신있게 말할 수 없습니다.TTITLE#
#
$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