Bash将文件内容中的空格和换行符保留为变量

时间:2017-12-07 16:23:46

标签: bash

我有这段代码

TOKEN=$(cat ./config/token)

echo "$TOKEN"

cat > variables.env <<EOF
TOKEN=`echo "$TOKEN"`
EOF

我正在尝试获取文件的内容并将其输出到以某些文本为前缀的新文件中。控制台中的第一个echo回显我想要的输出,保留空格和换行符。

但是,在新文件中,输出只是原始字符串的第一行,而我想在控制台中看到第一行echo的相同输出。

4 个答案:

答案 0 :(得分:2)

使用printf %q(在ksh或bash中)以某种方式转义内容,使其始终评估回其字面值:

printf 'TOKEN=%q\n' "$(<./config/token)" >variables.env

$(<file)是一个ksh和bash扩展,它可以更有效地替换$(cat file)(因为常规命令替换需要分离子进程,设置FIFO,并生成外部副本是/bin/cat,而$(<file)形式只是告诉shell直接读取文件。)

这种方式包含一个包含其他恶意字符串(例如$(rm -rf ~))或内容可以简单地扩展为变量($$),将作为文字内容发出。

提供行为方式的明确示例:

printf '%s\n' "first line" "second line" >token # write two lines to the file "token"
printf 'TOKEN=%q\n' "$(<token)" >variables.env # write a shell command which assigns those
                                               # two lines to a variable to variables.env
source variables.env   # execute variables.env in the current shell
echo "$TOKEN"          # emit the value of TOKEN, as given in the current shell

...使用bash运行时,会发出准确的输出:

first line
second line

...将以下内容(使用bash 3.2.48;可能因其他版本而异)写入variables.env

TOKEN=$'first line\nsecond line'

答案 1 :(得分:0)

你是以一种非常复杂的方式做到这一点,有更简单的方法

sed '1s/./TOKEN=&/' file > newfile

会在第一行插入TOKEN=。这具有不修改空文件的额外好处(原始文件中应该至少存在一个char)。如果不是这样,你可以使用无条件插入。

答案 2 :(得分:0)

你可以这样做:

echo "TOKEN=" > newfile && cat ./config/token >> newfile
  • >>附加到文件。

答案 3 :(得分:0)

Useless use of echo

这是你可以写的:

add = \x -> \y -> x + y -- or \x y -> x + y as noted above
add x = \y -> x + y
add x y = x + y