提问人:eme 提问时间:9/14/2022 更新时间:9/16/2022 访问量:396
文件创建和编辑脚本返回错误替换错误 [重复]
File creation and Editing Script returns Bad Substitution Error [duplicate]
问:
我有一个脚本来创建一个配置。 文件并在其中输入一些行。但是当我运行脚本时,我收到错误消息:
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
答:
-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 之间的区别' 假设我有以下任务:
- 编写脚本以创建其他脚本。
- 其他脚本需要使用 $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 你可以使用
- 回波
- 猫
- printf
- 哎呀呀
- 将输出重定向到预期输出文件的任何其他命令或应用程序。 同时完成分配给您的任务。 如果你的队友问为什么,问那个人: 我是否需要完成我的任务并向客户和我们的产品提供相关输出 或者找到回答你的问题的方法。 如果有兴趣捐赠,请在 mukeshgct@oksbi
评论
2赞
Charles Duffy
9/14/2022
\$
很重要(如果你不打算使用),但为什么呢?当 OP 希望他们的输出是 YAML 文件,而不是运行以创建 YAML 文件的 shell 脚本时,为什么要在 heredoc 中放置命令?<<'EOF'
\"
printf
printf
0赞
Charles Duffy
9/16/2022
即使进行了编辑,我仍然不明白为什么要在输出文件中放置任何命令。 只会将您的 heredoc 的内容直接复制到 ;你不需要那个 heredoc 中的任何其他东西。创建的输出文件应为 YAML 文件,而不是可用于创建 YAML 文件的脚本。cat <<EOF >output
output
printf
cat >config.yml
0赞
Charles Duffy
9/16/2022
您后面的演示是 ,其中您显式创建了一个脚本(因此在该脚本中包含类似命令是有意义的);但早期的代码是 ,而不是类似 .(bash 脚本不应该有 .sh 扩展名,但这是一个单独的讨论)。>test.sh
echo
>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 -e
printf
echo -e
1赞
murugesan openssl
9/16/2022
您不需要 printf 或该 heredoc 中的任何其他内容。这是你的疑问还是你在问我问题?我写了我的评论来帮助解决您在使用命令时面临的问题。我尝试在我的目录~/stackoverflow/73719133目录中使用示例命令来帮助您解决面临的错误。
评论
path.config
不是 中的有效参数。bash
${path.config}
EOF
cat > "config.yml" <<'EOF'
${path.config}