Bash 스크립트로 할 수 있는 일이 많이 있습니다. 그러나 스크립트에 전달된 입력이 디렉터리 경로인 경우 처음부터 시작해야 합니다. 예를 들어, 디렉토리 경로를 알려주는 올바른 방법은 "/var/lib/test"이고 잘못된 방법은 "/var/%%^?/test"입니다.
여기서 test는 파일이 아닌 디렉터리입니다.
디렉터리 경로에는 문자가 포함될 수 있습니다. [A-Za-z0-9/_-]
내 스크립트는 다음과 같습니다 -
#!/bin/bash
dirPath="/var/lib/test"
if [[ ! ${dirPath} =~ "^/[A-Za-z0-9/_-]+$" ]]; then
echo "Success"
else
echo "Failure"
fi
여기서 dirPath에는 다른 스크립트에서 제공하는 모든 경로가 있을 수 있습니다.
여기서 무엇이 잘못되었는지 알려주세요.
답변1
if [[ ! ${dirPath} =~ "^/[A-Za-z0-9/_-]+$" ]]; then
echo "Success"
이는 $dirPath
리터럴 문자열을 테스트 ^/[A-Za-z0-9/_-]+$
하고 결과를 반전시킵니다. 즉, is가 리터럴 문자열이 아닌 Success
경우 $dirPath
인쇄됩니다. 이는 정규식의 따옴표 문자가 현재 버전의 Bash에서 특별한 의미를 잃었고 물론 !
역방향 테스트에서도 사용되지 않았기 때문입니다.
실제 정규식에 대해 변수를 테스트하려는 경우 가장 쉬운 방법은 정규식을 먼저 변수에 넣은 다음 따옴표를 해제하는 것입니다. 변수를 사용할 필요는 없지만 복잡한 정규식 구문 분석과 관련된 일부 문제를 피할 수 있습니다. 문제):
dirPath="/var/lib/test"
re='^/[A-Za-z0-9/_-]+$'
if [[ ${dirPath} =~ $re ]]; then
echo "'$dirPath' starts with a slash, and is composed of alphanumerics, hyphens, underscores and slashes only"
else
echo "'$dirPath' is of a forbidden format"
fi
물론 경로가 기존 디렉터리인지 테스트하려면 다음을 사용할 수 있습니다 -d
.
if [[ -d $dirPath ]]; then
echo "'$dirPath' exists and is a directory
fi
답변2
정규식에서 따옴표를 제거합니다.
[[ ! "${dirPath}" =~ ^/[A-Za-z0-9/_-]+$ ]]
정규식을 인용하면 문자열 일치가 강제됩니다.배쉬 3.2.
참고: 이렇게 하면 스크립트가 수정되지만 경로가 올바른 디렉터리 경로인지 제대로 확인하지는 않습니다. 올바른 확인 방법에 대한 @Kusalanandas 답변을 참조하세요.
답변3
이 답변은 (현재) 질문의 첫 번째 부분에 중점을 둡니다.
그러나 스크립트에 전달된 입력이 디렉터리 경로인 경우 처음부터 시작해야 합니다.
나머지 문제는 경로 이름에 대해 특정 정규식을 일치시켜 유효한 디렉터리 경로 이름인지 확인하는 것입니다.
일반적으로 스크립트는 뚜렷한 이유 없이 사용자의 디렉터리나 파일에 임의의 명명 체계를 적용해서는 안 됩니다. 이 경로 이름은 under 라는 디렉터리가 존재하고 해당 디렉터리에 라는 하위 디렉터리가 포함된 /var/%%^?/test
시스템에서 완벽하게 유효합니다 .%%^?
/var
test
당신의 스크립트는 무엇입니까진짜문제는 경로 이름을 제공하는지 여부입니다.기존 디렉토리. 디렉토리 경로가 무엇인지는 중요하지 않습니다.
이는 다음을 통해 수행할 수 있습니다.
#!/bin/bash
dirPath=$1
if [ ! -d "$dirPath" ]; then
printf '"%s" is not a valid directory path\n' "$dirPath" >&2
exit 1
fi
이 if
명령문 뒤에는 이것이 "$dirPath"
기존 디렉토리에 대한 경로라는 것을 알 수 있습니다. 위 코드에서 디렉터리의 경로 이름은 첫 번째 명령줄 인수에서 가져옵니다.
답변4
정규식 없이 파일이나 디렉터리인지 확인하려면 다음을 사용하세요.
if [ -d "${testpath}" ] ; then
echo "$testpath is a directory";