저는 bash 스크립팅을 처음 접했습니다. 사용자에게 파일을 한 줄씩 편집하도록 데이터를 요청하는 대화형 스크립트를 만들고 싶습니다.
시나리오: - 파일을 읽고 각 줄을 반복하려면 다음을 사용합니다.for in
사용자에게 행을 편집할지 묻습니다.
그렇다면 수정해 주세요.
그렇지 않은 경우 다음 줄로 계속
모든 작업이 완료되면 상호작용을 종료합니다.
내 접근 방식:
# --> get file contents and convert them to an array
readarray thearray < ips.info
# --> Iterate the array and do interactive editing
for item in ${!thearray[@]}; do
if [[ "$item" == 0 ]]; then
echo -e "First line: ${thearray[$item]}. Change this line? (y/n)"
read Useranswer
if [ $Useranswer = y]; then
echo "Please type any string:"
read Firststring
elif [ $Useranswer = n]; then
# not sure what to write here to resume
fi
fi
done
echo "Everything done!"
n
위 코드에 문제가 있나요? 사용자가 키보드를 누르면 어떻게 복구할 수 있나요?
답변1
당신이 사용할 수있는조치 없음명령(아무 작업도 수행하지 않음)은 셸에서 다음과 같습니다.:
elif [ $Useranswer = n]; then
:
fi
exit
그렇지 않으면 스크립트를 종료하는 이 명령을 사용할 수 있습니다 . 명령의 종료 상태 범위는 0-255입니다. 이는 성공만을 exit 0
의미하며 다른 모든 종료 상태 코드는 일종의 실패를 설명합니다(필요한 것은 아닙니다). 또는 다음을 수행할 수 있습니다.
elif [ $Useranswer = n]; then
exit 0
fi
그러나 이 경우에는 종료가 이 시점에서 스크립트를 종료하기 때문에 스크립트의 나머지 부분은 실행되지 않습니다. 예를 들어 사용자가 "n"을 누르면 다음 출력을 얻을 수 없습니다.echo "Everything done!
답변2
이것이 내 해결책입니다.
# --> get file contents and convert them to an array
readarray thearray < test1
# --> Iterate the array and do interactive editing
declare i=1;
#printf "%s\n" "${thearray[@]}"
while [ $i -le ${#thearray[@]} ]; do
echo $i
echo -e "First line: ${thearray[$i]}. Change this line? (y/n)"
read Useranswer
if [ $Useranswer == "y" ]; then
echo "Please type any string:"
read Firststring
thearray[$i]="${Firststring}"
let i=$i+1
elif [ $Useranswer == "n" ]; then
let i=$i+1
echo $i
fi
done
echo "printing results\n"
printf "%s\n" "${thearray[@]}"
echo "Everything done!"
나는 이것을 readarray
제자리에 두었는데 매우 눈에 띄고 잘 작동합니다.
그런 다음 이를 선언 i
하고 1로 설정하면 배열을 반복하는 데 도움이 됩니다.
그런 다음 더 이상 배열 크기보다 작거나 같지 않을 while
때까지 반복하는 루프를 사용합니다 .i
${#thearray[@]}
${!thearray[@]}
관련 값의 전체 목록을 가져오기 위해 연관 배열과 함께 사용되므로 구문이 올바르지 않습니다. 인덱스 배열에서는 작동하지 않습니다.
그런 다음 배열[$i]의 현재 요소를 변경하라는 메시지를 표시합니다. 대답이 '예'이면 답을 읽고 array[$i]를 해당 값으로 설정하고 my 를 추가합니다 i
. 그렇지 않으면 1씩 증가시킵니다 i
.
루프를 종료할 때 배열을 다시 표시하여 변경 사항을 표시합니다.
저장하고 싶다면 원래 상태로 다시 저장할 수 있습니다.
답변3
나는 이것이 당신의 요구 사항을 충족시킬 것이라고 생각합니다
#!/usr/bin/env bash
# --> get file contents and convert them to an array
readarray thearray < ips.info
# --> Iterate the array and do interactive editing
for item in ${!thearray[@]}; do
echo "Line number: "$item
echo "line contents: "${thearray[$item]}
echo -n "Change this line? (y/n)"
read Useranswer
if [ $Useranswer = y ]; then
echo -n "Please type any string:"
read Firststring
# insert new value into array
thearray[$item]=$Firststring
elif [ $Useranswer = n ]; then
# not sure what to write here to resume
:
fi
done
declare -p thearray
echo "Everything done!"