从文件内容到变量,bash保存白色空间和新线



我有这个代码

TOKEN=$(cat ./config/token)
echo "$TOKEN"
cat > variables.env <<EOF
TOKEN=`echo "$TOKEN"`
EOF

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

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

使用 printf %q(以ksh或bash的速度)以始终评估其字面价值的方式来逃避内容:

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

$(<file)是KSH和BASH扩展程序,可作为$(cat file)的更有效的替代品(因为常规命令替代需要分配子过程,设置FIFO并产生/bin/cat的外部副本,而$(<file)表格则简单告诉外壳直接读取文件)。

这样的方式包含包含其他敌对字符串(例如$(rm -rf ~))或可以简单地扩展为变量($$)的内容的内容将被排放为文字内容。


提供一个明确的示例:

printf '%sn' "first line" "second line" >token # write two lines to the file "token"
printf 'TOKEN=%qn' "$(<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 linensecond line'

无用的echo

这就是您可以写的:

cat > variables.env <<EOF
TOKEN=${TOKEN}
EOF

您正在以一种非常复杂的方式进行操作,有更轻松的方法

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

将在第一行中插入TOKEN=。这具有不修改空文件的附加好处(原始文件中至少应该存在一个字符)。如果不是打算,您可以使用无条件插入。

您可以做:

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

最新更新