LINUX.ORG.RU

Bash скрипт на ubuntu и centOS

 


0

2

Следующий скрипт работает на CentOS но не работает на ubuntu.

#!/bin/sh

if [[ -z "$1" || -z "$2" ]]; then
echo -e "WARNING!!! \nFirst argument: target  directory for WWW\nSecond argument: backup dir";
exit;
fi;

Как я понимаю, ЯП должен работать везде одинаково, особенно на проверке аргументов и на конструкции if then.

Ubuntu выдает следующее

scriptfile: 4: scriptfile: [[: not found
scriptfile: 4: scriptfile: -z: not found

Видел в интернетах похожий случай. В топиках пытались помочь исправить ошибки, но ошибки вылазили все время в новых местах. Там проблема была в «переводе строки».

cat -v scriptfile - не показал аномального конца строки

В чем может быть проблема?

★★

Последнее исправление: ex3me (всего исправлений: 1)

а как вы запускаете? Надо запускать ./script_name.bash

И да, строка с #!/bin/bash должна быть первой.

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

Так запускается

/bin/bash scriptfile

Без /bin/bash выдает ошибки, несмотря на то, что внутри указан интерпретатор

Спасибо всем кто помогал;)

ex3me ★★
() автор топика
Последнее исправление: ex3me (всего исправлений: 1)
Ответ на: комментарий от annulen

Что за недосоветы?

Тогда надо и 1) «||» наружу выносить / либо -o (что тоже не posix); 2) echo -e -> printf

// ссзб, нефиг на bash завязываться ^_^

anonymous
()

«[[» — sh не умеет. Да и зачем она тут нужна? Замени всю конструкцию if на sh'ную.

«;» в последних двух строках не нужны.

Короче вот:

#!/bin/sh

if [ -z "$1" -o -z "$2" ]; then
echo -e "WARNING!!! \nFirst argument: target  directory for WWW\nSecond argument: backup dir";
exit
fi
anonymous
()
Ответ на: комментарий от ex3me

Значит все равно почему-то скрипт выполняется не bash-ем, а sh.

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

head -1 <scriptfile> ?

#!/bin/bash

Если даже указать в скрипте #!/bin/sh, то после запуска /bin/bash scriptfile будет работать

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

Ты в курсе, что по посиксу -e - «implementation defined»? Проверь что ль на dash, потом советуй..

Проверил. В дебе он реализован, поэтому работает. Хотя, да, вся эта строка выглядит как дерьмо, не sh-стайл ) .

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

Если даже указать в скрипте #!/bin/sh, то после запуска /bin/bash scriptfile будет работать

дык при таком запуске УЖЕ запускается команда /bin/bash. А вот если просто ./scriptfile, то запустится то, что написано в первой строке. Или /bin/sh, если там написано что-то непонятное.

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

Хм.. я крайне озадачен).

/bin/bash scriptfile будет работать

Еще бы, в этом варианте sheband - просто комментарий.

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

нефиг на bash завязываться ^_^

есть у него баш, не вижу проблемы. А /bin/sh было модным 20 лет назад.

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

В дебе он реализован

«в дебе» ЕМНИП 4 команды echo:

1. /bin/echo

2. /bin/sh echo

3. /bin/dash echo

4. /bin/bash echo

ты сейчас про какую?

И да, ещё можно всякие zsh/ksh/csh поставить. Тысячи их.

И совет: если хочешь портабельный скрипт, то используй bash --posix. Там echo будет работать по POSIX.

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

а лучше test

хрен редьки не слаще. Это тоже самое, что [ ]

drBatty ★★
()

«WARNING!!! \nFirst argument: target directory for WWW\nSecond argument: backup dir»

Вот, на мой скромный взгяд, чуть более правильный подход:

usage() {
  cat << EOF
...
EOF
  exit 1
}

<проверка> || usage
anonymous
()

if [ -z «$1» ] || [ -z «$2» ];

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

В дебе он реализован, поэтому работает

Приче тут деб - не деб? Может в новых поменяли, но dash -с «echo -e» вполне выводил "-e", а «\n» etc по умолчанию включены.

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

А есть ли толковый гайд для чистого sh?

открой info bash, а там посмотри ноду 6.11 Bash POSIX Mode

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

/bin/sh — симлинк

во первых не везде и не всегда, во вторых, поведение команды может отличаться, в зависимости от её имени (например /sbin/reboot тоже симлинк, но работает иначе чем halt).

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

не знаю. RTFM

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

anonymous
()

для Ubuntu

#! /bin/bash

/topic

// b.

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

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

если вы такой умный, то помогите другим, менее опытным. Лично меня этот вопрос совершенно не интересует. Как например вопрос факторизации числа 13874388. Мне достаточно того, что я знаю, как быстро получить ответ на такие вопросы.

ЗЫЖ если вам интересно, то на подотчётных мне системах \n работает, впрочем как и достаточно свежая версия bash. А что там на вашем локалхосте, меня мало волнует.

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

И совет: если хочешь портабельный скрипт, то используй bash --posix. Там echo будет работать по POSIX.

и можно будет использовать \n?

не знаю. RTFM, если тебя это так волнует.

Считаю, это замечательно). На пальцах: если в echo нет спецсимволов, то --posix вот никак не повлияет. А если есть, то вдруг оказывает, что совет мало чем подкреплен.

если вы такой умный, то помогите другим, менее опытным

Просто доки надо читать, прежде чем «советовать»:

It is not possible to use echo portably across all POSIX systems unless both -n (as the first argument) and escape sequences are omitted.

А что там на вашем локалхосте, меня мало волнует.

Зря огрызаетесь, могу могу еще раз ткнуть в вашу же фразу:

Там echo будет работать по POSIX.

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