변수 이름을 grep하는 방법

변수 이름을 grep하는 방법

입력을 파일 이름으로 받아들이고 알파벳 문자로 시작하는지 확인하는 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>&1stderr과 stdout을 결합 하지 않은 것입니다 2>1&(stderr를 이름이 지정된 파일로 보내고 1명령을 셸 배경에 넣음). 이렇게 하면 grep종료 상태가 조건에 전달되는 것을 방지할 수 있습니다.

FWIW, 자동으로 종료하는 데 사용할 수 -q있으며 하위 쉘이 전혀 필요하지 않다고 생각합니다. 그냥 쓰면 됩니다.

until grep -qE '^[a-zA-Z_]\w+' <<< "$fname"; do

관련 정보