将括号作为脚本参数传递给 macOs defaults 命令

Passing parentheses as script argument to macOs defaults command

我正在为我的 dotFiles 编写安装脚本。如果找到我的笔记本电脑,此脚本的一部分将获取一些基本联系信息以显示在锁定屏幕上。在这个阶段,消息看起来像这样

"If found, please call 000-000-0000 or email my@email.com"

这是我为此编写的函数:

function collectInfo() {
    echo "We'll set a lock screen message for anyone who finds your laptop."
    echo "Please enter a valid phone number: "
    read phonenumber
    echo "Please enter a valid email: "
    read contactemail
    msg="If found, please call "$phonenumber" or email "$contactemail
    sudo defaults write /Library/Preferences/com.apple.loginwindow LoginwindowText $msg
    if [ $? -eq 0 ]; then
        echo "Data entered"
        defaults read /Library/Preferences/com.apple.loginwindow LoginwindowText
    else
        echo "There was an issue with your input.  Please try again"
        collectInfo
    fi
}

如果我尝试将括号传递给登录窗口设置,例如 (000) 000-0000,我会遇到麻烦。我可以回显 $msg 并且它似乎可以很好地创建字符串。有什么方法可以将带括号的字符串作为参数传递,还是我必须使用 sed 来消除它们?

这里有两个混杂因素:

  • 未能在 $msg 周围加上引号会将其拆分为多个单独的参数。
  • (开头,)结尾的参数被defaults解析为一个数组,所以(000)被解析为一个元素的数组。

为确保您的内容被解析为字符串,您可以用文字引号开始和结束它:

defaults write /Library/Preferences/com.apple.loginwindow LoginwindowText "'$msg'"

外部双引号 (") 由 shell 处理,以确保整个消息仅作为一个参数传递;内部单引号 (') 被传递给 defaults 并指导它如何解析值。