私はスクリプトに精通していませんが、作業を続けており、他のスレッドで見つけたすべてのバリエーションを試してきました。
仮想ホストのバックアップ/復元用に作成された古いスクリプトのいくつかを再作成し、スクリプトに単一の構成ファイル(blah.cfg)を使用しようとしていますが、ほとんど同じ変数を使用します。
設定.cfg
enabled=yes
password=thisisastring
script1.sh
comparepass=thisisastring
##############################################################
typeset -A config # init array
config=()
while read line
do
if echo $line | grep -F = &>/dev/null
then
varname=$(echo "$line" | cut -d '=' -f 1)
config[$varname]=$(echo "$line" | cut -d '=' -f 2-)
fi
done < settings.cfg
clear
echo 1: $comparepass
echo 2: ${config[password]}
echo -----------------------------------------------------------------------
if [ $comparepass == "${config[password]}" ]; then
echo matches: $comparepass vs ${config[password]}
else
echo does not match: $comparepass vs ${config[password]}
fi
echo -----------------------------------------------------------------------
exit
#############################################################################
私が試したことはすべてComparepass(スクリプトに設定されている)とパスワード(cfgファイルに設定されています)と一致しますが、出力に表示すると同じです。
1: thisisastring
2: thisisastring
-----------------------------------------------------------------------
does not match: thisisastring vs thisisastring
-----------------------------------------------------------------------
私が読んだスレッドに基づいてさまざまなバリエーションを試しました。
if [ "$comparepass" == ${config[password]} ];
if [ $comparepass == "${config[password]}" ];
if [ "$comparepass" == "${config[password]}" ];
if [[ $comparepass == ${config[password]} ]]; #this is a binary check?
また、配列を一般変数に割り当ててみました。
compareagainst=${config[password]}
if [ $comparepass == $compareagainst ]; then
echo matches: $comparepass vs $compareagainst
else
echo does not match: $comparepass vs $compareagainst
fi
同じ結果が得られた。
-----------------------------------------------------------------------
does not match: thisisastring vs thisisastring
-----------------------------------------------------------------------
とても混乱しています。
dev@sandbox:~/backup-tools$ bash --version GNU bash, バージョン 5.1.16(1)-release (x86_64-pc-linux-gnu)
答え1
settings.cfg
ファイルの末尾にキャリッジリターンが含まれていないことを確認してください(通常はそうです)。
回復settings.cfg
ファイルの実行
dos2unix settings.cfg
スクリプトリファクタリング:
#!/usr/bin/env bash
comparepass=thisisastring
##############################################################
while IFS== read -r _ value || [[ -n $line ]]
do
val="$value"
done < settings.cfg
printf 'pass from config:\t%s\n' "$val"
printf 'pass from script:\t%s\n' "$comparepass"
echo -----------------------------------------------------------------------
if [[ $val == $comparepass ]]; then
printf '%s and %s match\n' "$val" "$comparepass"
else
printf '%s and %s do not match\n' "$val" "$comparepass"
fi
echo -----------------------------------------------------------------------
exit
また、スクリプトに拡張を追加しないことをお勧めします。名前だけを付けてくださいscript
settings.cfg
これはbashの「関連付け」配列にinit形式のファイルを格納する部分です。
# Declare the associative array
declare -A settings
while IFS='=' read -r key value; do
# Strip leading/trailing whitespace from the key and value in case there are any
key="${key// /}"
value="${value// /}"
settings[$key]="$value"
done < settings.cfg
# Loop through the keys and print the values of the array
for key in "${!settings[@]}"; do
echo "$key = ${settings[$key]}"
done