我试过命令替换,但它用空格替换了'\n'
$ export GREENIE="$(python -c 'print "\n\r"*4')"
$ echo $GREENIE |hexdump
0000000 200d 200d 200d 0a0d
0000008
$
我需要的是这样的:
$ echo $GREENIE |hexdump
00000000 0a0d 0a0d 0a0d 0a0d
00000008
$
我该怎么做?
最佳答案
您的 Python 单行程序按原样工作得很好;问题是你的测试。无论您如何设置变量,您都不会在 hexdump 中正确地看到它的值,除非您引用它的扩展,如下所示:
$ printf '%s' "$GREENIE" | hexdump
0000000 0a 0d 0a 0d 0a 0d 0a 0d
0000008
(我使用 printf
而不是 echo
以避免混淆,因为 echo
在末尾添加了一个额外的换行符,它显示在hexdump
的输出,即使它不是 $GREENIE
值的一部分。我也可以使用 echo -n
,因为这是一个 bash-具体问题,但我尽量避免,因为它不是 POSIX 的一部分。)
如果没有引号,shell 会在换行符上进行分词,因此除了从 printf
返回的回车符之外,您什么也得不到:
$ printf '%s' $GREENIE | hexdump
0000000 0d 0d 0d 0d
0000004
如果您改用 echo
(使用 bash 的 -n
选项来避免令人困惑的额外换行符),它只是将那些回车符与默认分隔符 (空格):
$ echo -n $GREENIE | hexdump
0000000 0d 20 0d 20 0d 20 0d
0000007
您也可以使用 shell 内置函数来生成字符串,尽管它没有方便的字符串乘数运算符。您可以使用一个愚蠢的 for 循环:
GREENIE=$(for ((i=0;i<4;++i)); do printf '\n\r'; done)
但它足够短,您可以直接输入:
GREENIE=$(printf '\n\r\n\r\n\r\n\r')
如果我们是特定于 bash 的,您可以使用 ANSI 字符串并跳过 printf
:
GREENIE=$'\n\r\n\r\n\r\n\r'
或者将它们结合起来并通过大括号扩展变得可爱:
GREENIE=$(printf '%s' $'\n\r'{,,,})
无论哪种方式,如果您只是在 shell 脚本中使用变量,则不需要将其export
到环境中;这只是为了让其他程序可以访问它:
$ GREENIE=hello
$ echo $GREENIE
hello
$ python -c 'import os; print os.getenv("GREENIE")'
None
$ export GREENIE
$ python -c 'import os; print os.getenv("GREENIE")'
hello
您还可以将变量导出到特定程序的环境中,而无需在 shell 中设置它,方法是将赋值放在运行程序的命令行上:
$ unset GREENIE
$ echo $GREENIE
$ GREENIE=hello python -c 'import os; print os.getenv("GREENIE")'
hello
$ echo $GREENIE
$
如果您不将它导出到环境中,通常的惯例是给它一个小写的名称:
$ greenie=hello
$ echo $greenie
hello
关于bash - 我如何实际将 "\n\r"写入环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309822/