【问题标题】:How to pass a string argument having new line to bash file and then passing the complete string to a file?如何将具有新行的字符串参数传递给 bash 文件,然后将完整的字符串传递给文件?
【发布时间】:2017-06-10 15:49:21
【问题描述】:

我有一个字符串如下:

variable="[name]\nabc\n[ip]\n10.12.02\n[name2]\nxyz\n[ip2]\n2.3.536"
"some_bash.sh", :arg=>variable

在 some_bash.sh 中,我将参数放入文件中,如下所示:

echo "$1" >> /etc/some_file

在文件中我得到以下内容:

[name]

我也得到错误 10.12.02: command not found 名称2:找不到命令 xyz:找不到命令 ip2:找不到命令

但我想要以下内容:

[name]
abc
[ip]
10.12.02
[name2]
xyz
[ip2]
2.3.536

那么请告诉我,我应该如何做到这一点,并将上述结果保存在一个文件中?

【问题讨论】:

  • @Inian 按照建议更新了问题

标签: string bash newline


【解决方案1】:

建议使用printf 而不是echoecho -e,因为它更便携。

虽然POSIX 描述了echo 的行为,但实际上它的可移植性并不高。 echo 的 POSIX 文档甚至建议“鼓励新应用程序使用 printf 而不是 echo。

sampleScript.sh 中使用printf 来扩展字符串,从而能够解释转义序列(\n\t 等)。

#!/bin/bash
printf "$1\n" >> /etc/some_file

并将您的脚本传递为

./sampleScript.sh "[name]\nabc\n[ip]\n10.12.02\n[name2]\nxyz\n[ip2]\n2.3.536"

【讨论】:

  • 您已经在 bash 脚本中获取了变量,但在我的情况下,我需要将完整的字符串作为参数传递给 bash:sample.sh: args=> "[name]\nabc\ n[ip]\n10.12.02\n[name2]\nxyz\n[ip2]\n2.3.536" 并在 samle.sh 内: echo "$1" >> /etc/some_file.
  • 我按照您的建议删除了空间。
  • 因为您的解决方案不符合我的问题陈述。
  • 现在它安静有用了..谢谢
【解决方案2】:

你可以用这个:

echo -e "$1" >> /tmp/samplefile

-e - 启用反斜杠转义解释

测试:

$ bash sample.sh 'some\ntext\nhere'

【讨论】:

  • 不,它对我不起作用,我做了 $ bash sample.sh '[some]\ntext\n[here]\nothertext' 刚刚得到:[some] as output
【解决方案3】:

替换这一行:

echo "[name]\nabc\n[ip]10.12.02\n[name2]\nxyz\n[ip2]2.3.536"

用这条线:

printf -v variable "[name]\nabc\n[ip]10.12.02\n[name2]\nxyz\n[ip2]2.3.536"

printf-v 选项会导致为其名称后面的变量分配值,而printf 会按照您编写它们的方式解释换行符。

作为一般规则,printfecho 相比,在不同的实现中具有更稳定的行为,但如果您需要它们,则需要显式换行(而不是 echo 的默认行为导致它们自动打印)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    相关资源
    最近更新 更多