쉘 스크립트 변수 구조

쉘 스크립트 변수 구조

다음 형식의 파일 이름으로 변수를 생성하는 방법:

파일 이름 패턴: SnapshotIR__somenumber.csv

나는 다음과 같은 것을 시도했습니다 :

TODAY=$(date +"%m%d%Y")    
SNAPSHOT = $(SnapshotIR$TODAY*.csv)

다음 오류가 발생합니다.

test.sh: line 2: SnapshotIR02122013_2239.csv: command not found
test.sh: line 2: SNAPSHOT: command not found

그래서 if와 함께 사용하고 싶을 때

if [ -f SnapshotIR$TODAY*.csv]  -> works 
if [ -f ${SNAPSHOT} ]           -> does not work (I get the above error)

답변1

SNAPSHOT = $(SnapshotIR$TODAY*.csv)

과제에는 공백이 있을 수 없습니다. $(…)게다가 ,명령 대체: 이 줄은 SnapshotIR02122013_2239.csv프로그램으로 실행을 시도합니다.

bash, ksh 또는 zsh에서는 SNAPSHOT일치하는 파일 이름 목록이 포함된 배열로 설정합니다.

SNAPSHOT=("SnapshotIR$TODAY"*.csv)

일치하는 파일이 없으면 패턴이 확장되지 않습니다. Bash 또는 zsh에서 nullglob빈 배열을 가져오는 옵션을 설정합니다. ksh에서는 ~(N)패턴의 시작 부분에 배치됩니다(예: SNAPSHOT=(~(N)"SnapshotIR$TODAY"*.csv)). 그런 다음 배열 길이를 테스트하여 일치하는 파일이 있는지 테스트할 수 있습니다.

shopt -s nullglob
SNAPSHOT=("SnapshotIR$TODAY"*.csv)
if [ ${#SNAPSHOT} -eq 0 ]; then
  echo 1>&2 "No snapshot file for $TODAY"
  exit 2
elif [ ${#SNAPSHOT} -gt 1 ]; then
  echo 1>&2 "Multiple snapshot files for $TODAY, I don't know which one to pick"
  exit 2
fi
echo "The snapshot file is ${SNAPSHOT[0]}"

배열이 없는 셸에서는 일치 항목 목록을 받아 개수를 계산하는 함수를 사용할 수 있습니다. 일치하는 항목이 없으면 함수는 확장되지 않은 패턴을 받습니다.

set_snapshot () {
  if [ $# -gt 1 ]; then
    echo 1>&2 "Multiple snapshot files for $TODAY, I don't know which one to pick"
    exit 2
  elif [ -e "$1" ]; then
     SNAPSHOT=$1
  else
    echo 1>&2 "No snapshot file for $TODAY"
    exit 2
  fi
}
set_snapshot "SnapshotIR$TODAY"*.csv
echo "The snapshot file is $SNAPSHOT"

(한 자리 이름의 파일은 없지만 5글자 이름의 파일이 있는 등 병리적인 경우에는 [ -e "$1" ]패턴이 확장되지 않았는지 테스트하는 데 을 사용하면 실패합니다. 또는 메타 문자가 일치하기 때문입니다.)[0-9][0-9]*?

다음 방법은 어느 정도 효과가 있습니다.

SNAPSHOT=SnapshotIR$TODAY"*.csv
if [ -e $SNAPSHOT ]; then …

확장은 $SNAPSHOT인용되지 않았기 때문에 공백으로 구분된 와일드카드 패턴 목록으로 처리됩니다. 여기서는 괜찮습니다. 그러나 일치하는 파일이 여러 개인 경우 명령은 일치 항목을 별도의 인수로 처리하므로 [구문 오류가 발생합니다. (특수하게 조작된 파일 이름을 사용하면 잘못된 결과가 발생할 수도 있습니다.) 따라서 이 방법은 너무 깨지기 쉬우므로 권장하지 않습니다.

답변2

셸을 사용하면 $()중괄호 안의 내용이 명령으로 실행됩니다. 기호 앞/뒤에 공백은
허용되지 않습니다 .=

그래서 당신의 명령은 다음과 같습니다

SNAPSHOT=SnapshotIR$TODAY*.csv

또는

SNAPSHOT=SnapshotIR${TODAY}*.csv

for추신: 다음 단계에서 파일에 대해 일부 작업을 수행해야 하는 경우 다음과 같은 루프를 사용하는 것이 좋습니다.

for file in SnapshotIR${TODAY}*.csv ; do smth ; done

패턴과 일치하는 파일이 여러 개 있는 경우 [ -f ${SNAPSHOT} ]구문은 다음과 같은 오류를 반환합니다.

[ -f f* ] && echo ok
-bash: [: filename: binary operator expected

답변3

하다아니요=다음과 같은 경우에는 공백을 사용하세요.변수 할당.

SNAPSHOT또한 할당한 내용 $( )을 명령으로 실행하려고 하기 때문에 둘러싸 기를 원하지 않는다고 생각합니다 .

참고로 다음을 고려해보세요.변수를 소문자로 바꾸세요.

그래서 당신이 원하는 것은 아마도

today=$(date +"%m%d%Y")    
snapshot=SnapshotIR$today

if [ -f ${snapshot}*.csv ]

관련 정보