在Bash中编写if语句的更好方法

时间:2018-02-21 23:07:08

标签: bash if-statement syntax

有几个脚本遵循以下模式,我很好奇你们是否有关于减少行数的建议,或者你是否更加精简了?

我不喜欢的是我使用了太多$?检查,最后是嵌套的if循环 - 不确定这是不是坏事。

代码我正在寻求优化,但仍保持功能如下:

wget -V > /dev/null 2>&1
if [ $? -ne 0 ]; then
    apt install wget
    if [ $? -ne 0 ]; then
        "failed to install wget" 
    fi
fi

4 个答案:

答案 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)

我试图把大局放在后面,我认为你试图重新发明轮子。

及{衍生物'上的所述轮子是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