如果不使用通配符值

时间:2015-07-27 15:06:09

标签: bash if-statement wildcard

我有一个基本上有一个函数的脚本然后我运行一个如果运行该函数,如果内核版本是我需要的版本。简而言之就像这样

#!/bin/bash

postinstall() {
run some postinstall commands in here
}

UNAME=`uname -r`
if [[ $UNAME == 3.* ]]
then
  postinstall
else
  echo "Kernel version is not correct"
fi

当我在CLI上运行命令时,它的工作正常,但当我以sh <scriptname>触发脚本时,我得到以下结果:

: 313: <scriptname>.sh: [[: not found
Kernel version is not correct

第313行是带有“if”的那一行。

1 个答案:

答案 0 :(得分:0)

正如我在comment中所提到的,安装为/bin/sh的shell不一定是Bash(例如,在Ubuntu上,它通常是dash),甚至当它是Bash,当它作为sh而不是bash运行时,它的行为会有所不同。

但是,正如chepner comment中指出的那样,即使以sh运行(在Bash的POSIX mode中),Bash也会识别[[命令 - 虽然它无法识别POSIX shell syntax的其他扩展名,例如process substitution

鉴于您看到的错误消息,很明显,在您的计算机上,sh无法将[[识别为有效命令,这反过来意味着它可能不是Bash。因此,您不应该使用sh但使用bash运行它。或者在命令行上没有指定shell的情况下运行它,让shebang(#!/bin/bash)确保内核运行正确的shell。