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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Область видимости переменных в bash  (Прочитано 4625 раз)

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

Оффлайн compplace

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Всем привет.
Есть bash скрипт, в котором обрабатываю файлы в ffmpeg и надо в цикле запомнить название предыдущего файла.
Пишу:
#!/bin/bash
PREV_PATH_FILE=""
...
while true
здесь выборка из базы
do
...
PREV_PATH_FILE="path_to_file"
#и если где-то здесь обратиться к переменной, то в ней будет значение
...
done
Но если обратиться к переменной при новой итерации цикла, то в ней будет пусто. Как можно запомнить это значение и записать в глобальную переменную, т.к. я так понял он создаёт локальную и пишет в неё, а при новой итерации использует глобальную?

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #1 : 16 Апреля 2013, 22:57:03 »
Нет, все у вас верно только что проверил приведенный вами код:

Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Область видимости переменных в bash
« Ответ #2 : 17 Апреля 2013, 04:13:45 »
Изменение области видимости происходит, если вы используете конвейер:
http://stackoverflow.com/questions/4667509/problem-accessing-a-global-variable-from-within-a-while-loop/4667725#4667725

Оффлайн compplace

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #3 : 17 Апреля 2013, 12:03:31 »
Нет, все у вас верно только что проверил приведенный вами код:


А если сделать так:
#!/bin/bash
while true
do
    echo "$PREV_FILE_PATH"

    mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME ... while read ...;
    do

    PREV_FILE_PATH="777"
    done

done
То работает вот так:
Цитировать
127
127
127
Но если перенести PREV_FILE_PATH="777" сразу перед последним done, то выводит так:
127
777
777
777
Читал про subshell и пробовал ставить в конце обоих done это: < <(find [путь к папке])
Но ничего это не изменило.
« Последнее редактирование: 17 Апреля 2013, 12:21:00 от compplace »

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #4 : 17 Апреля 2013, 12:26:17 »
mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME ...;
    do

    PREV_FILE_PATH="777"
    done

вы уверены что переменной вообще присваивается значение 777, я например  не уверен
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн compplace

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #5 : 17 Апреля 2013, 12:31:07 »
mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME ...;
    do

    PREV_FILE_PATH="777"
    done

вы уверены что переменной вообще присваивается значение 777, я например  не уверен
Ну я ж говорю, если вынести её перед последним done:
#!/bin/bash
PREV_FILE_PATH="127"
while true
do
    echo "$PREV_FILE_PATH"

    mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME ... while read ...;
    do

    done
    PREV_FILE_PATH="777"

done
То переменная присваивается и в следующих итерациях уже в ней 777

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #6 : 17 Апреля 2013, 12:33:34 »
она не присваивается если не перенести так как не срабатывание условие:
while read ...;

в результате код в теле цикла не выполняется, вот в этом и проблема
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #7 : 17 Апреля 2013, 12:34:36 »
дайте полный текст скрипта тогда и будем думать...
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн compplace

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #8 : 17 Апреля 2013, 12:39:42 »
дайте полный текст скрипта тогда и будем думать...
Так я ж дал. Вот эта часть и не работает.
#!/bin/bash


while true
do
echo "$PREV_FILE_PATH"
mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME "тут идёт запрос" | while read "здесь читаются переменные из выборки";
do
PREV_FILE_PATH="777"
done

done

Это всё из-за цикла с выборкой видимо.
Так если написать, то работает тоже:
while true
do
echo "$PREV_FILE_PATH"
while true
do

PREV_FILE_PATH="777"
break
done


done
« Последнее редактирование: 17 Апреля 2013, 12:47:13 от compplace »

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #9 : 17 Апреля 2013, 13:18:56 »
Ведь ArcFi уже писал: "Изменение области видимости происходит, если вы используете конвейер"

Пользователь решил продолжить мысль 17 Апреля 2013, 13:25:12:
Например:
a=1 | (a=2; echo $a); echo $a
выдаст:
2
1
« Последнее редактирование: 17 Апреля 2013, 13:25:12 от Vitsliputsli »

Оффлайн compplace

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #10 : 17 Апреля 2013, 13:27:04 »
Ведь ArcFi уже писал: "Изменение области видимости происходит, если вы используете конвейер"

Пользователь решил продолжить мысль 17 Апреля 2013, 13:25:12:
Например:
a=1 | (a=2; echo $a); echo $a
выдаст:
2
1
Какой конвейер?

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #11 : 17 Апреля 2013, 13:47:28 »
Не, серьезно, есть же google, не сложно же его спросить. Вот ссылка из Вики.

Оффлайн compplace

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #12 : 17 Апреля 2013, 13:51:27 »
Не, серьезно, есть же google, не сложно же его спросить. Вот ссылка из Вики.
А как это исправить?

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #13 : 17 Апреля 2013, 14:24:28 »
Не использовать конвейер.

Или, например, можно сделать так:
PREV_FILE_PATH=`mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME "тут идёт запрос" | while read "здесь читаются переменные из выборки";   do echo "777"; done`


Оффлайн compplace

  • Автор темы
  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Область видимости переменных в bash
« Ответ #14 : 17 Апреля 2013, 14:33:25 »
Не использовать конвейер.

Или, например, можно сделать так:
PREV_FILE_PATH=`mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME "тут идёт запрос" | while read "здесь читаются переменные из выборки";   do echo "777"; done`


А есть ещё варианты? У меня в этом цикле потом ещё подцикл идёт и куча текста выводится...

Пользователь решил продолжить мысль 17 Апреля 2013, 14:58:45:
По ходу кроме записи в файл вариантов нет...
« Последнее редактирование: 17 Апреля 2013, 14:58:45 от compplace »

 

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