单行中的条件运行尾随命令

单行中的条件运行尾随命令

我正在寻找一种有条件地运行尾随命令的方法。我用 && 将一堆 bash 命令链接在一起。大于0运行。 0 不。这是相关部分。

mac RC=42 $ echo "abc abc" | wc -w && echo hi
2
hi
mac $ echo "" | wc -w && echo hi
0
hi

我正在寻找一种方法,当返回wc计数大于 0 时运行 && 部分,而不是运行为零。

所以你可以想出一些可以在完整命令中工作的东西。

find '/Users/mac/exifin/' \( -iname "*.nef" -o -iname "*.dng"  \) -type f \
 -exec sh -c "ls -l \"{}\" && /usr/local/bin/exiftool -GPSLatitude -GPSLongitude \"{}\" |\
 wc -w && echo copy && cp \"{}\" '/Users/mac/exifout/' && echo  \"   Delivered\" " \;

我在 MacOS 10.10.5 终端中运行它。

答案1

您可以像任何其他命令一样通过管道输入条件表达式:

$ echo | wc -w | [ $(cat) -gt 0 ] && echo hi

$ echo "abc abc" | wc -w | [ $(cat) -gt 0 ] && echo hi
hi

cat里面$( ... )命令替换将管道输入输入到命令行中,就好像它是写在那里一样,然后测试其数值是否大于 0[ ... ]如果是,则整个块返回 true,否则返回 false,因此您可以&&像往常一样使用它。

你也可以使用test按名称而不是 as [

$ echo "abc abc" | wc -w | test $(cat) -gt 0 && echo hi

您可以改为避免该cat过程read;echo $REPLY,但这可能并不重要。


在 Bash 中,这是有效的,并且cat在正确的地点和时间运行管道内,但在其他一些 shell(包括 zsh)中则不然。我不知道这是否是明确指定的行为,但它在 POSIX 和非 POSIX 模式下(macOSsh是 POSIX 模式下的 Bash),至少在 3.2 之前的 Bash 版本中都是稳定的。我对 POSIX 的阅读与这是正确的结果一致。

答案2

您可以用于grep此目的。

grep -qP '\S'

输入中的任何非空白字符都会以 0 退出。 --q代表安静(无输出) --P代表 Perl 正则表达式 -\S代表非空白字符

一些例子:

$ echo | grep -qP '\S' && echo ok
$ echo "  " | grep -qP '\S' && echo ok
$ echo " x  " | grep -qP '\S' && echo ok
ok

如果这是你真正想要的。

答案3

我会做什么:

find '/Users/mac/exifin/' \( -iname "*.nef" -o -iname "*.dng"  \) -type f  -exec bash -c 'if test -f "$1"; then if (( $(/usr/local/bin/exiftool -GPSLatitude -GPSLongitude "$1" | wc -w) > 0)); then echo copy; cp "$1" "/Users/mac/exifout/" && echo  "Delivered"; fi; fi' -- {} \;

您不能依赖布尔逻辑,因为wc -v它在输出时不返回错误0

相关内容