조건에 따라 결정된 옵션으로 명령 실행

조건에 따라 결정된 옵션으로 명령 실행

나는 사용자에게 몇 가지 질문을 하고 사용자의 선택에 따라 일부 또는 다른 옵션을 사용하여 최종 명령을 내리는 쉘 스크립트를 만들려고 합니다. 이제 스크립트는 다음과 같습니다.

if [[ $a == "y" ]] ; then

    command --option 1 argument

elif [[ $a == "n" ]] ; then

    command --option 2 argument

else

    command --option 3 argument

fi

명령이 꽤 길고 명령문마다 동일하게 유지되는 옵션과 매개변수가 많이 포함되어 있다는 점을 고려하면 해당 조건이 true인 경우 변수 옵션만 고려하는 라인을 어떻게든 작성할 수 있는지 궁금합니다.

GNU parallel이는 하나 이상의 명령을 실행하는 데에도 작동합니다.

if [[ $b == "n" ]] ; then

    find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument

else

    find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument\; command2 --option argument

답변1

물론 변수를 전달하는 옵션을 저장할 수도 있습니다. 첫 번째 예는 다음과 같습니다( [[POSIX 셸에서는 사용할 수 없는 bash 기능이기도 함).

if [[ $a == "y" ]] ; then
    arg=1
elif [[ $a == "n" ]] ; then
    arg=2
else
    arg=3
fi

command --option "$arg" argument

두 번째 예:

if [[ $b != "n" ]] ; then
    extra="; command2 --option argument"
fi

find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument$extra
# if unset, $extra will be empty—you can of course explicitly
# set it to '' if this bothers you.

이러한 작업이 작동하는 이유는 변수 확장이 작동하는 방식 때문입니다. 즉, 명령줄로 대체한 다음 (따옴표가 없는 경우) 토큰화하여 명령에 전달합니다. 따라서 호출된 명령은 변수에 대해 전혀 알지 못하므로 쉘은 변수를 호출하기 전에 변수를 확장합니다.

Bash를 사용하고 있으므로 배열을 사용할 수도 있습니다.

args=()

if [ -n "$OPT_LONG" ]; then
    args+=(-l)
fi

if [ -n "$OPT_SORT_TIME" ]; then
    args+=(-t)
fi

ls "${args[@]}"

배열 함수를 사용하면 코드가 손상되는 토큰화에 대한 걱정 없이 임의로 긴 매개변수 목록을 쉽게 작성할 수 있습니다.

관련 정보