我想检查如下所示的情况。行不应以#
符号开头:
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
有关的: