bash - 한 줄씩 대화식으로 변경

bash - 한 줄씩 대화식으로 변경

저는 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!"

관련 정보