LINUX.ORG.RU
решено ФорумAdmin

Проблемы пробелов в скрипте bash

 , ,


1

2

Все добрый день.

Пытаюсь написать скрипт типа:

#!/bin/bash
FILE1='первый файл'
DIR1='откуда'
DIR2='куда'
cp $DIR1/$FILE1 $DIR2/
В итоге
cp: не удалось выполнить stat для 'откуда/первый': Нет такого файла или каталога
cp: не удалось выполнить stat для 'файл',: Нет такого файла или каталога

Без кавычек с «\ » тоже самое. Как правильно-то тогда?

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

А ещё лучше cp -- "${DIR1}/${FILE1}" "${DIR2}" дабы внезапно не отстрелить себе ногу.

h578b1bde ★☆
()
Ответ на: комментарий от crutch_master
$ cat lorcopy.sh
#!/bin/bash
FILE='New File 1'
DIR1='New Folder 1'
DIR2='New Folder 2'
mkdir "${DIR1}" "${DIR2}"
touch "${DIR1}/${FILE}"
cp -- "${DIR1}/${FILE}" "${DIR2}"

$ ./lorcopy.sh

$ ls New\ Folder\ 2/
New File 1


Пробелы в имени всё равно экранировать.

Ты о чём?

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

Пробелы в имени всё равно экранировать.

Уже даже и не помню, тоже от какого-то простреливания ног защищает. Это же баш.

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

Какую функцию призвана выполнять гора скобок {, }?

чтобы отделять имя переменной от строки, которая должна подклеиваться к значению переменной при подстановке

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

чтобы отделять имя переменной от строки, которая должна подклеиваться к значению переменной при подстановке

Да, верно.

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

Какую функцию призвана выполнять гора скобок {, }?

Ну как же, модно-молодежно. Зачем экранировать пробелы - не помнят, зачем скобки - тоже. А сказать хочется.

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

Вне контекста типа «$arg1_$arg2_$arg3» (где он необходим) он ни от чего не защищает.

Хаотично раскиданные вокруг грабли имеют свойство бить по башке там где ты меньше всего ожидаешь, поэтому лучше убрать их все заранее.

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

Хаотично раскиданные вокруг грабли имеют свойство бить по башке

Уже даже и не помню, тоже от какого-то простреливания ног защищает.

Грабли возникают вот от второго.

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

Грабли возникают вот от второго.

Зачем держать в голове всякий мусор, появившийся в результате жизнедеятельности костылявших шелл наркоманов, если можно сразу писать надёжно-молодёжно™?

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

если можно сразу писать надёжно-молодёжно

Объясняю. Если убрать все {}, то в вашем скрипте можно смело менять bash на sh, при этом эффект будет тем же самым и даже работать быстрее будет.

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

Если убрать все {}, то в вашем скрипте можно смело менять bash на sh

Если бы бабушка была бы дедушкой. У ТСа в тегах этого треда и в первой строчке приведённого им скрипта указан bash, значит ему нужен именно он.

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

У ТСа

Задача ТСа настолько детсадовская, что тред интересен только как Вы лично выкрутитесь от того факта, что bash вы толком не знаете, а советы даёте. Уж не знаю, что вы вынесли из треда насчёт скобочек, но судя по всему насчёт экранирования пробелов - ничего.

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

Задача ТСа настолько детсадовская

Откуда ты знаешь задачу ТСа, экстрасенс что ли? Может у него в стартовом посте кусок тестового скрипта, который он куда-нибудь пытается присобачить, а ты ему советуешь sh вместо баша впендюрить.

Вы лично выкрутитесь от того факта, что bash вы толком не знаете, а советы даёте

Всего знать нельзя и с этим фактом спорить глупо. Однако в данном случае я знаю достаточно.

судя по всему насчёт экранирования пробелов - ничего

Какие проблемы с пробелами?

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

Откуда ты знаешь задачу ТСа, экстрасенс что ли?

Задача ТСа - понять как обрабатывать пробелы в скрипте. Всё остальное - такие же измышлизмы.

Какие проблемы с пробелами?

У вас? Так я цитировал ваш текст, который вы так и не скоректировали новым ответом по модно-молодёжной моде гордиться своим незнанием.

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

Задача ТСа - понять как обрабатывать пробелы в скрипте

Нет. Задача ТСа — написать скрипт на баше, в котором в т.ч. должны экранироваться пробелы.

У вас? Так я цитировал ваш текст, который вы так и не скоректировали новым ответом по модно-молодёжной моде гордиться своим незнанием.

Не распарсил.

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

Если ты о случайно повторившейся цитате — думаю что в отличие от тебя пользователь d_a, которому я отвечал, давно понял что именно я имел в виду.

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

Эта личная переписка уже достала.

Задача ТС указана в <title>, «в т.ч.» - это ваши измышлизмы, не относящиеся к делу.

Чего там парсить? Речь шла о нахождении грабель там где их может найти только незнающий bash.

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

Проблемы пробелов в скрипте bash

можно смело менять bash на sh

Задача ТС указана в <title>

Молодец, стараешься.

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

можно смело менять bash на sh

Но не нужно. И совершенно не надо знать о существовании башизмов (точнее, об информации, что где-то чего-то нет). Зачем забивать себе голову абсолютно ненужной информацией?

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

Зачем забивать себе голову абсолютно ненужной информацией?

Постараюсь ответить литературно, ибо как выше упоминал — моду гордиться незнанием не приемлю.

Это профессионализм, приходящий с опытом, автоматом. «О, новая версия имеет такую фичу. А я раньше сколько крови на это пролил...» Потом к ней привыкаешь и вдруг оказывается, что надо поадминить какой-нить чпукс, а руки сами вбивают понравившуюся фичу, а мозг судорожно пытается понять, чего же оно ругается. Потом это обрастает пылью и само забывается, как результат, первым делом устанавливается glibc/bash/gcc, а уж потом приступаешь к администрированию.

