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

标签 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
$

我该怎么做?

最佳答案

您的 Python 单行程序按原样工作得很好;问题是你的测试。无论您如何设置变量,您都不会在 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 内置函数来生成字符串,尽管它没有方便的字符串乘数运算符。您可以使用一个愚蠢的 for 循环:

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

关于bash - 我如何实际将 "\n\r"写入环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41309822/

相关文章:

bash - 终端 - 对整个目录运行 'file' (文件类型)

python - 替换部分字符串

linux - 使进程保持事件状态并跟踪最新的 pid

amazon-web-services - 如何在 CloudFormation 中的多个 ECS 服务定义之间使用同一组环境变量

python - flask 命令错误: No such command ["create_db"]

linux - 使用 sed 或替代函数提取文本行中 $ 和 < 之间的值

bash - 永久更改 CDPATH

angular - SSR 在 Angular 中获取错误的环境

windows - 是否有任何环境变量代表 "C:\Documents and Settings"文件夹或 C :\Users folder in Windows?

linux - 如何从远程服务器通过 Bash 脚本使用 awk 返回数组