将管道结果写入变量

将管道结果写入变量

我需要能够写出 grep 的测试是否是真的或者错误的到变量以便以后可以使用它

对于以下内容,如果我运行

defaults read com.apple.Finder | grep "AppleShowAllFiles"

在我的系统上,它会返回

AppleShowAllFiles = FALSE;

太棒了。现在我想把这个响应传递给某种测试。这就是我被卡住的地方。

我认为如果我可以将这个输出通过管道传输/分配给指定变量,我就可以对其进行测试。现在,假设我已将此输出的值分配给一个变量,在这种情况下,我将使用它$ASAF作为我的变量,我可以像这样在测试中运行它

如果 [ $ASAF = "AppleShowAllFiles = TRUE;" ]; 那么
默认写入 com.apple.Finder AppleShowAllFiles FALSE
killall Finder
否则
默认写入 com.apple.Finder AppleShowAllFiles True
killall Finder
fi

如果有其他方法可以做到这一点,我会非常乐意接受。我已经有一段时间没有做过这样的事情了,我有点不知所措。我在谷歌上搜索了一下,但都是没有解释的答案,而且使用了0或的返回值1。我认为将返回的输出分配给变量会更合适,因为这样我就可以在脚本中根据需要反复使用它。

答案1

如果您只想保存命令的返回代码(成功/失败),请使用$?

# grep -q to avoid sending output to `stdout` and to stop if it finds the target.
defaults read com.apple.Finder | grep -q "AppleShowAllFiles"
NOTFOUND=$?

# Note that we use an *arithmetic* test, not a string test, and that we have to
# invert the arithmetic value.

if ((!NOTFOUND)); then
  # not NOTFOUND is FOUND
  # ...
fi

或者,如果您需要实际的字符串(如您的示例所示),则可以将输出保存在变量中。如果是这样,您的解决方案是合理的,但请注意,解析程序的输出defaults可能非常脆弱,因为微小的格式更改会导致模式突然无法匹配。尝试使您的模式尽可能通用:

# Here we use the `-m1` flag to stop matching as soon as the first line matches
ASAF_STRING=$(defaults read com.apple.Finder | grep -m1 "AppleShowAllFiles")

# Try to parse true or false out of the string. We do this in a subshell to
# avoid changing the shell option in the main shell.
ASAF=$(
  shopt -s nocasematch
  case $ASAF_STRING in 
    *true*) echo TRUE;;
    *false*) echo FALSE;;
    *) echo Could not parse AppleShowAllFiles >> /dev/stderr;;
  esac
)

答案2

我看到了两种方法可以做到这一点,这取决于您是否实际上需要多次该变量。

如果你只需要该变量一次,那么你可以将 grep 组合到 if 语句中,即

如果默认值为 com.apple.Finder | grep -q "AppleShowAllFiles" ; 然后...

或者,如果您需要多次使用该变量,您可以这样做

默认读取 com.apple.Finder | grep -q "AppleShowAllFiles"

ASAF=$?##$? 等于最后一条命令的返回值

如果 [ “$ASAF” -eq “0”]; 然后...

答案3

grep您根本不需要使用:

[[ $(defaults read com.apple.finder AppleShowAllFiles)  0 ]] && bool=true || bool=false
defaults write com.apple.finder AppleShowAllFiles -bool $bool
osascript -e 'quit app "Finder";

defaults read将布尔值打印为10

相关内容