저는 스크립팅에 능숙하지 않지만 계속해서 작업하고 있으며 다른 스레드에서 찾은 모든 변형을 시도해 왔습니다.
가상 호스트 백업/복원을 위해 만든 일부 이전 스크립트를 다시 작성하고 스크립트에 단일 구성 파일(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