Bash 스크립트의 명령줄에서 느낌표가 있는 파일 압축 풀기

Bash 스크립트의 명령줄에서 느낌표가 있는 파일 압축 풀기

이름에 느낌표가 있는 zip 파일의 압축을 푸는 간단한 스크립트를 작성하려고 합니다.

#!/bin/bash
UNZIP='/usr/bin/unzip'
CUT="/usr/bin/cut"
GREP="/usr/bin/grep"
FILENAME="test"

FILE="/usr/local/var/www/htdocs/"$FILENAME"\!3.zip"
UNZIPPEDFOLDER=$($UNZIP ${FILE} | $GREP -m1 'creating:' | $CUT -d' ' -f5-)
echo $UNZIPPEDFOLDER

그러나 스크립트가 실행될 때 unzip은 다음을 반환합니다.

unzip:  cannot find or open /usr/local/var/www/htdocs/test\!3.zip, /usr/local/var/www/htdocs/test\!3.zip.zip or /usr/local/var/www/htdocs/test\!3.zip.ZIP.

"!"가 없으면 잘 작동합니다. 파일 이름으로 로그인하지만 일부 작업을 자동화하려면 원래 파일 이름을 유지해야 합니다.

답변1

!은 명령 기록 확장 문자이므로 기록 확장이 활성화된 경우 명령줄에서 인용되어야 합니다. 스크립트 내에서 인용할 필요는 없습니다.

매뉴얼 페이지에서:

명령 내역 확장 기능을 사용하는 경우(아래 HISTORY EXPANSION 참조) 내역 확장을 방지하기 위해 내역 확장 문자(보통 !)를 인용해야 합니다.

그리고

비대화형 쉘은 기본적으로 기록 확장을 수행하지 않습니다.

자세한 내용은 을 참조하고 man bash, 검색하고 QUOTING, 검색하세요.HISTORY EXPANSION

답변2

일반적으로 탈출할 필요는 없습니다.그리고 인용하다아무것. 이것을 작성하는 안전한 방법은 다음과 같습니다.

FILE="/usr/local/var/www/htdocs/${FILENAME}!3.zip"
UNZIPPEDFOLDER="$("$UNZIP" "$FILE" | "$GREP" -m1 'creating:' | "$CUT" -d' ' -f5-)"
echo "$UNZIPPEDFOLDER"

관련 정보