语法错误:使用计算时出现意外的“(”(期望“fi”)

语法错误:使用计算时出现意外的“(”(期望“fi”)

我对 shell 比较陌生,并且遇到语法错误,但我仍然感到困惑。

#!/bin/dash

ls="ls -l test"
small=0
medium=0
large=0

for i in $(seq 11 9 56)
do
    filename=$(echo $($ls) | cut -d ' ' -f $i)
    count=$(wc -w test/$filename | cut -d ' ' -f 1)
    if [ "$count" -lt 10 ]; then
        small=(( $small+1 ))
    elif [ "$count" -gt 100 ]; then
        large=(( $large+1 ))
    else
        medium=(( $medium+1 ))
    fi
done
echo $small
echo $medium
echo $large

在这段代码中,我试图获取文件列表,检索文件有多少个单词,并将它们分类为小/中/大尺寸文件。我很确定我在使用 递增变量时没有犯任何语法错误test,但它们似乎在 if 语句中不起作用。谁能帮我解决这个问题吗?在 if 语句中使用多个括号时出现语法错误,但我不知道它是什么。

答案1

语法是:

large=$(( $large + 1 ))

或者甚至更好:

large=$(( large + 1 ))

不是large=(( $large+1 ))

类似 Korn 的 shell 也有(( large = large + 1 ))or(( large += 1 ))(( large++ )),但即使 POSIX 指定 ksh 是$((...)) 算术展开的运算符sh,他们省略了((...)) 算术表达式运营商,所以dash没有费心实施它。

无论如何,脚本的其余部分也没有多大意义。你的意思可能是这样的:

#! /bin/sh -

small=0 medium=0 large=0
for file in test/*; do
  words=$(wc -w < "$file") || continue
  if [ "$words" -lt 10 ]; then    # 0 to 9
    small=$(( small + 1 ))
  elif [ "$words" -gt 100 ]; then # 101 and above
    large=$(( large + 1 ))
  else                            # 10 to 100
    medium=$(( medium + 1))
  fi
done

printf '%s\n' "$small" "$medium" "$large"

您还可以执行以下操作:

...
  if [ "$words" -lt 10 ]; then    # 0 to 9
    kind=small
  elif [ "$words" -gt 100 ]; then # 101 and above
    kind=large
  else                            # 10 to 100
    kind=medium
  fi
  : "$(( $kind += 1 ))"
...

其中算术扩展具有增加其名称存储在 中的变量值的副作用$kind,并且我们通过将其传递给 null 命令来丢弃该扩展的结果:,因此实际上它类似于 ksh 样式(( $kind += 1 ))

答案2

你需要var=$(( expr ))而不是var=(( expr ))

(是一个控制运算符,用于dash分隔单词。所以var=(...没有意义,因为它变成了var= (...

((已知(例如)bash但不知道dash,所以这不起作用也就不足为奇了。

它在任何一种情况下都不起作用,bash因为仅允许在简单命令中进行变量赋值,但在复合命令(如)bash前面。(( ))

相关内容