wc不返回整数值

时间:2017-08-19 02:40:00

标签: 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

当我运行脚本时:

./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)

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

独立(( ... ))表示法(与算术扩展$(( ... ))相对)不是POSIX的一部分,因此不存在于其他炮弹。 zsh也支持它的一个版本,但它的数字更加挑剔,除非你删除引号,否则它将无效 - 只要$i中的文件存在且$3有效包含法定编号:

# zsh 
if (( $(wc -c <"$i") > $3 )); then
...
fi