wc 不返回整数值 - 需要整数表达式

Mar*_*lik 1 bash shell wc

我正在尝试运行此脚本:

#!/bin/sh
cd $1
for i in */*.$2
do
   if [ 'wc –c $i' -gt $3 ]
   then
       chmod o-r $i
   fi
done
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时:

./script folder1 txt 500
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

./script: line 5: [: wc –c $i: integer expression expected
./script: line 5: [: wc –c $i: integer expression expected
Run Code Online (Sandbox Code Playgroud)

为什么 wc 不返回整数值的任何想法?

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

Mar*_*eed 6

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

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

# any POSIX shell
if [ "$(wc -c <"$i")" -gt "$3" ]; then
...
fi
Run Code Online (Sandbox Code Playgroud)

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

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

# bash/ksh
if (( "$(wc -c <"$i")" > "$3" )); then
 ...
fi
Run Code Online (Sandbox Code Playgroud)

独立的((...))符号(与算术扩展$((...相对)))不是 POSIX 的一部分,因此不存在于其他 shell 中。zsh 也支持它的一个版本,但它对它的数字更加挑剔,除非你去掉引号,否则它不会工作 - 只要文件$i存在并且$3包含合法数字,它就可以工作:

# zsh 
if (( $(wc -c <"$i") > $3 )); then
...
fi
Run Code Online (Sandbox Code Playgroud)

  • `wc` 将输出文件名及其大小,这也会导致错误。您可以通过使用 `wc -c &lt;"$i"`(注意 `&lt;`)将文件传递到 stdin(因此 `wc` 无法看到名称)来避免这种情况。或者,如果您确实想要以字节为单位的文件大小,请使用 `stat -f %z "$i"`。 (3认同)