setup.txt
次のデータを含む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
このファイルをスクリプトにパラメータとして渡す必要がありますが、シェルスクリプトの初心者としてこのファイルを使用するとエラーが発生し、ファイル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
に 1 つが含まれていると仮定し、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
シェルに重要な変数が破損するのを防ぎます。