Unix 쉘 스크립트의 변수 안에 숨겨진 특수 문자를 이스케이프하는 방법

Unix 쉘 스크립트의 변수 안에 숨겨진 특수 문자를 이스케이프하는 방법

다음 스크립트를 사용하여 디렉토리의 특정 파일을 삭제하기 위해 bash 쉘 스크립트를 사용하고 있습니다.

#!/bin/bash
path=$1
for filename in $path/*; do
    if [ -d "$filename" ]; then
        echo $filename
        rm $filename/*statssys*
    fi
done

즉, 지정된 경로 내의 한 수준 깊은 모든 디렉터리를 반복하고 statssys해당 이름에 포함된 모든 파일을 삭제합니다. 문제는 검색된 파일 경로에 또는 와 $filename같은 숫자 끝부분이 포함되어 있다는 것입니다 . 대괄호는 명령이 실행되기 전에 이스케이프되어야 하는데 , $filename 변수에 숨겨져 있기 때문에 어떻게 해야 할지 모르겠습니다.file_path[8]file_path[9]rm

도움을 주시면 감사하겠습니다.

답변1

Bash 스크립팅에는 일반 프로그래머가 빠질 수 있는 함정이 많이 있습니다.

한 가지 규칙은 각 인수를 큰따옴표로 확장하는 것인데, 이것이 주요 문제입니다. 다른 규칙에는 다음이 포함됩니다.echo임의의 데이터 출력 방지그리고--옵션을 다른 매개변수와 구분하는 데 사용됩니다 .시작되지만 -옵션으로 간주되어서는 안 되는 인수를 방지합니다.

귀하의 예에서는 스크립트를 다음과 같이 변경할 수 있습니다.

#!/bin/bash --
path="$1"
for filename in "$path"/*; do
    if [ -d "$filename" ]; then
        printf '%s\n' "$filename"
        rm -- "$filename"/*statssys*
    fi
done

더 자세한 설명을 보려면 읽어 보시기 바랍니다.헤비히트 트랩.

관련 정보