我正在尝试运行此脚本:
#!/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)
您使用了错误的引号。您正在复制的代码`在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)
| 归档时间: |
|
| 查看次数: |
5027 次 |
| 最近记录: |