我正在尝试编写一个简单的脚本,如果其中一行包含7个逗号,则将返回true或false。但是我遇到了两个错误。第一个错误来自grep,如果删除-o,仍然会收到错误。而且我不确定为什么显示0,为什么返回false?我在平等方面也遇到了麻烦; -eq和==都不起作用。
脚本:
#!/bin/bash
str="a,g,5,d,s,c,f,s"
stat=grep -o "," <<< "$str" | wc -l
if [ $stat == '7' ];then
echo "true"
else
echo "false"
fi
这是我收到的输出:
./tesh.sh
./tesh.sh: line 3: -0: command not found
0
./tesh.sh: line 4: [: ==: unary operator expected
false
答案 0 :(得分:0)
更正脚本中的以下行。
stat=$(grep -o "," <<< "$str" | wc -l)
在与数字值进行比较时,如果出现以下情况,请更正您的情况
if [[ $stat -eq 7 ]];then
答案 1 :(得分:-1)
这里有几个问题。
var=value somecommand arg1 arg2 ...
在执行var
的环境中导出somecommand
(不为将来的任何命令更改环境); 没有将key
设置为somecommand
的输出。
[ $stat == '7' ]
有多个不同的问题:
[
根本不保证==
是受支持的操作。 The POSIX test
specification保证=
可用于字符串比较,或-eq
可用于数字比较。 ([[
保证对==
的支持,并避免了引号的使用;它的使用也明确声明不移植至基准/bin/sh
实现的可移植性。)$stat
(未加引号)可以扩展为未知数量的单词,具体取决于IFS的当前值和变量的内容。这意味着,如果您的wc
命令由于某种原因而失败,那么您最终可能会运行[ = 7 ]
-这会产生“一元运算符意外”错误-而不是[ "" = 7 ]
,这是正确的。相比之下,7
不需要用引号引起来,它不可能扩展到除自身之外的任何地方。与其计数逗号,不如将逗号分隔的项目读入数组,然后计算数组成员的数量。只能使用BashFAQ #1中所述的外壳本身内置的工具来完成此操作–因此,启动wc
或grep
之类的外部可执行文件不会产生任何(大量)开销:
IFS=, read -r -a pieces <<<"$str"
if (( ${#pieces[@]} == 8 )); then
echo "Correct number of pieces found"
else
echo "Error: Only ${#pieces[@]} pieces found in line"
fi
这使您可以分别引用项目:
echo "This first piece is ${pieces[0]}"
echo "The last piece is ${pieces[7]}"