쉘 프로그램 관련 조언을 구하고자 합니다.
글쓴이: khalisto / 작성시간: 목, 2015/02/12 - 1:12오후
안녕하세요.
쉘프로그램을 통해 구현하고자 하는 프로그램이 있는데 구글링을 통해 확인해 보았으나 유사사례도 발견되지 않아 조언을 듣고자
글 남깁니다.
echo -n "Input new account name:"
read aa
키보드로부터 입력받은 값을 $aa 변수에 저장하는 과정에서 입력받은 값내부에(위치 상관없음) 특수문자가 포함되어 있거나
값의 처음부분이 숫자이면 오류가 발생하게 하는 그런 일련의 스크립트입니다.
예를 들자면 @few 또는 g%e2 등과 같은 특수문자가 입력 받은 값 중 어디에나 최소 1개 이상이 존재할 때 이를 판별하는
부분인 것입니다. 첫부분 숫자의 경우 1ewk 는 걸러지고 e1k 또는 elk3 은 처리가 될수 있는 어떠한 방법이
없을까요?
프로그램은 제어문이나 조건문 정도만 아는 얕은 지식이라 막히는 부분이 많네요 ㅎㅎ
전문가 여러분들의 고견을 기다립니다.
감사합니다.
Forums:
음 ..
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
답변 감사합니다. ^^
안녕하세요.
남겨주신 소스를 가지고 테스트를 해보았는데 정상적으로 적용되는 것을 확인하였습니다.
grep -Pq "^[[:alpha:]][[:alnum:]]*$"
위 구문이 혹시 부분이 어떤 처리를 하는지 알수 있을까요???
알파뱃으로 시작하고
알파뱃 또는 숫자로 끝나는 문자열을 찾는 명령어 부분입니다.
-P 옵션은 perl 확장 정규 표현식을 사용하겠다는 옵션이고 -q는 quiet, 즉 표준 출력으로 아무것도
출력하지 말라는 옵션입니다.
답글 부분에 잘못된 부분이 있어서 정정합니다.
뒤에 "*" 문자를 못봤군요;;
알파뱃으로 시작하고 2번째 문자부터는 알파뱃 & 숫자로만 되어있는 문자열을 검색하는
명령입니다.
답변 감사합니다.
친절한 설명 감사합니다. 그런데 위 코드에서 다른 특수문자는 문제가 없는데 백슬래쉬 \ 가 입력될 경우
즉시 처리가 아닌 다음 명령을 대기 받게 되는데 이는 어떻게 처리 해야하는지 궁금합니다.
물론 짝수개로 백슬래쉬를 입력하게 되면 (예 : \\ 입력시 출력은 \ 만나옴) 되기는 하는데 1개의 \ 가 입력되어도
그대로 출력되게 하려면 어떠한 방법이 있을까요??
음 ..
쉘에서 \ 를 입력하고 엔터를 치면.. 키 입력이 끝난게 아니라 다음 줄에서도 계속 이어진다는 의미입니다.
만약 문자 자체인 \ 를 변수에 입력하려면 \ 를 이스케이핑해서 \\ 와 같이 두 번 입력해야지 맞는겁니다.
변수를 할당 때 문자열이 길거나 해서 이쁘게 다듬고 싶다면, \ 를 써서 여러 줄로 나눌 수 있습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
ymir 님의 친절한 답변 잘보았습니다.
ymir 님의 친절한 답변 잘보았습니다. 항상 도움주셔서 감사히 생각하고 있습니다.
read 를 통해서는 결국 입력값에 escape 방식으로만 (input values = \\)이 \ 문자가 입력될수 밖에 없는 구조네요.
잘 알겠습니다.
사실 지금까지의 질문은 리눅스를 오랜기간 공부하고 실무에도 사용하고 있지만 자동화에 대한 갈증으로 인해
쉘스크립트를 학습해오는 과정에서 기본적인 프로그래밍이라도 해보자는 마음가짐에서 useradd 프로그램을 개발하는
과정이었습니다.
아래는 그 소스 일분입니다. ymir 님께서 성심껏 알려주신 팁은 check 변수에 저장하도록 되었습니다.
####################################################################
echo -n "Input new account name:"
read nac
nac2=$(echo -n "${nac//[[:space:]]/}") ## 입력값에 공백이 있으면 이를 제거하여 $nac2 에 입력하라.
check=$(echo $nac2 | grep -Pq "^[[:alpha:]][[:alnum:]]*$" && echo [valid] || echo [invalid])
######## passwd 파일에서 $nac2 와 매칭되는 계정을 찾는 과정 ########
nac3=$(echo "'^"$nac2"$'") #grep 검색을 위해 입력된 값 앞뒤에 정규표현식 기호 ^ 와 $ 을 추가해 $nac3에 저장
nac4=$(awk -F: '{print $1}' /etc/passwd | eval grep $nac3)
####################################################################
결국 \ 문자 입력 시 처리는 추후에 다른 방법이 확인되면 세부적으로 학습해볼 예정이며
문제는 처음에 알려주신 소스
echo $nac2 | grep -Pq "^[[:alpha:]][[:alnum:]]*$" && echo [valid] || echo [invalid]
로도 [ 문자 입력시 invalid 가 정상적으로 출력되나 이를 전체소스에 적용시
nac4 변수의 passwd 파일 내에서 grep위한 검색값 변수 정규표현식을 $nac3 를 grep 검색하는 과정에서
다른 특수문자는 전혀 문제가 없으나 입력값에 [ 가 포함된 경우에는 grep: 짝이 맞지 않는 [ 또는 [^
라고 에러 구문이 표시되는 부분이 발생하는데 나름 조사한 결과 입력된 값 중 [ 문자 앞에 escape 문자 \ 가 들어가 있으면
에러가 발생하지 않더라구요..
따라서 질문드리고 싶은 부분은 키보드 입력값 중에 [ 가 포함되어 있으면 이를 판별하여 입력된 값의 [ 를 \[ 로 바꿀 수
있는지 입니다. 예) 입력값이 fwek[d53[ 이면 fwek\[d53\[ 로 replace
sed 의 경우 입력파일이 있어야만 가능하나 sed 의 입력파일 부분에 변수를 넣으면 에러가
발생해서요..
부족한 초보 프로그래머를 위해 귀한 도움 주셔서 감사드리오며 2015년 새해 복 많이 받으세요~~ ^^
감사합니다.
음 ..
[ 앞에 \ 를 추가하는 것은 sed 's/\[/\\\[/g' 나 ${nac3/\[/\\\[} 로 하면 될겁니다만..
로직을 다시 점검해 보면 좋을 것 같네요.
애초에 check 에서 유효하지 않은 계정 이름이라고 판단했다면..
굳이 passwd 파일에 그 단어가 있는지 확인해 볼 필요도 이유도 없겠죠.
유효한 계정이라면 굳이 예외 처리 과정이 필요가 없을테구요.
문법이나 기능은 매뉴얼 보거나 샘플 참고해서 바로 쓸 수 있다지만..
하고 싶은 것을 논리적으로 전개하는 데에는 많은 연습이 필요합니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
네 답변 감사합니다. ^^
좋은 말씀 감사합니다. 시간을 더 두고 차근차근 빠졌던 부분이 있는지 전체적인 로직을 확인해보고
연구해 보도록 하겠습니다. 좋은하루 되세요~
-P 옵션을 지원하는 gnugrep 이라면 정규식
-P 옵션을 지원하는 gnugrep 이라면 정규식 앞뒤에 \Q 와 \E 를 넣으면 그 사이에 있는 모든 특수문자를 그냥 문자 리터럴로 간주하게 할 수 있습니다.
좋은 하루 되세요!
read -r로 읽으면 백슬러시도 그대로 인식합니다.
read -r로 읽으면 백슬러시도 그대로 인식합니다.
댓글 달기