コマンドライン引数を解析してユーザーの確認をスキップする

コマンドライン引数を解析してユーザーの確認をスキップする

「-y」や「--yes」などの特定の引数が渡された場合、スクリプトを非対話型にして、ユーザーの確認をスキップしたいと思います。また、ソースとなる他のスクリプトに引数を渡す方法も知りたいです。

SHORT=yq
LONG=yes,quick

PARSED=$(getopt --options $SHORT --longoptions $LONG --name "$0" -- "$@")
eval set -- "$PARSED"

q=0; autoConfirm=0

while true; do
    case "$1" in
        -q|--quick)
            q=1
            shift
            ;;
        -y|--yes)
            autoConfirm=1
            shift
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Invalid option.  Use -h for help"
            exit 3
            ;;
    esac
done

assertConfirmation () {
    local promptMsg=$1 autoConfirm=$2
    if (( autoConfirm )); then
        return
    else
        clear
        read  -n 1 -p "$promptMsg (yes/No) "
        printf '\n========================================================================'
        if [[ $REPLY =~ ^([Yy])$ ]]; then
            return
        fi
    fi
    return 1
}

if assertConfirmation "Install this?" "${autoConfirm:?}"; then
    install
fi

source installation "${autoConfirm:?}" "${q:?}"

答え1

インストール スクリプトが何を期待しているかによって異なります。シンプルにするには、 と を-y引数として受け入れるようにするのが最適です。これにより、case ステートメントを変更して、 とを1 (デフォルトでは null) ではなくとに設定し、インストール スクリプトを次のように呼び出すこと-qができます。qautoConfirm-q-y

source installation $autoConfirm $q

この変更により、[[ $autoconfirm ]]の代わりに を使用して、設定されているかどうかを確認します(( autoConfirm ))

関連情報