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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

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

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

  • Старожил
  • *
  • Сообщений: 4464
    • Просмотр профиля
Цитировать
десь кавычки нужны:
Не помешает, но не помогут. Мне так кажется...
Сейчас так:
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

  • Старожил
  • *
  • Сообщений: 4464
    • Просмотр профиля
Цитировать
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 »

Оффлайн ALiEN175

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 4712
  • Capture the truth
    • Просмотр профиля
Код: (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 »
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Nvidia 8500GT :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн victor00000

  • Забанен
  • Старожил
  • *
  • Сообщений: 15570
  • Глухонемой (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 »
Нельзя друзья, дулу - AnrDaemon видите?
~.o

 

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