linux - 当值为 0 时存储 grep -c 输出时脚本终止

标签 linux bash shell

我正在尝试检查文件是否有 CR 换行并将结果 0 或 1 存储到变量中。

这是我在脚本中运行的命令。

isCR="$(file ${fileName} | grep -c 'with CR line terminators')"

脚本运行到上一行并且不运行该行但突然终止。

在 echo 语句中,它工作得很好。

echo "isCR=$(file ${fileName} | grep -c 'with CR line terminators')"

这会根据我使用的文件打印 isCR=0 或 isCR=1。

但是仅仅将值存储到变量 isCR 中是行不通的。我很困惑我在这里错过了什么。感谢您的帮助。

最佳答案

使用 set -e(又名 set -o errexit)告诉 shell 在任何命令返回非零退出状态时退出。

grep 在找不到匹配项时返回非零退出状态。

因此,当使用 bash -eset -eset -o errexit 时,ERR触发退出或类似配置的陷阱,isCR="$(file ${fileName} | grep -c 'with CR line terminators')" 将终止您的脚本,因为非零退出状态来自grep 命令作为整个命令的退出状态传递。

相比之下,echo "$(false)" 不会,因为它的退出状态是echo,而不是false;当返回失败退出状态的命令也是 grep 时也是如此。


如果您想使用 set -e 但绕过它对这一特定行的行为,请考虑:

isCR="$(file ${fileName} | grep -c 'with CR line terminators')" || [[ $isCR ]]

|| [[ $isCR ]] 将使整个行具有真实的结果,即使 grep 返回 false,只要它发出非零字符数。

关于linux - 当值为 0 时存储 grep -c 输出时脚本终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54776376/

相关文章:

linux - 在不丢失原始排序顺序的情况下进行子排序?

python - 想要在同一个 python 脚本中比较 bash 和 python 的时间

regex - 使用 Bash 从文件名中的特定位置移动数字

python - 如何使用python执行erlang命令

node.js - Node 模块 ifx_db 在 linux 中安装失败

linux - Linux 应用程序的一个实例开始运行其自身的多个实例的可能原因是什么?

python - python脚本的CPU使用率

c - 管道中的其他程序

php - 从 php 执行时,额外的文本来自 shell_exec 命令

c - 当父进程以 Control+C 结束时终止进程