И нет нет, это не из серии раньше трава была зеленей и прочих сперва добейся. Это из серии, что знать всё не возможно, но выдавать своё незнание за добродетель совершенно идиотское веяние времени. А потом удивляются, откуда на ЛОРе хамство, личная переписка, откровенный мусор за мемами типа «не нужно».

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

Подскажи оболочку, в которой ${var} не сработает.

Это было давно. Но не о том была речь. Был вопрос, зачем тут {}? Ответ выдал непонимание.

Да ну?

Ну да. Скобочки нисколько не выключают парсер имени по [A-Za-z0-9_], но включают его сложный вариант для Parameter Expansion. Так что как минимум два символа {} и простой парсер ускорит работу.

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

моду гордиться незнанием не приемлю

Быстро и решительно мне прочитал Фому Аквинского на средневековом диалекте каталонского.

Это профессионализм

Нет, это брюзжание некомпетентного непрофессионала.

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

Во-первых, на чпуксе есть баш. Во-вторых, трением добывать огонь ты тоже умеешь? А то ВДРУГ бах и голый на необитаемом острове. В-третьих, самое главное — это что, старик Хоттабыч прилетел и все компьютеры на чпукс переделал и ты такой хоп и опа? Если тебя пригласили рулить чпуксом, значит либо ты уже с ним работал (и знаешь, чего там есть, а чего там нет), либо ты считаешься достаточно компетентным специалистом, чтобы с ним справиться, а компетентный специалист способен прочитать документацию, я тебе это гарантирую.

Потом это обрастает пылью и само забывается, как результат, первым делом устанавливается glibc/bash/gcc, а уж потом приступаешь к администрированию

Ничерта не понял в чём мораль. Это хорошо или плохо? И почему?

Это из серии, что знать всё не возможно, но выдавать своё незнание за добродетель совершенно идиотское веяние времени

Знать устаревшую технологию — это нормально. Когда-то она была не устаревшей.
Гордиться этим знанием — это снобизм. В этом нет повода для гордости.
Изучать устаревшую технологию, потому что она тебе понадобилась — это нормально, профессия археолога, даже айтишного, — тоже профессия.
Заставлять оглядываться на устаревшую технологию только потому, что ты её знаешь, а тот, кто делает, не знает, — это полный распад мозга.

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

Ничерта не понял

Остальное можно было не писать. Нахамить в три короба с «гарантией» в режиме божественного откровения на весьма вежливый текст и радостно признаться что «ничерта не понял». ЧТД.

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

Ну да. Скобочки нисколько не выключают парсер имени по [A-Za-z0-9_], но включают его сложный вариант для Parameter Expansion. Так что как минимум два символа {} и простой парсер ускорит работу.

dash и busybox sh ${} быстрее раскрывают и заметно это становится при сотнях тысяч parameter expansion.

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

если можно сразу писать надёжно-молодёжно

Объясняю. Если убрать все {}, то в вашем скрипте можно смело менять bash на sh

А зачем вам менять ГНУ Баш такие древние шеллы, у которых даже с этим проблемы?

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

dash и busybox sh ${} быстрее раскрывают и заметно это становится при сотнях тысяч parameter expansion.

Заинтересовали, обязательно посмотрю. Логически это странно.

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

А зачем вам менять ГНУ Баш

Если вы поменяете #!/bin/bash на sh на системе с /bin/sh-> /bin/bash у вас ничего не изменится, но вам спасибо скажут те, у которых вообще нет /bin/bash

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

чтобы отделять имя переменной от строки, которая должна подклеиваться к значению переменной при подстановке

в данном примере это не нужно

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

dash и busybox sh ${} быстрее раскрывают и заметно это становится при сотнях тысяч parameter expansion.

Заинтересовали, обязательно посмотрю. Логически это странно.

Посмотрел. Не правда ваша. При VSNORMAL и subtype=0 парсер намного тупее, что и следовало ожидать, тупо do is_name() ... и выход, а при '{' там проверяется, есть ли первый '#' а потом все символы не is_name() до '}'.

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

Разве parameter expansion парсером выполняется?

Во-первых, parameter expansion тоже парсер. Во-вторых, для $VAR parameter expansion не вызывается вообще, varvalue и вперед.

vodz ★★★★★
()

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

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

Просто пробел в shell является основным управляющим синтаксическим элементом, что почему-то смущает программистов на пыхтонге, хотя у них как ни странно тоже.

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

Ошибся и не выполнил присваивание переменной a перед 100500 ${a}. При прочих равных ${a} парсится немного быстрее $a.

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

При прочих равных ${a} парсится немного быстрее $a.

Я вот посмотрел код, который сам и утаптывал в busybox-ный (d)ash, копирайт мой там на это и стоит. Смотреть пришлось потому что это было давно. Выводы озвучил. А ваши повторения - бездоказательные.

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

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

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

Если вы поменяете #!/bin/bash на sh на системе с /bin/sh-> /bin/bash у вас ничего не изменится, но вам спасибо скажут те, у которых вообще нет /bin/bash

Я спросил иное. Сколько вообще этих «тех», у каких завалялись такие древние оболочки, что они даже в ${} не умеют?

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

Я спросил иное.

Вы спросили зачем менять. Я вам ответил. Нет никакого в данной задачи смысла юзать конкретно bash. Скобочки тут совсем не при чём. Ибо как выяснилось срач развели от незнания где и как проявляется пробельный разделитель. Про шеллы без скобочек тоже отвечал - таких не осталось.

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