두 대의 서로 다른 컴퓨터에서 실행하고 싶은 (bash) 스크립트가 있습니다. 하나는 OpenBSD sha256
이고 다른 하나는 sha256sum
.
sha256
vs 의 경우 sha256sum
프로그램의 다른 옵션을 변경할 필요가 없지만 wget
vs 와 같은 다른 프로그램 선택의 경우 curl
다른 매개변수가 변경됩니다(예: wget
vs. curl -O
). 따라서 가장 좋은 대답은 사용 가능한 프로그램에 따라 다른 명령줄 인수를 허용하는 것입니다.
프로그램을 수정하는 한 가지 방법은 다음과 같이 command
, hash
또는 의 종료 상태 에 따라 변경되는 변수를 사용하는 것입니다 .type
이 문제
예를 들어
SHA_PROGRAM=sha256
command -v "$SHA_PROGRAM"
# If the exit status of command is nonzero, try something else
if [ "$?" -ne "0" ]; then
command -v "sha256sum"
if [ "$?" -ne "0" ]; then
printf "This program requires a sha256 hashing program, please install one\n" 1>&2
exit 1
else
SHA_PROGRAM=sha256sum
fi
fi
$SHA_PROGRAM $MYFILE
그러나 이 접근 방식은 중첩된 if 문 문제는 말할 것도 없고 약간 장황해 보입니다.
일련의 가능한 명령을 사용하여 일반화할 수 있습니다.
declare -a POSSIBLE_COMMANDS=("sha256" "sha256sum")
SHA_PROGRAM=""
for $OPT in "${POSSIBLE_COMMANDS[@]}"
do
command -v "$OPT"
# if the exit status of command is zero, set the command variable and exit the loop
if [ "$?" -eq "0" ]; then
SHA_PROGRAM=$OPT
break
fi
done
# if the variable is still empty, exit with an error
if [ -z "$SHA_PROGRAM" ]; then
printf "This program requires a sha256 program. Aborting\n" 1>&2
exit 1
fi
$SHA_PROGRAM $MY_FILE
||
이 방법도 효과가 있을 것이라고 확신하지만 더 나은 솔루션( 연산자를 영리하게 사용하는 방법 이 있을까요?)을 놓친 경우를 대비해 더 경험이 많고 더 나은 bash 프로그래머로부터 조언을 얻고 싶습니다 .
답변1
@yaegashi의 의견에 따르면 이는 if command -v ...; then ...
평범하고 단순한 목표를 달성한 것 같습니다.
예:
# The SHA_CMD variable can be used to store the appropriate command for later use
SHA_CMD=""
if command -v sha256; then
SHA_CMD=sha256
elif command -v sha256sum; then
SHA_CMD=sha256sum
else
printf "This program requires a a sha256 program installed\n" 1>&2
exit 1
fi
"$SHA_CMD" "$MY_FILE" > "$MY_FILE.sha"
# Note: if any of the possible sha commands had command line parameters, then the quotes need to be removed from around $SHA_CMD