나는 사용자에게 몇 가지 질문을 하고 사용자의 선택에 따라 일부 또는 다른 옵션을 사용하여 최종 명령을 내리는 쉘 스크립트를 만들려고 합니다. 이제 스크립트는 다음과 같습니다.
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[@]}"
배열 함수를 사용하면 코드가 손상되는 토큰화에 대한 걱정 없이 임의로 긴 매개변수 목록을 쉽게 작성할 수 있습니다.