如何从 bash 脚本中处理所需的 txt 文件中获取变量?

如何从 bash 脚本中处理所需的 txt 文件中获取变量?

我有一个名为 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

您可以使用mapfiledeclare

$ 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 来说至关重要的变量。

相关内容