unix shell脚本变量声明 - 找不到命令

时间:2014-04-25 08:34:17

标签: linux bash shell unix

nOption=' | awk '{total+=$1} END {print total/1024"kb"}' '
find . -type f -printf "%s %p/n"| sort -nr | head -n10 $nOption

我想创建一个脚本来查找当前目录中的最大文件。 这是我的脚本,如果我使用变量来代替那就有错误....

输出: ./big.sh:line 67:+ =:找不到命令

但如果我不使用变量,它会起作用:

find . -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/1024"kb"}' 

输出是我想要的: 680.021kb

我的剧本出了什么问题?

谢谢

2 个答案:

答案 0 :(得分:4)

Single quoted strings不能包含其他单引号,因此awk命令会被解释为shell命令。 Putting commands in variables很棘手,一般来说创建函数更容易,更安全,更易读:

nOption() {
    awk '{total+=$1} END {print total/1024"kb"}'
}
find . -type f -printf "%s %p/n"| sort -nr | head -n10 | nOption

对于这种特定情况,正如@chepner所指出的那样,问题是你不能|之类的命令分隔符放在一个字符串中,然后将其作为一部分执行管道(没有eval, which is evil)。

答案 1 :(得分:0)

问题在于引号内的引号,在变量扩展中......
为什么不选择单线?这是一个(微小)更快,更光滑......: - )

find . -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/1024"kb"}'

<强>更新
为了使脚本更灵活,您可以这样做:

dir="."
units="1024"
unitsstring="kb"
find "$dir" -type f -printf "%s %p/n"| sort -nr | head -n10 | awk '{total+=$1} END {print total/$units"$unitsstring"}'