我有一个脚本文件:
#!/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]}"
(该语法也应该适用于ksh93
and zsh
)。
如果您无法修改它 config.txt
以使其与您的 shell 语法兼容,您可以在评估之前对其进行即时编辑。像(用ksh93
,bash
或zsh
):
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" )