최근에 쉘 스크립트를 사용하기 시작했습니다. 그래서 사용자로부터 파일 이름을 입력할 때 공백을 주면 내 코드가 이를 처리하지 못하는 문제에 직면했습니다. 같은 대답이라도
내 코드는 다음과 같습니다
echo "---------------- Please provide the filename -------------------------"
read filename
if [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
printf "some code "
else
printf "some code"
fi
누구든지 나를 도울 수 있습니까? 입력 매개 변수에 공백이 제공되면 오류가 발생하도록 공백 문자를 처리하는 방법이 있습니다.
감사해요
답변1
정규식을 사용하여 확인할 수 있습니다.
전체 코드는 다음과 같습니다.
if [[ $filename =~ \ ]]; then
printf "error"
exit(1)
elif [[ $filename =~ [A-Za-z0-9]+[a-zA-Z0-9_.]*+$ ]]; then
printf "some code "
else
printf "some code"
fi
답변2
파일 이름을 제한하는 이유는 무엇입니까? 대부분의 파일 시스템에서 Unix 파일 이름에는 NUL(\0) 및 슬래시(/)를 제외한 모든 문자가 포함될 수 있습니다. 예전처럼 문자와 숫자만 기대하는 습관에 빠지다가 예상치 못한 일이 발생했을 때 당황하는 것보다 지금 특이한 파일 이름을 처리하는 방법을 배우는 것이 더 나을 것입니다.
공백 및 기타 이상한 문자가 포함된 파일 이름을 처리하는 방법에 대한 기사를 읽어 보는 것이 좋습니다.
첫 번째 팁은 변수 주위에 항상 큰따옴표를 사용하는 것입니다. 어떤 경우에는 이 작업을 수행할 필요가 없지만 초보자의 경우 항상 수행하는 것이 더 쉽습니다. 이것만으로도 지금 해결하려는 특정 문제를 해결할 수 있습니다.
find
다음으로 제가 추천하는 것은 이 명령, 특히 해당 연산자를 좋아하는 방법을 읽고 배우는 것입니다 -exec
. 이를 통해 전체 파일 디렉터리 트리를 조작할 때 올바른 작업을 쉽게 수행할 수 있습니다. 예를 들어 다음과 같은 작업은 절대 하지 마세요.
for f in *; do
do-something-with-a-file "$f"
done
파일 이름에 공백, 탭 또는 개행 문자가 포함되어 있으면 제대로 작동하지 않습니다(예, 파일 이름에 개행 문자가 포함될 수 있습니다!). 뿐만 아니라 파일과 디렉터리를 구별하는 것도 허용하지 않습니다.
대신 다음을 수행하세요.
find -maxdepth 1 -type f -exec do-something-with-a-file {} \;
이 -maxdepth
연산자는 결과를 현재 디렉토리에 있는 결과로 제한하여 디렉토리가 아닌 파일만 원한다고 -type f
알려주고 각 파일에 대해 한 번 수행하여 대신 파일 이름(올바르게 인용됨)을 전달합니다 . 따라서 세미콜론 앞의 백슬래시는 쉘용입니다. 쉘은 세미콜론을 처리하지 않고 이를 명령에 전달합니다 .find
-exec somecommand {} \;
somecommand
{}
find
이것은 파일 이름을 올바르게 처리하는 방법에 대한 빠른 입문서일 뿐입니다. 제발주제에 대한 내용을 읽어보세요, 문제가 있으면 여기에 더 많은 질문을 게시할 수 있습니다.