gpt4 book ai didi

bash - 多个 if 子句。这段代码有什么问题?

转载 作者:行者123 更新时间:2023-11-29 09:42:57 25 4
gpt4 key购买 nike

我正在练习编写小型 bash 脚本。我有不小心输入“teh”而不是“the”的习惯。所以现在我想从一个目录开始,遍历那里的所有文件,找出“teh”出现的次数。

这是我所拥有的:

    #!/bin/bash

for file in `find` ; do
if [ -f "${file}" ] ; then
for word in `cat "${file}"` ; do
if [ "${word}" = "teh" -o "${word}" = "Teh" ] ; then
echo "found one"
fi
done
fi
done

当我运行它时,我得到

    found one
found one
found one
found one
found one
found one
./findTeh: line 6: [: too many arguments

为什么我收到太多争论。我没有正确执行 if 语句吗?

谢谢

最佳答案

根据 POSIX,具有三个以上参数的 test 的行为未明确定义且已弃用。这是因为在这种情况下,变量参数可以被视为对测试命令本身有意义的逻辑结构。

相反,请使用以下内容,它适用于所有 POSIX shell,而不仅仅是 bash:

if [ "$word" = teh ] || [ "$word" = Teh ]; then
echo "Found one"
fi

...或者类似地,一个案例陈述:

case $word in
[Tt]eh) echo "Found one" ;;
esac

现在,让我们看看the actual standard underlying the test command :

>4 arguments:

The results are unspecified.

[OB XSI] [Option Start] On XSI-conformant systems, combinations of primaries and operators shall be evaluated using the precedence and associativity rules described previously. In addition, the string comparison binary primaries '=' and "!=" shall have a higher precedence than any unary primary. [Option End]

注意 OB 标志:使用带有四个以上参数的单个 test 命令是过时的,并且是无论标准如何(并非所有 shell 都需要实现)。


最后,请考虑对您的脚本进行以下修改,修复各种其他错误(尽管使用各种 bashism,因此不能移植到所有 POSIX shell):

#!/bin/bash

# read a filename from find on FD 3
while IFS= read -r -d '' filename <&3; do
# read words from a single line, as long as there are more lines
while read -a words; do
# compare each word in the most-recently-read line with the target
for word in "${words[@]}"; do
[[ $word = [Tt]eh ]] && echo "Found one"
done
done <"$filename"
done 3< <(find . -type f -print0)

一些细节:

  • 通过使用 NUL 分隔文件名,这可以正确处理所有可能的文件名,包括名称中带有空格或换行符的文件,for file in $(find) 则不会。
  • 引用数组扩展,即。 for word in "${words[@]}",避免全局扩展;使用旧代码,如果 * 是文件中的一个词,那么代码随后将迭代当前目录中的文件名而不是文件中的词。
  • 使用 while read -a 一次读取一行既避免了上述的 glob 扩展行为,也可以限制内存使用(如果正在播放非常大的文件)。

关于bash - 多个 if 子句。这段代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35728506/

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