Bash 스크립트에서 배치 옵션 --yes 구현

Bash 스크립트에서 배치 옵션 --yes 구현

예를 들어 다음과 같은 여러 사용자 입력 문이 있습니다.

read -r -p "Do u want to include this step (y) or not (n) (y/N)"? answer
if [[ "$answer" =~ ^[Yy]$ ]]; then 
    ...
fi

나는 이 모든 질문에 자동으로 "예"라고 대답할 수 있는 방법을 찾고 있습니다. 사용자가 options 를 사용하여 스크립트를 호출하는 비대화형 세션을 상상해 보세요 --yes. 추가 stdin입력이 필요하지 않습니다.

지금 당장 생각할 수 있는 유일한 방법은 다른 조건을 추가하는 것입니다.if 문.

어떤 아이디어가 있나요?

답변1

read이러한 질문에만 을 사용하고 변수가 항상 호출되는 경우 answer다음을 바꾸십시오 read.

# parse options, set "$yes" to y if --yes is supplied
if [[ $yes = y ]]
then
    read () {
        answer=y
    }
fi

답변2

당신이 사용할 수있는그것은 1), 스크립트를 전혀 수정할 필요가 없습니다.

$ grep . test.sh
#!/bin/bash
read -rp 'What say you? ' answer
echo "Answer is: $answer"
read -rp 'And again? ' answer2
echo "Answer 2 is: $answer2"
$
$ yes | ./test.sh
Answer is: y
Answer 2 is: y

지정된 주문을 무기한 반복하거나, 지정하지 않은 경우 기본값을 반복합니다 y.

답변3

자동 모드를 확인하고 사용자에게 쿼리하는 등 전체 결정 논리를 함수에 넣을 것입니다. 그런 다음 각 경우에 기본 수준에서 호출합니다. want_act다음은 자체적으로 true/false 값을 반환하며 기본 수준에서는 문자열 비교가 필요하지 않으며 조건이 수행하는 작업이 독자에게 명확합니다.

#!/bin/bash
[[ $1 = --yes ]] && yes_mode=1

want_act() {
    [[ $yes_mode = 1 ]] && return 0
    read -r -p "Include step '$1' (y/n)? " answer
    [[ $answer = [Yy]* ]] && return 0
    return 1
}

if want_act "frobnicate first farthing"; then
    echo "frobnicating..."
fi

관련 정보