Bash 我该怎么写呢\n\r";环境变量?
我尝试了命令子项,但它将“\n”替换为空格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' "$
$ 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变量,而不是环境变量,直到您导出它为止)