이름에 느낌표가 있는 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: 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"