我需要能够写出 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
将布尔值打印为1
或0
。