[완료] bash스크립트에서 빈문자열 체크 방법

nomail의 이미지

다른 사람 소스 보는데 궁금한게 있어서요.
bash스크립트에서 빈 문자열을 체크할 때 test를 사용하잖아요.

test -z "$1"
test -n "$1"

저는 보통 위와 같은 방법으로 사용하는데 어떤 분은

if [[ x$1 == x ]]; then

위와 같이 쓰기도 하던데 처음에는 헷갈려서 무슨 말인가 했거든요.
보기 쉽게 test 코드를 쓰던가 아니면 $1 == "" 처럼 직관적인게 좋을 것 같은데..
굳이 2번째 방법처럼 쓰는 이유는 뭔가요?

ymir의 이미지

옛날 어딘가 별도로 null check 를 지원하지 않던 shell 에서 파생되어 나온 유산이 아닐까 합니다.
습관적으로 손가락이 기억하는 대로 그렇게 쓰시는 분들도 있을거고..
그거 말고도 다른 방법도 많으니.. 큰 의미를 두실 필요는 없을 것 같네요.
그렇다고 굳이 일부러 그렇게 쓰실 필요도 없구요.. 편하신대로..

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

nomail의 이미지

답글 감사드립니다.
그렇다면 현재는 test코드만으로 문제가 없겠네요. 오래된 sh도 test는 지원할테니..
github의 유명한 소스를 보면 가끔 그런 코드들이 보여서 뭔가 중요한 의미가 있는 줄 알았습니다.

unipro의 이미지

제가 쉘스크립트를 배울 때는 아래와 같이 사용하지 않으면

if [ $1 == "" ]; then

$1이 빈문자열이거나 정의되지 않으면 다음과 같은 오류가 나옵니다.
bash: [: =: unary operator expected

따라서 항상 밑의 형식을 사용했습니다.
if [ x$1 == x ]; then

현대적인 쉘의 이중 대괄호를 사용하면 그럴 필요가 없는데,
아마도 습관(또는 무지) 때문이 아닐런지요.

내 블로그: http://unipro.tistory.com

nomail의 이미지

답글 감사드립니다.
첫번째 코드는 저도 모를 때 많이 겪었던 문제였습니다. c언어 하신 분들은 대부분 해당되실 듯.. ^^

test -z "$1"

오래된 sh도 test는 동작할테니 이렇게만 한다면 문제가 없을 것 같네요.

cinsk의 이미지

$1이 -n -p 등처럼 option 문자열처럼 들어올 경우, 혼동을 피하기 위함입니다.

nomail의 이미지

답글 감사드리구요.
죄송하지만 제가 잘 이해가 안돼서 그러는데 부연설명 조금만 부탁드려도 될까요? ㅜㅜ

cinsk의 이미지

test $foo = ... 의 의도는, 변수 foo의 값과 ...가 같은지 검사하는게 목적입니다. 그런데 만약 변수 foo에 "-z"등처럼 command option처럼 보이는 값이 들어 있을 경우,

test $foo = ...

=>

test -z = "..."

가 되고, test가 -z를 operand가 아닌, option으로 보게 될 경우, 문제가 발생할 수 있습니다. (주로 오래된 test(1)의 경우)

x를 붙이면,

test x$foo = x...

=>

test x-z = x...

가 되어, option처럼 보이는 문자열도 정상적으로 처리됩니다.

nomail의 이미지

고맙습니다^^
말씀 들어보니 정확히 알겠습니다.
테스트 코드를 만들어서 확인해보니까 test $1 = 'abc' 이 코드실행할 때 에러는 안 뜹니다만
$1에 옵션형태로 값이 들어온다면 test -e = 'abc'와 같은 형태로 되어 의도하지 않은 버그가 생길수도 있겠네요.
x$1 = x 형태는 참 기발한 발명 같습니다^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.