루프 내의 변수 내의 변수

루프 내의 변수 내의 변수

루프 내에서 다른 변수 이름을 사용하여 변수를 호출하는 방법에 대한 질문이 있습니다.

다음 스크립트는 작동하지 않습니다.

#!/bin/bash
# Comparing test1.txt with test2.txt, test1.ini with test2.ini, test1.conf with test2.conf

FIRSTFILE1=test1.txt;
SECONDFILE1=test2.txt;
FIRSTFILE2=test1.ini;
SECONDFILE2=test2.ini;
FIRSTFILE3=test1.conf;
SECONDFILE3=test2.conf;

for NUM in {1..3};
do
  diff --brief <(sort $FIRSTFILE$NUM) <(sort $SECONDFILE$NUM) > /dev/null
  value=$?
  if [ $value -eq 1 ]
  then
    echo "different"
  else
    echo "identical"
  fi
done

답변1

간접적인 매개변수 확장을 찾고 있습니다. 이를 달성하려면 Bash에서 느낌표를 사용할 수 있습니다.

#!/bin/bash                                                                        
FIRSTFILE1=test1.txt;
SECONDFILE1=test2.txt;
FIRSTFILE2=test1.ini;
SECONDFILE2=test2.ini;
FIRSTFILE3=test1.conf;
SECONDFILE3=test2.conf;

for NUM in {1..3};
do
    a=FIRSTFILE$NUM
    b=SECONDFILE$NUM
    echo ${!a}
    echo ${!b}
done

oneliner를 찾으려면 더 많은 테스트가 필요합니다 :). 자세한 내용은 다음을 참조하세요.http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

답변2

변수를 하나로 엄격하게 결합하는 경우 이는 질문에 대한 설명이 아니지만 다음은 파일을 반복하는 작업 결과를 제공합니다.

for EXT in txt ini conf;
do
  diff --brief <(sort test1.${EXT}) <(sort test2.${EXT}) > /dev/null
  value=$?
  if [ $value -eq 1 ]
  then
    echo "different"
  else
    echo "identical"
  fi
done

답변3

배열의 목적은 다음과 같습니다.

#!/bin/bash

first=(  test1.txt test1.ini test1.conf )
second=( test2.txt test2.ini test2.conf )

for (( i = 0; i < ${#first[@]}; ++i )); do
    if cmp -s "${first[i]}" "${second[i]}"; then
        echo 'same'
    else
        echo 'different'
    fi
done

또는 파일 이름이 모두 예측 가능한 경우

#!/bin/bash

suffixes=( .txt .ini .conf )

for suffix in "${suffixes[@]}"; do
    if cmp -s "test1$suffix" "test2$suffix"; then
        echo 'same'
    else
        echo 'different'
    fi
done

관련 정보