【问题标题】:Back slash (\) should not be printed with echo command不应使用 echo 命令打印反斜杠 (\)
【发布时间】:2020-09-14 17:11:15
【问题描述】:

我有一个参数文件(param.env),内容如下。

MY_PARAM=com:27}WMV\)pviZN

另外,我正在获取 MY_PARAM 的值并写入随机文件的 bash 文件。

#!/bin/bash


value=$(grep "^MY_PARAM=" param.env | cut -d '=' -f2-)

value1=$(cat param.env | grep "^MY_PARAM" | sed 's/=/ /' | awk '{print $2}')
echo $value

echo $value1

printf '%s\n' "$value"

输出:

com:27}WMV\)pviZN
com:27}WMV\)pviZN
com:27}WMV\)pviZN

但是,我希望 \ 被转义,不应成为输出的一部分。 我也不允许编辑 param.env。

预期输出:

com:27}WMV)pviZN

【问题讨论】:

  • 请问为什么不能使用 sed 去除反斜杠?
  • 当 ` \` 之后的下一个字符是 nt 而不是字符串中的 ) 时会发生什么?
  • 命令替换的结果不受引号去除;反斜杠是值的一部分,不会转义 )
  • 至少根据github.com/motdotla/dotenv 的自述文件,没有规定(除了用真正的换行符替换\n)在.env 文件中使用反斜杠转义单个字符。
  • 您需要反斜杠的唯一原因是该行是否由 shell 作为分配处理,因为 ) 将被视为元字符。也许写param.env 的人认为它作为shell 脚本处理;我不知道应该如何解析 .env 文件的任何硬性规则。

标签: linux bash awk echo cut


【解决方案1】:

您可以获取文件,然后字符串的行为就像您在交互式 shell 中分配它一样:

$ (. param.env; echo "$MY_PARAM")
com:27}WMV)pviZN

我已将命令放在子 shell 中,这样它们就不会污染环境。

【讨论】:

  • ... 并且可能将结果导出回当前 shell 的 var value
  • @alecxs 这是不可能的(子 shell 不能修改父 shell),但你可以做类似param=$(. param.env; echo "$MY_PARAM")
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 2019-01-13
  • 2013-11-10
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多