Bash 我该怎么写呢\n\r";环境变量?

Bash 我该怎么写呢\n\r";环境变量?,bash,environment-variables,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 $ $ printf '%s' "$

我尝试了命令子项,但它将“\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
$
$ printf '%s' "$GREENIE"  | hexdump
0000000 0a 0d 0a 0d 0a 0d 0a 0d
0000008

我怎样才能做到这一点呢?

您的Python一行程序工作正常;问题是你的考试。无论您如何设置变量,您都无法在hexdump中正确地看到其值,除非您引用其扩展,如下所示:

$ echo $GREENIE |hexdump
00000000  0a0d 0a0d 0a0d 0a0d
00000008
$
$ printf '%s' "$GREENIE"  | hexdump
0000000 0a 0d 0a 0d 0a 0d 0a 0d
0000008
(为了避免混淆,我使用了
printf
而不是
echo
,因为
echo
在末尾添加了一个额外的换行符,它显示在
hextump
的输出中,尽管它不是
$GREENIE
值的一部分。我也可以使用
echo-n
,因为这是一个特定于bash的问题,但我尝试避免这种情况,因为它不是POSIX的一部分。)

在没有引号的情况下,shell在换行符上进行分词,因此除了从
printf
返回的回车外,您什么也得不到:

$ printf '%s' $GREENIE | hexdump
0000000 0d 0d 0d 0d
0000004
GREENIE=$'\n\r\n\r\n\r\n\r'
如果改为使用
echo
(使用bash的
-n
选项以避免混淆额外的换行符),它只会将这些回车与默认分隔符(空格)连接在一起:

您也可以使用shell内置程序生成字符串,尽管它没有方便的字符串乘数运算符。您可以使用哑for循环:

GREENIE=$(for ((i=0;i<4;++i)); do printf '\n\r'; done)
如果我们是特定于bash的,您可以使用ANSI字符串并跳过
printf

$ printf '%s' $GREENIE | hexdump
0000000 0d 0d 0d 0d
0000004
GREENIE=$'\n\r\n\r\n\r\n\r'
或者将它们结合起来,通过支架扩展变得可爱:

GREENIE=$(printf '%s' $'\n\r'{,,,})
无论哪种方式,如果您只是在shell脚本中使用变量,则不需要将其导出到环境中;这只是为了使其他程序可以访问它:

$ 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

您可能想要
\r\n
,而不是
\n\r
。您是捕获此类错误(无引号扩展)的朋友吗。在捕捉到它为您发现的内容后,您仍然会从
echo
中获得一个额外的换行符,但这将是一组较小的问题。顺便说一句,所有caps变量名实际上都保留在对操作系统和shell有意义的变量的空间中(这就是shell本身使用
PS1
PATH
等的原因)。为自己的变量使用小写名称,以防止错误地覆盖对系统有意义的名称;请参阅(讨论环境变量——但shell变量共享同一名称空间:使用现有环境变量的名称设置shell变量将覆盖后者)。顺便说一句--
GREENIE=$”\n\r\n\r\n\r'
将在bash中将有问题的文本字符串分配给您的变量(只有一个常规shell变量,而不是环境变量,直到您导出它为止)