从另一个文件导入变量

从另一个文件导入变量

我有一个脚本文件:

#!/usr/bin/env bash

. /home/$USER/git_projects/cfhookbash/config.txt

deploy_challenge() {
}

在config.txt中有www.example.com_token="asdfasdf"

www.example.com_token在我的示例中,我需要打印(或重用) , 的值asdfasdf

我明白了/home/sineverba/git_projects/cfhookbash/config.txt: line 1: www.k2p.it_token=asdfasdf: command not found

答案1

在 中bash,变量名只能由单字节字母数字字符或下划线组成(且第一个字符不能是数字)。

因此,www.example.com_token由于不是有效的变量名,因此 www.example.com_token="asdfasdf"不会被识别为赋值,而是被识别为简单的命令。

在 ksh93 中(shellbash尝试模拟),www.example.com_token="asdfasdf"仅当您将www变量定义为化合物多变的:

$ compound www
$ www.example.com_token="asdfasdf"
$ typeset -p www
typeset -C www=(example=(com_token=asdfasdf))
$ printf '%s\n' "${www.example.com_token}"
asdfasdf

在 中bash,您可以使用关联数组变量(由 复制的 ksh93 功能之一bash):

typeset -A token
token[www.example.com]=asdfasdf
printf '%s\n' "${token[www.example.com]}"

(该语法也应该适用于ksh93and zsh)。

如果您无法修改它 config.txt以使其与您的 shell 语法兼容,您可以在评估之前对其进行即时编辑。像(用ksh93,bashzsh):

typeset -A token
. <(sed 's/^\([^=]*\)_token=/token[\1]=/' < config.txt)

将 转换x.y_token=token[x.y]=或:

. <(sed -e :1 -e 's/^\([^=]*\)\.\(.*=\)/\1_\2/; t1' < config.txt)

将 的每个.左边替换为.=_

但请注意,其中任何一个都可能在不需要的地方进行替换,例如:

foo.bar_token="multi
line .x. _token assignment (=)"

或者,如果文件不仅仅包含作业。

现在,如果config.txt实际上不包含正确的 shell 语法,您需要查找其他语法问题,例如包含foo="price: $12"或,foo="x `y' z"是shell 语法中的特殊运算符的行。$`

答案2

正如我所评论的,你不能仅仅获取该 txt 文件,因为它不是一个有效的 shell 脚本。

为了得到那个特别的值,尝试

config=/home/$USER/git_projects/cfhookbash/config.txt
token=$( grep -oP 'www.example.com_token="\K[^"]+' "$config" )

相关内容