如何将值为 bash 的变量导出为带连字符的字符串?
How to export bash variable with value as string with hyphen?
我 运行 遇到了一个简单的问题,无法在 bash 变量中导出带连字符的字符串值。
这是正在发生的事情:
.env
NAME_0=`Bruno - Souto`
NAME_1="Bruno - Souto"
NAME_2='Bruno - Souto'
export.sh
#!/bin/bash
set -xv
export $(cat .env | egrep -v "(^#.*|^$)" | xargs)
echo ${NAME_0}
echo ${NAME_1}
echo ${NAME_2}
输出:
dev@dev:~/teste$ ./export.sh
export $(cat .env | egrep -v "(^#.*|^$)" | xargs)
++ cat .env
++ xargs
++ egrep -v '(^#.*|^$)'
+ export 'NAME_0=`Bruno' - 'Souto`' NAME_1=Bruno - Souto NAME_2=Bruno - Souto
+ NAME_0='`Bruno'
./export.sh: line 4: export: `-': not a valid identifier
./export.sh: line 4: export: `Souto`': not a valid identifier
+ NAME_1=Bruno
./export.sh: line 4: export: `-': not a valid identifier
+ NAME_2=Bruno
./export.sh: line 4: export: `-': not a valid identifier
echo ${NAME_0}
+ echo '`Bruno'
`Bruno
echo ${NAME_1}
+ echo Bruno
Bruno
echo ${NAME_2}
+ echo Bruno
Bruno
我确实需要用 'xxx - xxx' 导出,不管怎样。
有什么想法吗?
谢谢
第一个赋值 (NAME_0
) 无效,因为反引号暗示您想要 运行 带有参数 -
和 Souto
的命令 Bruno
。
不确定为什么你不只是 source
文件然后手动 export
变量(你已经知道名称 - 根据 echo
调用 - 所以继续export
,也是),例如:
$ source .env
-bash: Bruno: command not found # result of using backticks in the NAME_0 assigment
$ typeset -p NAME_0 NAME_1 NAME_2
declare -- NAME_0=""
declare -- NAME_1="Bruno - Souto"
declare -- NAME_2="Bruno - Souto"
$ export NAME_0 NAME_1 NAME_2
$ typeset -p NAME_0 NAME_1 NAME_2
declare -x NAME_0=""
declare -x NAME_1="Bruno - Souto"
declare -x NAME_2="Bruno - Souto"
注意: NAME_0
是空的,因为在 .env
中使用了反引号
使用单行.. 我会跳过你的 .env
文件中的引号并读入你的 bash 脚本 with export
..
.env
NAME_0=Bruno - Souto
NAME_1=Bruno - Foo
NAME_2=Bruno - Bar
test.sh
#!/bin/bash
while read -r line; do LANG=C export "$line"; done <".env"
echo $NAME_0
echo $NAME_1
echo $NAME_2
输出
$ bash test.sh
Bruno - Souto
Bruno - Foo
Bruno - Bar
CLI
~$ while read -r line; do LANG=C export "$line"; done <".env"
~$ echo $NAME_0
Bruno - Souto
~$ echo $NAME_1
Bruno - Foo
~$ echo $NAME_2
Bruno - Bar
我 运行 遇到了一个简单的问题,无法在 bash 变量中导出带连字符的字符串值。 这是正在发生的事情:
.env
NAME_0=`Bruno - Souto`
NAME_1="Bruno - Souto"
NAME_2='Bruno - Souto'
export.sh
#!/bin/bash
set -xv
export $(cat .env | egrep -v "(^#.*|^$)" | xargs)
echo ${NAME_0}
echo ${NAME_1}
echo ${NAME_2}
输出:
dev@dev:~/teste$ ./export.sh
export $(cat .env | egrep -v "(^#.*|^$)" | xargs)
++ cat .env
++ xargs
++ egrep -v '(^#.*|^$)'
+ export 'NAME_0=`Bruno' - 'Souto`' NAME_1=Bruno - Souto NAME_2=Bruno - Souto
+ NAME_0='`Bruno'
./export.sh: line 4: export: `-': not a valid identifier
./export.sh: line 4: export: `Souto`': not a valid identifier
+ NAME_1=Bruno
./export.sh: line 4: export: `-': not a valid identifier
+ NAME_2=Bruno
./export.sh: line 4: export: `-': not a valid identifier
echo ${NAME_0}
+ echo '`Bruno'
`Bruno
echo ${NAME_1}
+ echo Bruno
Bruno
echo ${NAME_2}
+ echo Bruno
Bruno
我确实需要用 'xxx - xxx' 导出,不管怎样。 有什么想法吗?
谢谢
第一个赋值 (NAME_0
) 无效,因为反引号暗示您想要 运行 带有参数 -
和 Souto
的命令 Bruno
。
不确定为什么你不只是 source
文件然后手动 export
变量(你已经知道名称 - 根据 echo
调用 - 所以继续export
,也是),例如:
$ source .env
-bash: Bruno: command not found # result of using backticks in the NAME_0 assigment
$ typeset -p NAME_0 NAME_1 NAME_2
declare -- NAME_0=""
declare -- NAME_1="Bruno - Souto"
declare -- NAME_2="Bruno - Souto"
$ export NAME_0 NAME_1 NAME_2
$ typeset -p NAME_0 NAME_1 NAME_2
declare -x NAME_0=""
declare -x NAME_1="Bruno - Souto"
declare -x NAME_2="Bruno - Souto"
注意: NAME_0
是空的,因为在 .env
使用单行.. 我会跳过你的 .env
文件中的引号并读入你的 bash 脚本 with export
..
.env
NAME_0=Bruno - Souto
NAME_1=Bruno - Foo
NAME_2=Bruno - Bar
test.sh
#!/bin/bash
while read -r line; do LANG=C export "$line"; done <".env"
echo $NAME_0
echo $NAME_1
echo $NAME_2
输出
$ bash test.sh
Bruno - Souto
Bruno - Foo
Bruno - Bar
CLI
~$ while read -r line; do LANG=C export "$line"; done <".env"
~$ echo $NAME_0
Bruno - Souto
~$ echo $NAME_1
Bruno - Foo
~$ echo $NAME_2
Bruno - Bar