쉘 스크립트에서 변수 이름을 동적으로 설정하는 방법은 무엇입니까?

쉘 스크립트에서 변수 이름을 동적으로 설정하는 방법은 무엇입니까?

나는 다음과 동등한 것을 찾고 있습니다 sh(예, 그렇습니다.)

#!/bin/bash

exe1='filepath'
n=1
var=exe${n}
echo ${!var}

echo 가 출력되어야 하는 곳 filepath. 일반 sh를 사용하고 싶습니다.

나는 코드로 많은 것을 시도했지만 지금까지 올바른 출력을 얻지 못했습니다.

루프를 사용하여 알려진 수의 변수의 변수 이름을 반복하려는 배열과 같은 구조를 구현하고 싶습니다.

내가 찾은 배열의 경우POSIX 호환 셸의 배열하지만 호기심 때문에 나는 여전히 내 질문에 대한 답을 찾고 있습니다. ;)

답변1

sh질문에 제시된 내용과 동일한 스크립트:

#!/bin/sh

exe1='filepath'
n=1
var=exe$n
eval "echo \"\$$var\""   # or: eval 'echo "$'"$var"'"'

eval줄은 현재 환경에서 주어진 문자열을 명령으로 평가합니다. 주어진 문자열은 echo \"\$$var\"변수 확장 등을 거친 후 가 됩니다 echo "$exe1". 이는 eval재평가를 위해 전달되고 명령은 문자열을 인쇄합니다 filepath.


배열에 대해서도 언급하셨습니다. POSIX sh셸에는 eg 와 같은 의미에서 명명된 배열이 없지만 bash여전히 위치 인수 목록이 있다는 것은 사실입니다 .

이를 사용하면 셸의 목록을 사용하여 수행해야 하는 대부분의 작업을 수행할 수 있습니다.

예를 들어,

set -- 'filepath1' 'filepath2' 'filepath3'

for name in "$@"; do    # or: for name do
    echo "$name"
done

이는 이전과 동일합니다.

for name in 'filepath1' 'filepath2' 'filepath3'
do
    echo "$name"
done

나는 당신이 달성하고자 하는 것이 무엇인지 정확히 알고 있기 때문에 더 흥미로운 예를 생각할 수 없습니다. 하지만 여기에 반복할 수 있는 배열과 유사한 구조가 있습니다. 반복 가능한 변수의 이름을 원하는 이유는 아직 명확하지 않습니다.

답변2

여러 파일을 반복하려는 경우( exe1=filepath예제에서 암시됨) 간단한 for 루프가 작동합니까?

final_filefile_pattern과 일치하는 마지막 파일을 보유하는 변수입니다 - bash 복사 ${!var}(마지막 인수 참조).

  #/bin/sh
  final_file=''
  file_pattern='*.txt'
  for f in $file_pattern
  do
      echo $f
      final_file=$f
  done
  echo $final_file

관련 정보