gpt4 book ai didi

bash - wc 不返回整数值 - 应为整数表达式

转载 作者:行者123 更新时间:2023-12-04 16:17:17 25 4
gpt4 key购买 nike

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

#!/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)

最佳答案

您使用了错误的引号。您正在复制的代码在 ` 周围有反引号 ( 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和 friend :

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

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

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

关于bash - wc 不返回整数值 - 应为整数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45767122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com