Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: bash - функция - for как передать переменную с пробелом?  (Прочитано 1269 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Bulas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Здравствуйте!
(Нажмите, чтобы показать/скрыть)
Создал вот такую функцию проверки существования пути. Она отлично работает, но до того момента пока в пути не появляется пробел.
(Нажмите, чтобы показать/скрыть)
Пробовал экранировать "'` - не получается.
Пробовал IFS.
(Нажмите, чтобы показать/скрыть)
Выскакивает вообще не понятная ошибка строка 25: /home/a/aa bb: Это каталог. Даже не пойму в чем претензия. Переменная не может содержать значение каталога?
« Последнее редактирование: 16 Апреля 2019, 10:12:29 от Bulas »

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
здесь кавычки нужны:if [ -d $x ]Вот так:if [ -d "$x" ]
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн Bulas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
здесь кавычки нужны:if [ -d $x ]Вот так:if [ -d "$x" ]
Я так уже пробовал. Не помгает. Проблема не так проста как кажется.
« Последнее редактирование: 16 Апреля 2019, 10:19:40 от Bulas »

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6904
    • Просмотр профиля
Цитировать
десь кавычки нужны:
Не помешает, но не помогут. Мне так кажется...
Сейчас так:
func_test_exist_path $Input $Input2Попробуй так:
func_test_exist_path "$Input" "$Input2"

Оффлайн Bulas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Цитировать
десь кавычки нужны:
Не помешает, но не помогут. Мне так кажется...
Сейчас так:
func_test_exist_path $Input $Input2Попробуй так:
func_test_exist_path "$Input" "$Input2"
Увы, не получается. Я уже второй день думаю. Кажется все варианты с кавычками и isf перепробовал.
(Нажмите, чтобы показать/скрыть)

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Bulas, у вас интерпретатор в начале скрипта как задан? bash или sh?
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн Bulas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Bulas, у вас интерпретатор в начале скрипта как задан? bash или sh?
#!/bin/bash

Оффлайн zg_nico

  • Заслуженный пользователь
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3513
  • Nil mortalibus arduum est
    • Просмотр профиля
Bulas, вот так работает:func_test_exist_path () # проверка правильности путей
{

for x in "$@"
do
    stage="Проверка пути $x"

    if [ -d "$x" ]
    then
        echo "ok    $x"
    else
        echo "error     $x"
    fi
done
}

Input="/home/zg_nico/Рабочий стол" # существует
Input2="/home/zg_nico/Папка, которой нет" # отсутствует

func_test_exist_path "$Input" "$Input2" # проверка параметров
При запуске:ok    /home/zg_nico/Рабочий стол
error     /home/zg_nico/Папка, которой нет
« Последнее редактирование: 16 Апреля 2019, 10:37:16 от zg_nico »
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], KUbuntu 18.04 64x.

Оффлайн andytux

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6904
    • Просмотр профиля
Цитировать
error     /home/a/aa
error     bb
error     /home/a/aa
Понятно, функция получает три параметра, цикл выполняет три оборота.
Тогда примерно такой сценарий:
for x in $@брать один парметр:
for x in "$1"В тело цикла добавить shift и проверку окончания параметров.
Ну и читать на ночь ABS (Advanced Bash Scripting).
« Последнее редактирование: 16 Апреля 2019, 10:38:17 от andytux »

Оффлайн Bulas

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Bulas, вот так работает:func_test_exist_path () # проверка правильности путей
{

for x in "$@"
Точно! Работает!  :2funny:
Я ставил кавычки, но почему-то не догадался поставить их во все возможные места.
Большое Спасибо!
« Последнее редактирование: 16 Апреля 2019, 11:26:23 от Azure »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6738
  • 20% Cooler
    • Просмотр профиля
Код: (bash) [Выделить]
func_test_exist_path () # проверка правильности путей
{
while [ "$1" ] ; do
  [ -d "$1" ] && echo -e "ok\t$1" || echo -e "error\t$1"
  shift
done
}

! Конструкция ... && ... || ... - не является заменой if-else !
Однако, в данном случае её использование уместно. 
« Последнее редактирование: 16 Апреля 2019, 16:08:00 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
#include <stdio.h>

int main (int ia, char **ca){
int i = 0;
while (ca[i]){
puts (ca[i]);
i++;
}
return 0;
}
./test "1 2" 1 2
короче мало.

« Последнее редактирование: 16 Апреля 2019, 17:08:22 от victor00000 »
Wars ~.o

 

Страница сгенерирована за 0.031 секунд. Запросов: 23.