LINUX.ORG.RU

/root/docs/NAT
/root/docs
root

итого 32
drwxr-xr-x 2 root root   88 Янв 17 01:42 .
drwx------ 5 root root 4096 Янв 16 07:18 ..
-rw-r--r-- 1 root root    0 Янв 17 01:23 file_00
-rw-r--r-- 1 root root    2 Янв 16 07:16 file_01
-rw-r--r-- 1 root root    3 Янв 16 07:17 file_02
-rw-r--r-- 1 root root 4078 Янв 16 02:53 NAT
-rw-r--r-- 1 root root   34 Янв 17 01:42 result.txt
-rwxr-xr-x 1 root root  136 Янв 17 01:38 t2.sh
-rwxr-xr-x 1 root root  568 Янв 17 01:29 tst

./t2.sh: 17: [[-e: not found
Liber
() автор топика

Почему не находит-то?

  • пробелы забыл.
  • $file надо в «кавычки занести.
  • под рутом работают только идиоты.
drBatty ★★
()
Ответ на: комментарий от drBatty

под рутом работают только идиоты.

Если руки постоянно чешутся, то лучше к компу вобще не подходить - сломаешь.

irton ★★★★★
()

Может вам вообще упростить:

#!/bin/sh
file=/root/docs/NAT
...
test -e "$file" && {
	echo "FOUND!"
} || {
	echo "NOT FOUND!"
}

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 2)
Ответ на: комментарий от drBatty

пробелы забыл

Да я и не знал про них. Статейка, из которой пример, отформатирована так, что они едва заметны.

$file надо в «кавычки занести.

На случай пробелов, спецсимволов и т.д.? Спасибо, сделаю.

под рутом работают только идиоты.

Да я и не работаю, я пытаюсь настроить роутер. Постоянно вдалбливать sudo в процессе надоедает. А когда все отлажено будет, на сервак и лазать никто не станет.

Может вам вообще упростить:

Спасибо за вариант, попробую разобраться. Я только начал вникать в bash-скрипты (хочу накатать самостоятельно элементарный бэкапер) - это какой-то дурдом! Них$я не понятно и не очевидно. Даже самые простые вещи до невозможности запутаны.

Вот, к примеру, элементарное арифметическое действие:

a=2
b=4

# так не работает:
с=$a+$b

# и вот так не работает:
let c=$a+$b

# так тоже не работает:
let "c=$a+$b"

# и обособленные команды нам пофиг:
c=($a+$b)

# такие тоже:
c=(($a+$b))

# и даже вот так вот ему по барабану:
c=$($a+$b)

# зато вот так - совсем другое дело:
c=$(($a+$b))

Ну и в чем тут разница и где логика?..

Или, к примеру, элементарное логическое выражение для блока IF. Как я только не бился, но логическую конструкцию вида

a && (b || c)

так и не смог соорудить...

Абзац! А я-то еще рассчитывал курить бросить в новом году...

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

Да я и не знал про них. Статейка, из которой пример, отформатирована так, что они едва заметны.

на будущее: в баше пробелы ВАЖНЫ. Лучше их побольше поставить, чем поменьше. Если X надо отделить от Y, то пиши X Y, а то баш такой, он это как XY воспринимает.

На случай пробелов, спецсимволов и т.д.? Спасибо, сделаю.

двойные кавычки выручают во многих других случаях. Если в $var пусто, то это в натуре ПУСТО, а совсем НЕ «пустая строка символов», как ты надеялся. А вот «$var» это действительно пустая строка. Это самый примитивный случай, дальше - хуже.

Да я и не работаю, я пытаюсь настроить роутер. Постоянно вдалбливать sudo в процессе надоедает. А когда все отлажено будет, на сервак и лазать никто не станет.

а... ну ладно. Хотя я скрипты под юзером отлаживаю. Потом в продакшен переношу. Это Хорошая Идея, даже если «продакшен» == твой localhost.

Спасибо за вариант, попробую разобраться. Я только начал вникать в bash-скрипты (хочу накатать самостоятельно элементарный бэкапер) - это какой-то дурдом! Них$я не понятно и не очевидно. Даже самые простые вещи до невозможности запутаны.

bash очень стар, и сильно обвешан костылями для совместимости. Это нужно помнить.

# зато вот так - совсем другое дело: c=$(($a+$b))

слишком сложно. Попробуй так:

$ (( c = a + b )); echo $c
6
нужно понять, что bash не в состоянии отличить x от переменной $x, и потому приходится ставить $. И ещё то, что ВСЕ переменные в баш - строчные.

Или, к примеру, элементарное логическое выражение для блока IF. Как я только не бился, но логическую конструкцию вида a && (b || c) так и не смог соорудить...

что ты хотел здесь сделать? Данная конструкция вычисляется так:

  • вычисляется a
  • если a ложное (не равно 0), то вычисления прерываются
  • иначе вычисляется выражение в скобках

проблема в том, что если в C эти твои a,b,c это выражения, то в bash это строки. Потому и не работает. В C тоже строки так не работают.

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

drBatty, спасибо за ответ!

что ты хотел здесь сделать?

Не конкретно в этом примере. Была параллельная задача. Если $2 задано и ($2 = «красота» или $2 = «лепота»), то...

Пробовал разнообразнейшие варианты, навроде:

if [ -n $2 ] && [[ $2 -eq "x" || $2 -eq "y"]] ...
, но «не угадал». Короче, пока никак в логические выражения не въеду.

если a ложное (не равно 0), то вычисления прерываются иначе вычисляется выражение в скобках

Ты имеешь в виду вложенные условные блоки? А-ля реализация конъюнкции в виде:

if [ _cond_1_ ]; then
    if [ _cond_2_ ]; then _do_something_
    fi
fi
Во-первых, с отрицанием тогда сложности вылезают. Если все одним выражением задано, то можно обойтись одним else'ом. Во-вторых, смотрится громоздко. В подобных случаях код от консолидации условий выигрывает.

З.Ы. Наверное ты прав, с такими экспериментами скрипты лучше из-под юзера отлаживать.

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

Ну вот опять! Ну что тут может быть не так? Все по манам вроде:

#!/bin/sh

_DEBUG="on"
DEBUG1 ()
{
        if [ "$_DEBUG" == "on" ]; then
                echo "$1"
        fi
}

DEBUG1 "AAA"

Выдает:

[: 11: on: unexpected operator

Liber
() автор топика
Ответ на: комментарий от shell-script

балин, не ожидал! «/bin/sh is symbolic link to 'dash'»... а я тут кувыркаюсь, чуть ли не наугад синтаксис подбираю и в чем дело не пойму.

Спасибо!

Liber
() автор топика
Ответ на: комментарий от Liber
#!/bin/bash

if [ -n "$2" ] && [ "$2" == "test" -o "$2" == "anothertest" ]
then    
        echo "All fine"
else
        echo "Not fine"
fi  

Как-то невнимательно ман читаешь, по-моему. Ты по родному man bash изучаешь? Или по ABS Guide. Второе есть на русском и как раз такими простыми примерами. В частности про условия там всё очень хорошо и подробно расписано.

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

if [ -n «$2» ] && [ «$2» == «test» -o «$2» == «anothertest» ]

годно. но может так проще

if [ -n "$2" ]
    then if [ "$2" == "test" ] || [ "$2" == "anothertest" ]

drBatty ★★
()
Ответ на: комментарий от shell-script

Ты по родному man bash изучаешь?

Если честно, нет. Хотя английский понимаю достаточно хорошо, все же тяжеловато воспринимать такой объем. Забудется все.

Я предпочитаю ставить небольшие простые практические задачи и пытаться их решить. Если возникают затыки, тогда лезу в маны, гугл, если не помогает - то сюда.

Или по ABS Guide. Второе есть на русском и как раз такими простыми примерами.

Спасибо, посмотрю!

Вообще сейчас гораздо проще (когда написанное действительности соответствует =). Главная проблема была в том, что я скрипты под dash'ем запускал.

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