&引用;[:LinuxBash脚本中的“if”语句中参数过多“error”

&引用;[:LinuxBash脚本中的“if”语句中参数过多“error”,linux,bash,Linux,Bash,为什么我会出现这个错误: 第9行:[:参数太多 执行此bash脚本时: IN_FOLDER=period_to_import cd $IN_FOLDER for filename in *; do WC=$(wc -w $filename) if [ $WC -gt 33 ] then rm $filename fi done wc-w filename返回的不仅仅是字数。您可以这样解决: if [ "${WC% *}" -gt 33 ] then rm

为什么我会出现这个错误:

第9行:[:参数太多

执行此bash脚本时:

IN_FOLDER=period_to_import

cd $IN_FOLDER


for filename in *; do
WC=$(wc -w $filename)

if [ $WC -gt 33 ]
then
        rm $filename
fi
done

wc-w filename
返回的不仅仅是字数。您可以这样解决:

if [ "${WC% *}" -gt 33 ]
then
        rm $filename
fi
${WC%*}
从最后一个空格向右修剪所有内容

虽然在单括号中使用无引号的变量通常是个坏主意

<>你可以考虑用AWK代替:

IN_FOLDER=period_to_import

cd "$IN_FOLDER"

for filename in *; do
    if awk -v n=0 '{n++} END{if (n > 33) exit 0; else exit 1}' "$filename"
    then
        rm "$filename"
    fi
done

请记住,在空目录中使用
*
进行全局搜索可能不起作用。

wc-wx
将输出两个参数:
大小文件名
。在进行比较之前,需要修剪文件名部分。可以通过将文件重定向到
wc
,例如
$(wc-w是的。
[“$wc”-gt 33]来避免这种情况
,加上引号,将提供一条更有用的错误消息。顺便说一句,为您自己定义的所有变量使用小写名称是一种很好的形式——因为对shell或POSIX定义的工具有意义的变量都必须是大写的,为您自己的变量使用小写名称可以防止冲突。顺便说一句,re:last line aside,
shopt-s nullglob
将使
*
在空目录中产生一个长度为零的列表。(不过,我们需要注意其副作用,因为
foo'*.txt'
通常会导致文件未找到错误,而没有任何参数的
foo
可能会默认使用stdin/stdout,
nullglob
会使想要被捕获为错误的情况转而导致不必要的行为)。