LINUX.ORG.RU

[bash] if...else и спецсимволы

 


0

1

#!/bin/bash

let i=0
k=$*
iptables-save | while read line; do
if [ $line = $k ]; then
let i=1
fi
done
if [ $i -eq 0 ]; then
echo OK
fi

ЧЯДНТ?

./i.sh 1
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: too many arguments
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: -A: unary operator expected
./i.sh: line 6: [: too many arguments
OK

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

Вообще, if тут ни при чём. [ — отдельная (пусть и builtin) команда. [ a b c = a b c ] — явно слишком много аргументов. [ «a b c» = «a b c» ] — нормально.
Добавлять символ перед всем этим безумием нужно на случай пустой строки. [ = whatever ] тоже выдаст ругань.

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

Добавлять символ перед всем этим безумием нужно на случай пустой строки. [ = whatever ] тоже выдаст ругань.

УМВР. Символ не нужен.

max@PC ~ $ if [ "" = "" ]; then echo 1; fi
1

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

Хм. С кавычками работает (просто [ $emptystring = 'whatever' ] ругнётся).
/me уже не помнит, где видел подобную страховку и для чего она применяется.
Алсо [[ и дефолтный zsh'ный [ работают без кавычек.

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

дефолтный zsh'ный [ работают без кавычек.

Проверил, реально работает. Не знал этого, спасибо. Хотя не всегда:

┌─(max@PC:pts/4)─(2800.000 2800.000 MHz)──────────────────────────────────(~)─┐
└─(15:09:%)── if [ "" = = ]; then echo 1; else echo 0; fi       ──(Вто,Июн28)─┘
0
┌─(max@PC:pts/4)─(2800.000 2800.000 MHz)──────────────────────────────────(~)─┐
└─(15:10:%)── if [ = = ]; then echo 1; else echo 0; fi          ──(Вто,Июн28)─┘
zsh: parse error: condition expected: =
0

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

>чем Вы такое красивое обрамление команд в консоли делаете?

У меня не bash, а zsh. Оно, кстати, ещё и цветное. Тут двухстрочный промпт PS1 и ещё во второй строке справа (там, где дата), фича zsh - правый промпт. Конфиг промпта я где-то нагуглил и творчески переработал, т.к. тот в нескольких местах поглюкивал. Кстати, там же было и подробное описание.

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

>В баше сложнее с правым приглашением

А там это вообще возможно? Если даже двигать курсор с помощью escape-последовательностей, то при вводе длинной команды будет плохо.

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

>В теории можно написать шелл на bash и засунуть его в bashrc.

Омг. /me выкинул дурные идеи из головы и вернулся на zsh.

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

такое красивое обрамление

Оно красиво, но, имхо, бесполезно. Я поигрался и снёс.

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

Не тебе учить меня матчасти.

[ не built in which [ сделай и удивись.

Учи матчасть сам. bash:

$ which which
/usr/bin/which
$ which [
/usr/bin/[
Но: man bash, CONDITIONAL EXPRESSIONS. Баш умеет заметно больше, чем [ (по крайней мере документированно: сравни man bash, CONDITIONAL EXPRESSIONS и man test). Оно builtin, но сохраняет совместимость. В zsh:
>which which 
which: shell built-in command
>which [
[: shell built-in command
Работает точно так же, как и в bash (ну кроме деталей, описанных в мане). Кавычки не нужны только из-за SH_WORD_SPLIT (благодаря этому можно в параметрах ЛЮБОЙ комнады, включая этот несчастный builtin, не использовать кавычки).

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

>в bash расширенные возможности имеет [[ именно оно и buil-in.

Ты так и не прочитал man.

bash:

$ TEST=1
$ [ -v TEST ] && echo 1 
1
$ /usr/bin/[ -v TEST ] && echo 1
/usr/bin/[: -v: unary operator expected
В bash и [, и [[ являются builtins. Но [ не ломает большинство скриптов, рассчитанных на POSIX test.

Алсо, ты не осилил:

$ which which
/usr/bin/which
Откуда ВНЕШНЯЯ команда знает про ВНУТРЕННИЕ команды шелла? В zsh which тоже builtin, поэтому он не фэйлит.

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

окей. Я ступил и зорвалсо. ☺

Но тебе стоило аппелировать к секции shell builin commands мана баша, так было бы быстрее, очевиднее и проще ☺

$ command -V [[
[[ is a shell keyword
$ command -V [ 
[ is a shell builtin

P.S.

Быстренький взгляд на секцию conditional expressions в сравнении с man test не дал различий.

P.P.S

$ echo $BASH_VERSION
4.1.9(2)-release
$ bash --version
GNU bash, version 4.1.9(2)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ TEST=1 
$ [ -v $TEST ] && echo 1
bash: [: -v: unary operator expected
$ [[ -v $TEST ]] && echo 1
bash: conditional binary operator expected
bash: syntax error near `$TEST'
$ /usr/bin/[ -v $TEST ] && echo 1
/usr/bin/[: -v: unary operator expected
$ /usr/bin/[ -v ] && echo 1
1
$ [ -v ] && echo 1
1
philosoft
()
Ответ на: комментарий от philosoft

GNU bash, version 4.2.10(2)-release (x86_64-pc-linux-gnu)
-v varname
True if the shell variable varname is set (has been assigned a value).
Кстати, это башизм. Zsh при попытке запустить это странно на меня смотрит.

[ -v $TEST ] && echo 1

[ -v TEST ]
Ну и
CONDITIONAL EXPRESSIONS
Conditional expressions are used by the [[ compound command and the test and [ builtin commands to test file attributes and perform string and

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

всё равно не работает

$ a=1
$ [ -v a ] && echo y
bash: [: -v: unary operator expected
Откуда ты вообще это взял? Насчёт есть ли такая переменная и что с этим делать я использую вещи из разряда ${varname:-|:+|-|+|:=|=}

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

>Откуда ты вообще это взял?
man bash, CONDITIONAL EXPRESSIONS. Лень смотреть на остальные, неподдерживаемые test'ом, а эта явно bash-специфичная :3
Вообще, я не так много писал под абстрактный шелл в вакууме, чтобы помнить все башизмы наизусть, но знаю, в каких местах они есть.

x3al ★★★★★
()

if [[ $line = $k ]]

Tip

Конструкция [[ ... ]] более предпочтительна, нежели [ ... ], поскольку поможет избежать некоторых логических ошибок. Например, операторы &&, ||, < и > внутри [[ ]] вполне допустимы, в то время как внутри [ ] порождают сообщения об ошибках.

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