wc 不是 return 整数值 - 应为整数表达式

wc does not return an integer value - integer expression expected

我正在尝试 运行 这个脚本:

#!/bin/sh
cd 
for i in */*.
do
   if [ 'wc –c $i' -gt  ]
   then
       chmod o-r $i
   fi
done

当我运行脚本时:

./script folder1 txt 500

我收到这个错误:

./script: line 5: [: wc –c $i: integer expression expected
./script: line 5: [: wc –c $i: integer expression expected

知道为什么 wc 不返回整数值吗?

我正在使用 GNU bash,版本 4.4.12(1)-release (x86_64-apple-darwin16.3.0)

您使用了错误的引号。您正在复制的代码在 wc 命令周围有反引号 (`),而不是撇号 (')。 (反引号是美式键盘上数字 1 左侧的键。)

但是无论如何你都应该避免使用它们,因为它们有一些令人困惑的副作用,这些副作用会出现在嵌套命令中;它们只是为了向后兼容,因为它们是在最早的 UNIX shell 中进行命令替换的唯一方法。在现代 shell 中,请改用 $(...)。您还应该双引号所有参数扩展:

# any POSIX shell
if [ "$(wc -c <"$i")" -gt "" ]; then
...
fi

(我用 wc -c <"$i" 替换了 wc -c "$i" 因为,正如 Gordon 在评论中指出的那样,wc 输出文件名和计数;将文件作为输入提供意味着它没有文件名并只输出我们要查找的数字。)

在 bash 或 ksh 中我会更进一步并使用 ((...)) 进行算术比较而不是 [...];这样你就可以使用正常的不等式运算符,比如 > 而不是 -gt 和朋友:

# bash/ksh
if (( "$(wc -c <"$i")" > "" )); then
 ...
fi

独立的 ((...)) 符号(与算术扩展 $((...)) 相对)不是 POSIX 的一部分,因此不存在于其他 shell 中。 zsh 也支持它的一个版本,但它对它的数字比较挑剔,除非你去掉引号,否则它不会工作——只要 $i 中的文件存在并且 </code>包含合法号码:</p> <pre><code># zsh if (( $(wc -c <"$i") > )); then ... fi