我正在寻找一种有条件地运行尾随命令的方法。我用 && 将一堆 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