如何使用bash将变量存储到文件中?

7
我可以重定向输出,然后使用cat命令读取文件,并用grep/awk命令处理变量,但我想将此文件用于多个变量。
如果只有一个变量(比如STATUS),那么我可以这样做:
echo "STATUS $STATUS" >> variable.file
#later perhaps in a remote shell where varible.file was copied
NEW_VAR=`cat variable.file | awk print '{$2}'`

我想使用sed进行内联编辑可能会有所帮助。代码越小越好。
2个回答

10

将变量存储在文件中的一种常见方法是只需在文件中存储 NAME=value 行,然后将其源化到您想要获取变量的 shell 中。

echo 'STATUS="'"$STATUS"'"' >> variable.file
# later
. variable.file

在Bash中,你也可以使用source代替.,但这可能无法在其他shell中移植。请仔细注意获取正确的双引号序列以在文件中打印出正确的双引号。

如果你想一次将多个变量放入文件中,可以按照以下步骤进行操作。对于需要正确且具有可移植性的引用转换可能会比较复杂,如果你只限制自己在Bash中,你可以使用$""来使引用转换变得更加简单:

for var in STATUS FOO BAR
do
    echo "$var="'"'"$(eval echo '$'"$var")"'"'
done >> variable.file

5
它可以在任何符合POSIX标准的shell中使用,例如Bash,dash,ksh,zsh等。 - Brian Campbell
确实如此。但不是 csh,也不是 tcsh - Amadan
2
@Amadan 当提到在不同的shell之间进行可移植性时,通常指的是在遵循POSIX标准(或接近标准)的shell之间进行可移植性。当然,相同的构造在非标准的shell或符合不同标准的shell中可能无法实现可移植性。还有许多其他的shell,如cmd.exe、PowerShell等,这些都无法实现可移植性;它们是完全不同的语言,而不是同一语言的变体。 - Brian Campbell
那很酷,但你究竟如何更新文件中的变量?需要再次读取和写入所有内容吗? :/ - phil294
1
@Blauhirn 是的。对于像这样的小配置文件,没有更有效的方法来处理它;整个文件可能适合单个块中,因此编辑整个文件与仅更改需要更改的部分所需的时间相同。如果您正在更新某些效率很重要的大型数据库,则不应该从shell脚本中进行。 - Brian Campbell

9
< p > declare 命令在这里非常有用

for var in STATUS FOO BAR; do
    declare -p $var | cut -d ' ' -f 3- >> filename
done

正如布莱恩所说,稍后您可以执行source filename

declare非常棒,因为它会自动处理引用:

$ FOO='"I'"'"'m here," she said.'
$ declare -p FOO
declare -- FOO="\"I'm here,\" she said."
$ declare -p FOO | cut -d " " -f 3-
FOO="\"I'm here,\" she said."

1
啊,太好了。我不知道 declare -p 这个命令。看起来它不是标准的,但如果你只使用 Bash 和 zsh 的话,它应该可以工作。如果你要将其传递给 Bash,那么你可能不需要使用 cut 命令去掉 declare。通过 declare -p 命令打印出来的声明语句应该可以用来设置变量。 - Brian Campbell
这很酷,但你怎么在文件内部更新变量?重新读取和写入所有内容吗?:/ - phil294

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接