文件创建和编辑脚本返回错误替换错误 [重复]

File creation and Editing Script returns Bad Substitution Error [duplicate]

提问人:eme 提问时间:9/14/2022 更新时间:9/16/2022 访问量:396

问:

我有一个脚本来创建一个配置。 文件并在其中输入一些行。但是当我运行脚本时,我收到错误消息:

line 2: filebeat.inputs:
- type: filestream
  id: my-filestream-id
  enabled: true
: bad substitution

知道这意味着什么吗?我该如何解决它?我在下面分享了脚本:

#!/bin/bash
cat > "config.yml" <<EOF
filebeat.inputs:
- type: filestream
  id: my-filestream-id
  enabled: true
  paths:
    - /home/ubuntu/logs/**/*.log
filebeat.config.modules:
  # Glob pattern for configuration loading
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
output.logstash:
  hosts: ["10.09.0.2:5044"]
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
EOF
bash shell 语法错误

评论

2赞 M. Nejat Aydin 9/14/2022
path.config不是 中的有效参数。bash
2赞 M. Nejat Aydin 9/14/2022
例如,如果您想要在输出中使用文字,则应引用 : 。${path.config}EOFcat > "config.yml" <<'EOF'
0赞 wjandrea 9/14/2022
您确切期望的输出是什么?我对 YAML 不是很熟悉,所以我不确定应该是什么意思。${path.config}
2赞 Charles Duffy 9/14/2022
@wjandrea,它在 YAML 本身根本没有意义;就 YAML 而言,它只是一个任意字符串,但据推测,无论哪个程序解析它都会进行进一步的解释。

答:

-3赞 murugesan openssl 9/14/2022 #1

在 之前添加反斜杠可避免此问题:$

#!/bin/bash
if [ ! -f config.yml ]
then
 cat > config.yml <<EOF
printf "filebeat.inputs:
- type: filestream
  id: my-filestream-id
  enabled: true
  paths:
    - /home/ubuntu/logs/**/*.log
filebeat.config.modules:
  # Glob pattern for configuration loading
  path: \${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
output.logstash:
  hosts: [\"10.09.0.2:5044\"]
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~"
EOF
fi
ls -ltr  config.yml

更多信息: Bash - <<EOF 和 <<'EOF 之间的区别' 假设我有以下任务:

  1. 编写脚本以创建其他脚本。
  2. 其他脚本需要使用 $PATH 而不是使用该值。 在这种情况下,我需要:
printf "\$PATH"

而不是使用

printf "$PATH"

示例命令:

$ echo -e "#\041/bin/bash\necho \$PATH" > test.sh;cat test.sh
#!/bin/bash
echo $PATH
$ chmod +x ./test.sh
$ ./test.sh
/usr/bin:/bin:....output

因此,我使用了 $ 我尝试使用printf 你可以使用

  1. 回波
  2. printf
  3. 哎呀呀
  4. 将输出重定向到预期输出文件的任何其他命令或应用程序。 同时完成分配给您的任务。 如果你的队友问为什么,问那个人: 我是否需要完成我的任务并向客户和我们的产品提供相关输出 或者找到回答你的问题的方法。 如果有兴趣捐赠,请在 mukeshgct@oksbi

评论

2赞 Charles Duffy 9/14/2022
\$很重要(如果你不打算使用),但为什么呢?当 OP 希望他们的输出是 YAML 文件,而不是运行以创建 YAML 文件的 shell 脚本时,为什么要在 heredoc 中放置命令?<<'EOF'\"printfprintf
0赞 Charles Duffy 9/16/2022
即使进行了编辑,我仍然不明白为什么要在输出文件中放置任何命令。 只会将您的 heredoc 的内容直接复制到 ;你不需要那个 heredoc 中的任何其他东西。创建的输出文件应为 YAML 文件,而不是可用于创建 YAML 文件的脚本。cat <<EOF >outputoutputprintfcat >config.yml
0赞 Charles Duffy 9/16/2022
您后面的演示是 ,其中您显式创建了一个脚本(因此在该脚本中包含类似命令是有意义的);但早期的代码是 ,而不是类似 .(bash 脚本不应该有 .sh 扩展名,但这是一个单独的讨论)。>test.shecho>config.yml>make-yml-config
1赞 Charles Duffy 9/16/2022
另外,对于未来,我强烈建议您考虑更换为更便携的表亲。参见 echo 的 POSIX 标准的 APPLICATION USAGE 和 RATIONALE 部分,以及 Unix 和 Linux 问题 Why is printf better than echo?;斯蒂芬·查泽拉斯 (Stephane Chazelas) 的出色回答深入探讨了背后的历史以及为什么它如此成问题。echo -eprintfecho -e
1赞 murugesan openssl 9/16/2022
您不需要 printf 或该 heredoc 中的任何其他内容。这是你的疑问还是你在问我问题?我写了我的评论来帮助解决您在使用命令时面临的问题。我尝试在我的目录~/stackoverflow/73719133目录中使用示例命令来帮助您解决面临的错误。