我有一个名为 txt 文件setup.txt
,其中包含以下数据:
DSN=ZXP.SOURCE
PATH=/z/zxp/20211015
SCHEMA=ZXP
URL=https://zxp-support.mybluemix.net/contest/4q21/contact-sheet
OUTPUT=OUTPUT(RESULT)
REPORT=q421report
我需要将此文件作为参数传递给我的脚本,但作为 shell 脚本编写的新手,我在使用它时遇到错误,source setup.txt
它似乎执行了文件中的任何内容。
input="$1"
source $1
if [ $# -ne 1 ]
then
printf "Usage Example: ./q421droop5.sh setup.txt \n\n"
exit 1
fi
if test -f "$input"; then
echo "$input exists."
content=$(cat $input
fi
echo $DSN
echo $SCHEMA #echoing the variables give me errors
我如何访问变量?
答案1
您可以使用mapfile
和declare
:
$ mapfile -t a < setup.txt
$ declare "${a[@]}"
$ echo "$DSN"
ZXP.SOURCE
$ echo "$SCHEMA"
ZXP
答案2
命令的好技巧declare
。但为什么不使用“命令替换”呢?
declare $(<setup.txt)
?
答案3
假设每行setup.txt
包含一个variable=value
,在这里,我将使用关联数组来完成:
typeset -A field=()
while IFS= read -r line; do
case $line in
([^=#]*=*) field[${line%%=*}]=${line#*=}
esac
done < setup.txt
并使用:
printf '%s\n' "${field[DSN]}" "${field[PATH]}"
这可以避免任意命令注入漏洞(就像a[$(would-rm -rf ~)]=gotcha
它也会影响declare
基于 - 的方法),并且在您的示例中可以避免破坏$PATH
对 shell 来说至关重要的变量。