
파일 이름을 묻는 함수를 작성 중이고 입력이 알파 문자로 시작하는지 확인합니다. 그렇지 않으면 기준이 충족될 때까지 사용자에게 이름을 묻는 메시지가 다시 표시됩니다. 또한 사용자가 경로를 입력하는 경우 추가 메시지를 제공합니다(경로는 이 할당의 목적으로 '/'가 있는 모든 것임). 여기서 문제가 발생합니다.
여기 내 코드가 있습니다 ...
#1) make a getname function that will prompt for filename
function getname(){
trap control_c SIGINT
local fname=$1;
#if there is no input prompt user for file name
if [ ! $1 ]; then
read -p "Enter a file name: " fname;
fi;
#until grep is given a valid file name
until ( grep -E '^[a-zA-Z_]\w+$' <<< "$fname" > /dev/null 2>&1); do
#this is were the error is
if echo "$fname" | grep -E '/';
then #this tests if fname is a file directory
echo "Paths are not a legal file name.";
fi;
read -p "Enter a legal file name: " fname;
done
echo "$fname"
}
Until 루프 내의 if 문은 사용자에게 경로가 어떤 상황에서도 유효한 입력이 아니며 오류도 생성하지 않는다는 메시지를 표시하지 않습니다. if 문에서 grep을 어떻게 올바르게 구현합니까?
답변1
실제로 Fedora 26에서는 GNU bash, version 4.4.12(1)-release (x86_64-redhat-linux-gnu)
. 함수는 경로가 제공되는지 계속 묻습니다. 출력을 참조하세요.
[@host testing]$ getname
Enter a file name: ab/sav
ab/sav
Paths are not a legal file name.
Enter a legal file name: abc
abc
[@host testing]$
그러나 두 가지 작은 문제를 발견했습니다. 먼저 경로를 인쇄한 다음 다시 입력을 요청합니다. 이 문제는 grep -q
명령문에서 스위치(quiet을 뜻하는 q)를 사용하여 해결할 수 있습니다 if
( 에서도 작동하며 until
, 그러면 출력 리디렉션이 더 이상 필요하지 않습니다). 둘째, 루프에서 단일 문자는 항상 유효하지 않습니다 until
. 이 문제는 \w+
에 대한 정규식을 변경하여 해결할 수 있습니다 \w*
.
답변2
grep
Until 문은 매우 부피가 크므로 단순화할 수 있습니다.
나는 이 방법을 제안할 수 있다:
until [ ! -z "$fname" ]; do
read -p "Enter a legal file name: " fname
grep -E '^[a-zA-Z_]\w+$' <<< "$fname" > /dev/null 2>&1
#check exit code
if [ $? -ne 0 ]; then
echo "Paths are not a legal file name."
fname=""
fi
done
필요한 경우 루프까지 내부에 다른 조건을 추가하십시오.
사용자를 위한 메시지를 처리하려면 여러 read
명령을 표시하지 않고도 이 트릭을 사용할 수 있습니다.
fname=""
message_for_user="Enter a file name: "
until [ ! -z "$fname" ]; do
read -p "$message_for_user" fname
grep -E '^[a-zA-Z_]\w+$' <<< "$fname" > /dev/null 2>&1
#check exit code
if [ $? -ne 0 ]; then
echo "Paths are not a legal file name."
fname=""
message_for_user="Enter a legal file name: "
fi
done
출력은 다음과 같습니다:
Enter a file name: 1laha
Paths are not a legal file name.
Enter a legal file name:
첫 번째 줄과 세 번째 줄은 다릅니다.
답변3
명령문에서 정규식을 직접 사용할 수 있습니다 if
.
if [[ $name =~ ^[a-zA-Z] ]]
또는:
if [[ $name =~ ^[:alpha:] ]]