我对 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 语句中使用多个括号时出现语法错误,但我不知道它是什么。
你需要
var=$(( expr ))
而不是var=(( expr ))
(
是一个控制运算符,用于dash
分隔单词。所以var=(...
没有意义,因为它变成了var= (...
((
已知(例如)bash
但不知道,dash
所以这不起作用也就不足为奇了。它在任何一种情况下都不起作用,
bash
因为bash
仅允许在简单命令中进行变量赋值,但在复合命令(如 )前面(( ))
。语法是:
或者甚至更好:
不
。large=(( $large+1 ))
类似 Korn 的 shell 也有
(( large = large + 1 ))
or(( large += 1 ))
或(( large++ ))
,但尽管 POSIX 指定 ksh 是 的$((...))
算术扩展运算符sh
,但它们省略了((...))
算术表达式运算符,因此dash
没有费心去实现它。无论如何,脚本的其余部分也没有多大意义。你的意思可能是这样的:
您还可以执行以下操作:
其中算术扩展具有增加其名称存储在 中的变量值的副作用
$kind
,并且我们通过将其传递给 null 命令来丢弃该扩展的结果:
,因此实际上它类似于 ksh 样式(( $kind += 1 ))
。