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

관련 정보