LINUX.ORG.RU

Изучаю bash

 


1

1

Я человек далёкий от консоли и программирования настолько, насколько это возможно. Но жизнь заставляет. Решил немного поизучать bash и навелосипедил скрипт, но мозгов не хватает. Зарание извиняюсь за этот ужас и бред:

#!/bin/sh
i=1
f="${1}новая папка"
while [ "-d "$f \($i\)"" = "true" ]
do
  touch "$f \($i\)"
  i=$[$i+1]
done
По идеи код должен принимать первым параметром любой путь, проверять в нём наличие директории «путь/новая папка (1)». Если она есть, проверить «путь/новая папка (2)» и т.д. И если её нет создать её. Но код не работает:
kot@kot-MS-7930:~$ bash -x /home/kot/bin/installin/newfolder.sh /home/kot/bin/
+ i=1
+ f='/home/kot/bin/новая папка'
+ '[' '-d /home/kot/bin/новая' папка '(1)' = true ']'
/home/kot/bin/installin/newfolder.sh: строка 5: [: слишком много аргументов
Видимо я как-то неправильно расставил кавычки. Также я ещё не придумал как начинать проверку не с «нова папка (1)», а с «новая папка». Вроде должно быть не сложно, но все идеи кончились. И ещё вопрос по экранированию символов здесь и здесь в примерах показано, что внутри echo экранирование для $ действует наоборот. А здесь в примере:

\$
придает знаку доллара непосредственное значение (если перед именем переменной стоит \$, то обращения к ее значению не последует)
echo «\$variable01» # $variable01
echo «Стоимость книги \$7.98.» # Стоимость книги $7.98.

показано, что экранирование для $ действует как и везде прямо. Весь мозг сломал…

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

И ваш вариант не работает

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

У вас ГНУ Баш, вероятно, какой-то древний.

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

Как это «не было»? Я всегда прописываю шебанг и здесь прописал. Если только товарищ Кот его зачем-то изменил, но это уже шиза — рандомно править программу и жаловаться, что она не работает.

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

Спасибо, работает.

ОМГ.

А почему в sh не работает?

Потому, что /bin/sh в вашей поставке ГНУ — не Баш.

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

Просто при копировании в старый скрипт не всё скопировал. Незаметил, что первая строчка отличается…

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

осталось открыть http://tldp.org/LDP/abs/html/index.html и собственно поизучать

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

Куда лучше читать материалы под редакцией Грега Вулиджа, ну и про прилагаемое справочное руководство тоже забывать не стоит.

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

почему в sh не работает?

Потому, что sh не умеет в арифметику типа $[], насколько я знаю. Можно попробовать заменить квадратные скобки на двойные круглые: $(()), если нужно, чтобы работало в sh.

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

Ой, ну я ее уже давно читал... Сейчас попробую найти что-нибудь из наиболее характерного.

Ну например, в главе про арифметику:

arithmetic operators

+    plus
-    minus
*    multiplication
/    division
**   exponentiation

    # Bash, version 2.02, introduced the "**" exponentiation operator.

    let "z=5**3"    # 5 * 5 * 5
    echo "z = $z"   # z = 125

%  modulo, or mod (returns the remainder of an integer division operation)

    bash$ expr 5 % 3
    2

То есть идет перечисление арифметических возможностей ГНУ Баша, и ВНЕЗАПНО вылазит пример использования внешней утилиты expr. Из чего у читателя может сложится впечатление, что: Баш не умеет в остаток от деления, а поэтому надо прибегать ко внешней утилите (неверно), или что expr — это краткая форма записи для пары letecho (тоже, разумеется, неверно).

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

 Command substitution makes it possible to extend the toolset
available to Bash. It is simply a matter of writing a program or
script that outputs to stdout (like a well-behaved UNIX tool should)
and assigning that output to a variable.

#include <stdio.h>

/*  "Hello, world." C program  */

int main()
{
  printf( "Hello, world.\n" );
  return (0);
}

bash$ gcc -o hello hello.c


#!/bin/bash
# hello.sh

greeting=`./hello`
echo $greeting

bash$ sh hello.sh
Hello, world.

Прекрасный коллекция косяков: для начала — вызов сценария через $ <interpreter> <script> вместо назначения бита исполняемости как таковой, затем вызов сценария на Баше при помощи sh (привет, Кот), затем незакавыченная строковая переменная. Но приведенный пример при этом работает, чем откладывает в мозгах у читателя ошибки за правильные образцы.

И там так вся книжка написана.

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

Потому, что sh не умеет в арифметику типа $[], насколько я знаю

sh не существует, чтоб он что-то мог уметь или не уметь. Это просто символьная ссылка на какой-то из интерпретаторов, иногда даже на ГНУ Баш.

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

Не все, ибо перевод давно устарел; а кучу устаревших и просто дурных практик и из новых изданий оригинала не вычистили.

Ты когда хочешь узнать формулу поваренной соли, сразу читаешь курс неорганической химии?

Там всё, что ему сейчас нужно.

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

Ты когда хочешь узнать формулу поваренной соли, сразу читаешь курс неорганической химии?

Я ее еще, бог миловал, пока помню.

Там все, что ему сейчас нужно.

И еще куча того, что не нужно, и немного того, что лучше вообще никогда не видеть.

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

Там все, что ему сейчас нужно.

И еще куча того, что не нужно, и немного того, что лучше вообще никогда не видеть.

Главное, что то, что нужно есть.

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

Главное, что то, что нужно есть.

Не понимаю вашей логики. Как читатель узнает, что́ ему нужно, если (повторюсь) в самой книге не говориться, что́ полезно запомнить, а что́ — не читать и забыть. А во-вторых, чем больше в книге посторонней информации, тем сложнее ее просто осилить.

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

Не понимаю вашей логики. Как читатель узнает, что́ ему нужно, если (повторюсь) в самой книге не говориться, что́ полезно запомнить, а что́ — не читать и забыть.

У читателя есть вопросы. В книге есть ответы.
Если вопросов нет, обычно книгу просто просматривают, чтобы понять что вообще бывает.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.