我对 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
前面。(( ))