我正在编写一个bash脚本来自动化我们的构建过程。我需要在设置plist文件中存储一个路径,并使用plistbuddy在shell脚本中检索它。
下面的键指定存档档案的路径,桌面上的文件夹:
907
在我的shell脚本中,我访问密钥:
N = 500
正如我所料,<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>archives_path</key>
<string>$HOME/Desktop/Archives/</string>
</dict>
</plist>
var未扩展为SETTINGS_PATH="path/to/plist/file"
ARCHIVES=$(/usr/libexec/PlistBuddy -c "Print archives_path" "$SETTINGS_PATH")
#outputs "$HOME/Desktop/Archives/"
mkdir "$ARCHIVES/test/"
#outputs "mkdir: $HOME/Desktop/Archives: No such file or directory"
。
我通过创建一个具有相同字符串的var进行了测试:
ARCHIVES
由于此脚本将在未知用户帐户下运行,因此如何强制$ HOME正确扩展。
答案 0 :(得分:1)
$ARCHIVE
返回的PlistBuddy
包含文字$HOME
。
简单演示:
str='$HOME/tmp/somefile'
echo "The HOME isn't expanded: [[$str]]"
打印:
The HOME isn't expanded: [[$HOME/tmp/somefile]]
您可以使用eval
进行扩展,例如:
expanded_str1=$(eval "echo $str")
echo "The HOME is DANGEROUSLY expanded using eval: [[$expanded_str1]]"
打印
The HOME is DANGEROUSLY expanded using eval: [[/Users/jm/tmp/somefile]]
但使用eval
很危险!评估任何并非绝对不受你控制的字符串真的危险。
因此,您需要手动将文字$HOME
替换为实际的值。它可以通过多种方式完成,例如:
expanded_str2="${str/\$HOME/$HOME}"
# or
expanded_str2=$(echo "$str" | sed "s!\$HOME!$HOME!")
# or
expanded_str2=$(echo "$str" | perl -plE 's/\$(\w+)/$ENV{$1}/g')
# or ... other ways...
使用
echo "$expanded_str2"
打印
/Users/jm/tmp/somefile