입력을 파일 이름으로 받아들이고 알파벳 문자로 시작하는지 확인하는 bash 함수를 작성하고 있지만 파일 이름을 테스트하는 데 사용하는 grep은 주어진 모든 입력을 허용합니다.
이건 내 코드야...
function getname(){
fname=$1;
if [ ! $1 ]; then
read -p "Enter a file name: " fname;
fi;
until ( grep -E '^[a-zA-Z_]\w+' <<< "$fname" > /dev/null 2>1&); do
if [ -d $fname ]; then
echo "Paths are not a legal file name.";
fi;
read -p "Enter a legal file name: " fname;
done
}
인수 1개 또는 인수 없음을 올바르게 받아들이고 인수가 없으면 파일 이름을 묻는 메시지를 표시하지만 전달된 문자열은 모두 허용합니다. 그렇다면 fname으로 저장된 문자열을 어떻게 적절하게 파악합니까?
답변1
나는 그것을 사용하는 방법을 모르겠어요 grep
. 대신 내장 test
연산자( .. )를 사용하여 정규식을 직접 처리할 수 있는 [[
파일 이름을 비교합니다 .]]
function getname(){
local fname="$1"
[[ -z "$fname" ]] && read -p "Enter a file name: " fname
until [[ "$fname" =~ ^[[:alpha:]] ]] && [[ -f "$fname" ]]
do
[[ -d $fname ]] && echo "Paths are not a legal file name."
read -p "Enter a legal file name: " fname
done
}
답변2
만약 너라면~ 해야 하다을 사용 grep
하면 구현 문제는 작성한 내용이 2>&1
stderr과 stdout을 결합 하지 않은 것입니다 2>1&
(stderr를 이름이 지정된 파일로 보내고 1
명령을 셸 배경에 넣음). 이렇게 하면 grep
종료 상태가 조건에 전달되는 것을 방지할 수 있습니다.
FWIW, 자동으로 종료하는 데 사용할 수 -q
있으며 하위 쉘이 전혀 필요하지 않다고 생각합니다. 그냥 쓰면 됩니다.
until grep -qE '^[a-zA-Z_]\w+' <<< "$fname"; do