简单脚本不起作用

时间:2018-07-17 15:46:34

标签: linux bash shell

我正在尝试编写一个简单的脚本,如果其中一行包含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

2 个答案:

答案 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中所述的外壳本身内置的工具来完成此操作–因此,启动wcgrep之类的外部可执行文件不会产生任何(大量)开销:

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]}"