如何检查 if 语句中不以条件开头?

如何检查 if 语句中不以条件开头?

我想检查如下所示的情况。行不应以# 符号开头:

if[ ! ["$Line" == "#*"] ]; then

但这是行不通的。

答案1

您的代码片段中有很多问题,但基本上语法[![...]]无效,在 bash (和许多其他 shell)中[[是单个命令,不能被任何其他字符分割。

您可以改为否定相等运算符:

if [[ "$LINE" != \#* ]]; then echo yes; fi

还要仔细查看括号周围的空间。

答案2

假设变量中有一个字符串line,并且您希望输出该字符串yes(如果它不以字符 开头)#。在下面的例子中,no当条件不满足时我也会输出。

case $line in
    "#"*) echo no
esac

case语句采用一个变量,然后采用任意数量的(通配)模式,并执行与变量值匹配的模式的代码。在这种情况下,我们尝试匹配模式"#"*#必须用引号引起来,以免被视为引入注释),如果匹配,则echo执行一条语句。

如果有更多模式,则除最后一个模式之外的所有模式的代码都必须以 终止;;,如

case $line in
    "#"*) echo no ;;
    *)    echo yes
esac

...并且模式的代码可能为空:

case $line in
    "#"*) ;;
    *)    echo yes
esac

shell还通过操作bash符与 glob 进行模式匹配:[[ ... ]]==

if [[ $line != "#"* ]]; then
    echo yes
else
    echo no
fi

在 中bash,您还可以使用正则表达式与=~中的运算符匹配[[ ... ]]

if ! [[ $line =~ ^# ]]; then
    echo yes
else
    echo no
fi

或者

if [[ $line =~ ^[^#] ]]; then
    echo yes
else
    echo no
fi

如果您要逐行解析文件,那么 shell 不是适合该工作的工具。相反,您可能想使用类似的东西awk

awk '/^[^#]/ { print yes }' <inputfile

有关的:

相关内容