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

lzu*_*tao 2 bash environment-variables

我尝试过命令替换,但用空格替换'\n'

$ export GREENIE="$(python -c 'print "\n\r"*4')"
$ echo $GREENIE |hexdump
0000000 200d 200d 200d 0a0d                    
0000008
$ 
Run Code Online (Sandbox Code Playgroud)

我只需要这样:

$ echo $GREENIE |hexdump
00000000  0a0d 0a0d 0a0d 0a0d
00000008
$
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Mar*_*eed 7

你的Python单行程就可以正常工作了; 问题是你的考验.无论你如何设置变量,你都不会在你的hexdump中正确看到它的值,除非你引用它的扩展,如下所示:

$ printf '%s' "$GREENIE"  | hexdump
0000000 0a 0d 0a 0d 0a 0d 0a 0d
0000008
Run Code Online (Sandbox Code Playgroud)

(我使用printf而不是echo为了避免混淆,因为echo在结尾处添加了一个额外的换行符,hexdump即使它不是值的一部分也显示在输出中$GREENIE.我也可以使用,echo -n因为这是一个特定于bash的问题,但是我尽量避免这种情况,因为它不是POSIX的一部分.)

如果没有引号,shell会在换行符上进行分词,所以除了从printf以下位置返回的回车之外什么也得不到:

$ printf '%s' $GREENIE | hexdump
0000000 0d 0d 0d 0d
0000004
Run Code Online (Sandbox Code Playgroud)

如果你使用echo(使用bash的-n选项来避免令人困惑的额外换行符),它只是将这些回车符连接到默认分隔符(空格):

$ echo -n $GREENIE  | hexdump
0000000 0d 20 0d 20 0d 20 0d
0000007
Run Code Online (Sandbox Code Playgroud)

您也可以使用shell内置函数来生成字符串,尽管它没有方便的字符串乘法运算符.你可以使用哑来换循环:

GREENIE=$(for ((i=0;i<4;++i)); do printf '\n\r'; done)
Run Code Online (Sandbox Code Playgroud)

但它足够短,你可以输入:

GREENIE=$(printf '\n\r\n\r\n\r\n\r')
Run Code Online (Sandbox Code Playgroud)

如果我们是特定于bash的,你可以使用ANSI字符串并跳过printf:

GREENIE=$'\n\r\n\r\n\r\n\r'
Run Code Online (Sandbox Code Playgroud)

或者将它们结合起来,并通过大括号扩展变得可爱

GREENIE=$(printf '%s' $'\n\r'{,,,})
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,如果您只是在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
Run Code Online (Sandbox Code Playgroud)

您还可以将一个变量导入到特定程序的环境中,而无需在shell中设置它,方法是将赋值放在运行程序的命令行上:

$ unset GREENIE
$ echo $GREENIE

$ GREENIE=hello python -c 'import os; print os.getenv("GREENIE")'
hello
$ echo $GREENIE

$
Run Code Online (Sandbox Code Playgroud)

如果您将其导出到环境中,通常的惯例是给它一个小写的名称:

$ greenie=hello
$ echo $greenie
hello
Run Code Online (Sandbox Code Playgroud)