다음 형식의 파일 이름으로 변수를 생성하는 방법:
파일 이름 패턴: 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 ]