我如何实际写" \ n \ r"到环境变量?

时间:2016-12-24 02:32:58

标签: bash environment-variables

我尝试过命令替代,但它取代了' \ 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
$

我该怎么做?

1 个答案:

答案 0 :(得分:7)

你的Python one-liner工作得很好;问题是你的考验。无论你如何设置变量,你都不会在你的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内置函数生成字符串,尽管它没有方便的字符串乘数运算符。你可以使用哑巴循环:

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