我有一个(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