쉘 프로그램 관련 조언을 구하고자 합니다.

khalisto의 이미지

안녕하세요.

쉘프로그램을 통해 구현하고자 하는 프로그램이 있는데 구글링을 통해 확인해 보았으나 유사사례도 발견되지 않아 조언을 듣고자

글 남깁니다.

echo -n "Input new account name:"
read aa

키보드로부터 입력받은 값을 $aa 변수에 저장하는 과정에서 입력받은 값내부에(위치 상관없음) 특수문자가 포함되어 있거나

값의 처음부분이 숫자이면 오류가 발생하게 하는 그런 일련의 스크립트입니다.

예를 들자면 @few 또는 g%e2 등과 같은 특수문자가 입력 받은 값 중 어디에나 최소 1개 이상이 존재할 때 이를 판별하는

부분인 것입니다. 첫부분 숫자의 경우 1ewk 는 걸러지고 e1k 또는 elk3 은 처리가 될수 있는 어떠한 방법이

없을까요?

프로그램은 제어문이나 조건문 정도만 아는 얕은 지식이라 막히는 부분이 많네요 ㅎㅎ

전문가 여러분들의 고견을 기다립니다.

감사합니다.

ymir의 이미지

echo $aa | grep -Pq "^[[:alpha:]][[:alnum:]]*$" && echo valid || echo invalid

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

khalisto의 이미지

안녕하세요.

남겨주신 소스를 가지고 테스트를 해보았는데 정상적으로 적용되는 것을 확인하였습니다.

grep -Pq "^[[:alpha:]][[:alnum:]]*$"

위 구문이 혹시 부분이 어떤 처리를 하는지 알수 있을까요???

익명 사용자의 이미지

알파뱃 또는 숫자로 끝나는 문자열을 찾는 명령어 부분입니다.

-P 옵션은 perl 확장 정규 표현식을 사용하겠다는 옵션이고 -q는 quiet, 즉 표준 출력으로 아무것도
출력하지 말라는 옵션입니다.

익명 사용자의 이미지

뒤에 "*" 문자를 못봤군요;;

알파뱃으로 시작하고 2번째 문자부터는 알파뱃 & 숫자로만 되어있는 문자열을 검색하는
명령입니다.

khalisto의 이미지

친절한 설명 감사합니다. 그런데 위 코드에서 다른 특수문자는 문제가 없는데 백슬래쉬 \ 가 입력될 경우

즉시 처리가 아닌 다음 명령을 대기 받게 되는데 이는 어떻게 처리 해야하는지 궁금합니다.

물론 짝수개로 백슬래쉬를 입력하게 되면 (예 : \\ 입력시 출력은 \ 만나옴) 되기는 하는데 1개의 \ 가 입력되어도

그대로 출력되게 하려면 어떠한 방법이 있을까요??

ymir의 이미지

쉘에서 \ 를 입력하고 엔터를 치면.. 키 입력이 끝난게 아니라 다음 줄에서도 계속 이어진다는 의미입니다.
만약 문자 자체인 \ 를 변수에 입력하려면 \ 를 이스케이핑해서 \\ 와 같이 두 번 입력해야지 맞는겁니다.

$ read A
aa\
> b\
> c
$ echo $A
aabc
$ read A
aa\\b\\c
$ echo $A
aa\b\c

변수를 할당 때 문자열이 길거나 해서 이쁘게 다듬고 싶다면, \ 를 써서 여러 줄로 나눌 수 있습니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

khalisto의 이미지

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년 새해 복 많이 받으세요~~ ^^

감사합니다.

ymir의 이미지

[ 앞에 \ 를 추가하는 것은 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 』

khalisto의 이미지

좋은 말씀 감사합니다. 시간을 더 두고 차근차근 빠졌던 부분이 있는지 전체적인 로직을 확인해보고

연구해 보도록 하겠습니다. 좋은하루 되세요~

raymundo의 이미지

-P 옵션을 지원하는 gnugrep 이라면 정규식 앞뒤에 \Q 와 \E 를 넣으면 그 사이에 있는 모든 특수문자를 그냥 문자 리터럴로 간주하게 할 수 있습니다.

[gypark@raymundo temp]$ read INPUT
[4
[gypark@raymundo temp]$ echo $INPUT
[4
[gypark@raymundo temp]$ grep -P "\Q$INPUT\E" a*
a1:123[456

좋은 하루 되세요!

nomail의 이미지

read -r로 읽으면 백슬러시도 그대로 인식합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.