【问题标题】:How to escape a value returned from a command that contains special symbol in the shell script如何转义从 shell 脚本中包含特殊符号的命令返回的值
【发布时间】:2022-10-25 15:55:08
【问题描述】:

我正在使用 shell 脚本创建一个扩展名为 .env 的文件,该文件包含我从 azure key vault 获取的环境变量。 问题是,当我获取密码时,它包含一个特殊字符“%”,该字符被解释为带有以下消息的未知命令: %N: 无效指令

该文件如下所示:

#!/bin/zsh

touch vars.env 

printf "PASSWORD=$(az keyvault secret show --name app-PASSWORD --vault-name "my-vault" --query "value";) \n" >>vars.env

以及文件中的结果(仅“%”符号之前的部分):

PASSWORD="bKt39f

问题是如何对其进行转义,以便将整个密码写入文件而不是其中的一部分。

【问题讨论】:

  • ShellCheck 的话来说:“不要在 printf 格式字符串中使用变量。使用 printf '..%s..' "$foo"。” (more info)

标签: bash printf escaping


【解决方案1】:

您使用 printf 错误。它的第一个参数是一个格式字符串,它告诉它如何打印实际数据(在其余参数中)。在格式字符串中,% 表示一个格式说明符,它告诉它插入一个数据参数(紧跟在% 之后的东西告诉它如何格式化该数据)。使用这样的东西:

printf 'PASSWORD=%s
' "$(az keyvault secret show --name app-PASSWORD --vault-name "my-vault" --query "value";)" >>vars.env

或者可能将“PASSWORD=”视为数据而不是格式的一部分:

printf '%s
' "PASSWORD=$(az keyvault secret show --name app-PASSWORD --vault-name "my-vault" --query "value";)" >>vars.env

在这两种情况下,格式字符串中的%s 表示“将下一条数据作为纯字符串插入”。

【讨论】:

  • 谢谢你的回答,我的问题是错误的。我使用了“echo”而不是“printf”,问题就解决了。但是您的回答帮助我认识到了问题所在。
  • @MaksymFedosov 实际上,我会推荐一个更正的printf 版本而不是echo,因为虽然echo 不会对% 做任何奇怪的事情,但它可能 做奇怪的事情。或者它可能不会。这是奇怪和不一致的,因此最好避免它。当你正确使用它时,printf刚刚好.请参阅 Unix 和 Linux 问题"Why is printf better than echo?"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多