强制执行存储在文件中的shell表达式?

0wi1tuuw  于 2023-06-06  发布在  Shell
关注(0)|答案(2)|浏览(575)

假设我有hi.json:

{
  "word": "$(echo hello-world)"
}

有没有一种简单的方法来强制执行shell表达式,使我的结果是?

{
  "word": "hello-world"
}

我可以处理它的一种方法是将此字符串的内容存储在某个shell文件中,这样我就有了这样的内容:

scratch_MAIN() {
  content="{\"word\": \"$(echo hello-world)\"}"
  echo $content
}

scratch_MAIN

它给出了

{"word": "hello-world"}

但是,我想将hi.json内容存储在一个独立的文件中,而不是shell文件。这可能吗?

7fhtutme

7fhtutme1#

eval会做你的工作。你必须显式地转义引号,否则当json内容传递给eval时,它们将被处理。
我的测试hi.json

{
  "word": "$(echo hello-world)",
  "foo": 123,
  "boolean": false,
  "files": "$(ls)"
}

如果你有像jq这样的json处理器,你也可以漂亮地打印结果。

$ fc=$(cat hi.json) && eval echo ${fc//\"/\\\"}
{ "word": "hello-world", "foo": 123, "boolean": false, "files": "hi.json testfile.sh" }

$ fc=$(cat hi.json) && eval echo ${fc//\"/\\\"} | jq
{
  "word": "hello-world",
  "foo": 123,
  "boolean": false,
  "files": "hi.json test.sh"
}
n3h0vuf2

n3h0vuf22#

我建议不要这样做,但...

result=$(eval "cat <<EOD"$'\n'"$(<hi.json)"$'\n'EOD)

注意,替换的结果在json字符串中可能是不法律的的。例如,命令输出中的换行符需要转义。

相关问题