在 bash 脚本中选择两个程序之一

在 bash 脚本中选择两个程序之一

我有一个(bash)脚本,我想在两台不同的计算机上运行,​​一台是带有该程序的 OpenBSD sha256,另一台是带有sha256sum.允许脚本处理这两种情况的最佳/标准做法是什么?

请注意,对于sha256vs sha256sum,程序中的其他选项不需要更改,但对于不同的程序选择,例如wgetvs. curl,其他参数也会更改(例如wgetvs. curl -O)。因此,最好的答案是允许不同的命令行参数,具体取决于可用的程序。

修复程序的一种方法是使用一个变量,该变量根据commandhash或的退出状态而变化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

相关内容