我不明白他在这里的错误是我对shell脚本的新手。请帮帮我
./bpr: line 8: syntax error near unexpected token `then'
./bpr: line 8: ` if[$(grep -o BPR $file | wc -l) == 1]; then '
答案 0 :(得分:3)
您需要在[
]
之间添加空格,试试这个:
if [ $(grep -o BPR $file | wc -l) == 1 ]; then
答案 1 :(得分:3)
你的病情需要一个空间:
if [ $(grep -o BPR $file | wc -l) == 1 ]; then
^ ^
1)如果您使用的是bash,则可以使用内置的[[ ..]]
代替test
([ ...]
)命令。
2)您也可以使用grep的wc
选项来避免-c
。
if [[ $(grep -c -o BPR $file) == 1 ]]; then
答案 2 :(得分:1)
除了语法错误之外,如果您不关心文件中可能存在多个wc
的出现,则不需要BPR
:
if grep -o BPR "$file"; then
答案 3 :(得分:1)
有几件事:
[
和]
周围的空格。[
和]
。 if
语句运行您提供的命令。如果该命令返回零,则执行then
语句的if
部分。如果该命令返回非零值,则执行else
部分(如果存在)。
试试这个:
$ if ls some.file.name.that.does.not.exist
> then
> echo "Hey, the file exists!"
> else
> echo "Nope. File isn't there"
> fi
你会得到一个输出:
ls: some.file.name.that.does.not.exist: No such file or directory
Nope. File isn't there
第一个语句当然是ls
命令的输出。第二个是if
语句的输出。 ls
已运行,但无法访问该文件(它不存在)并返回e 1
。这导致else
子句执行。
试试这个:
$ touch foo
$ if ls foo
> echo "Hey, the file exists!"
> else
> echo "Nope. File isn't there"
> fi
你会得到一个输出:
foo
Hey, the file exists!
第一行再次是ls
的输出。由于该文件存在且状态稳定,因此ls
返回了0
。这导致if
子句执行,打印第二行。
如果我想测试文件是否存在怎么办?
您可以使用test命令:
$ if test -e foo
> then
> echo "Hey, the file exists!"
> else
> echo "Nope. File isn't there"
> fi
如果文件foo
存在,则test命令返回0.这意味着echo "Hey, the file exists!"
将执行。如果文件不存在,test将返回1,else
子句将执行。
现在这样做:
$ ls -il /bin/test /bin/[
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/[
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/test
第一个数字是inode
。如果两个匹配的文件具有相同的inode,则它们彼此硬链接。 [
... ]
只是test
命令的另一个名称。 [
是一个实际的命令。这就是为什么你需要它周围的空间。您还看到if
测试命令是否成功,并且实际上没有进行布尔检查(例外情况是,如果您使用双方括号,如[[
和]]
而不是{ {1}}和[
。这些内置在shell中,而不是内置命令。)
您可能想要做的是:
]
if grep -q "BPR" "$file"
then
echo "'BPR' is in '$file'"
fi
标志告诉-q
关闭它的yap。如果您提供的模式在文件中,grep
命令将返回grep
,并且非零(精确值无关紧要 - 只要它不是0)它不能。
注意我不需要0
... [
因为我使用grep命令的输出来查看是否应该执行该语句的if子句。
答案 4 :(得分:0)
如果你只需要知道字符串是否匹配而没有显示实际的匹配使用
if grep -q 'anystring' file ; then