bash配列の値をスクリプトで定義された文字列と比較しようとしたときに問題が発生しました。

bash配列の値をスクリプトで定義された文字列と比較しようとしたときに問題が発生しました。

私はスクリプトに精通していませんが、作業を続けており、他のスレッドで見つけたすべてのバリエーションを試してきました。
仮想ホストのバックアップ/復元用に作成された古いスクリプトのいくつかを再作成し、スクリプトに単一の構成ファイル(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

関連情報