我尝试过命令替代,但它取代了' \ 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
$
我该怎么做?
答案 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