LINUX.ORG.RU

Bash, test, вопрос


0

0

Почему с пустой строкой сравнивают так

if [ "x$BLABLA" = "x" ]; then ...
а не так:

if [ "$BLABLA" = "" ]; then ...

ведь он тоже работает!


Ответ на: комментарий от GotF

1) [[ только в баше есть? обычный sh её переварит?
2) Если сравнивать два пред. варианта, то чем плох второй?
3) Что такое К.О.
4) test и [ — одно и то же? bash вызывает /bin/test или сам интерпретирует выражения?

paxac
() автор топика
Ответ на: комментарий от paxac

Да, [[ исполняется без лишних внешних вызовов, потому быстрее. Но если требуется переносимость (POSIX), то только [.

Кстати,

[ -z $blah ]

работает абсолютно аналогично.

2) Если сравнивать два пред. варианта, то чем плох второй?

Ничем.

GotF ★★★★★
()
Ответ на: комментарий от GotF

> Ничем.

А зачем тогда извращаются и используют первый вариант?

Но если требуется переносимость (POSIX), то только [.

Всегда болся этого слова. Что такое POSIX? В обычном sh [[ работают?

paxac
() автор топика
Ответ на: комментарий от paxac

В bash'е (если верить man bash и трейсу скриптов) test, [ и [[ являются встроенными командами. [[ позволяет использовать регулярные выражения.

На ваш первый вопрос яндекс даёт такой ответ: http://www.gnu.org/software/libtool/manual/autoconf.html

 test  ( strings )

     Posix  says that ‘ test  " string "’ succeeds if  string  is not null, but this usage is not portable
to traditional platforms like Solaris 10 /bin/sh, which mishandle  strings  like ‘!’ and ‘-n’.

     Posix  also says that ‘ test  ! " string "’, ‘ test  -n " string "’ and ‘ test  - z  " string "’
work with any string, but many shells (such as Solaris, AIX 3.2, UNICOS 10.0.0.6, Digital Unix 4, etc.)
get confused if  string  looks like an operator:

          $  test  -n =
          test: argument expected
          $ test ! -n
          test: argument expected

    Similarly,  Posix  says that both ‘test "string1" = "string2"’ and ‘test "string1" != "string2"’
work for any pairs of strings, but in practice this is not true for troublesome strings
that look like operators or parentheses, or that begin with ‘-’.

    It is best to protect such strings with a leading ‘X’, e.g., ‘test "Xstring" != X’
rather than ‘test -n "string"’ or ‘test ! "string"’. 
То есть, если /bin/bash, то через [ -z «$BLABLA» ] , а если «где угодно», то [ «x$BLABLA» = «x» ] .

mky ★★★★★
()
Ответ на: комментарий от GotF

А ещё:
$ ls /usr/lib64/bash
basename cut finfo head id logname mypid pathchk printenv pushd rmdir strftime tee tty unlink
cat dirname getconf hello ln mkdir necho print push realpath sleep sync truefalse uname whoami

Lumi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.