有几个脚本遵循以下模式,我很好奇你们是否有关于减少行数的建议,或者你是否更加精简了?
我不喜欢的是我使用了太多$?检查,最后是嵌套的if循环 - 不确定这是不是坏事。
代码我正在寻求优化,但仍保持功能如下:
wget -V > /dev/null 2>&1
if [ $? -ne 0 ]; then
apt install wget
if [ $? -ne 0 ]; then
"failed to install wget"
fi
fi
答案 0 :(得分:3)
oneliner使用hash
:
hash wget 2>/dev/null || echo 'wget is not installed'
如果您需要安装,可以
hash wget 2>/dev/null || apt install -y wget || echo 'failed to install wget'
再次,oneliner。
更具体地说,hash
是shell中可靠的方法,用于检查$PATH
中是否存在二进制文件。您可以查看有关hash
的信息,如下所示:
$ help hash
hash: hash [-lr] [-p pathname] [-dt] [name ...]
Remember or display program locations.
Determine and remember the full pathname of each command NAME. If
no arguments are given, information about remembered commands is displayed.
Options: ...
Exit Status:
Returns success unless NAME is not found or an invalid option is given.
答案 1 :(得分:2)
一般情况下,除非您正在寻找特定的非零退出代码,否则不需要明确检查$?
。您可以将代码重写为:
if ! wget -V &> /dev/null; then
if ! apt install wget; then
echo "failed to install wget"
fi
fi
或者,更简洁:
wget -V &> /dev/null || apt install wget || echo "failed to install wget"
答案 2 :(得分:0)
我试图把大局放在后面,我认为你试图重新发明轮子。
debian及{衍生物'上的所述轮子是command-not-found
。
当命令自动失败时,它会提出建议。
你必须这样做:
apt-get install command-not-found
update-command-not-found
wget -V # or any missing command
答案 3 :(得分:0)
如果这是安装程序脚本,请不要检查,只需安装即可。无论如何都将跳过已安装的任何软件包:
apt install wget jq texlive-latex-base || exit 1
如果这是一个普通的脚本,不会安装缺少的依赖项,尤其是在未经用户同意的情况下。这不是剧本的工作,而且它比有用的更具侵入性。
如果您仍想这样做,只需将其放入功能中即可。这是一个例子:
require() {
# Assume $1 is command and $3 is package (or same as command)
set -- "$1" from "${3:-$1}"
if ! { type "$1" > /dev/null 2>&1 || apt install "$3"; }
then
echo "$1 was missing, but installation of $3 failed" >&2
exit 1
fi
}
require wget
require jq
require latex from texlive-latex-base