Сайт | Скачать | Видео | Wiki

Автор Тема: Как в bash+gtkdialog передавать переменную в функцию?  (Прочитано 6527 раз)

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

Оффлайн Shooshpanchik

  • Новичок
  • *
  • Сообщений: 12
  • Репутация: +0/-0
  • Автор темы
Х-чу сделать 2 комбобокса, чтоб при выборе в первом, менялся список во втором, для этого в функцию построения его списка нужно передать переменную, но не могу понять как это сделать


Цитата
#! /usr/bin/gtkdialog -e
function DISKS()
{
      lsblk -io KNAME,TYPE,SIZE,MODEL,FSTYPE | grep disk | while read line; do
      echo "<item>${line}</item>"
      done
}
function PARTS()
{
      DSK=$1
      echo "<item>$DSK</item>"
      echo "<item>DSK2</item>"
      lsblk -io KNAME,TYPE,SIZE,MODEL,FSTYPE,MOUNTPOINT | grep ${1:0:3} | while read line; do
      echo "<item>${line}</item>"
      done
}
export MAIN_DIALOG='

<window title="Windows Installator" icon-name="gtk-about" resizable="true" width-request="450" height-request="350">
<vbox>
<vbox>
<text><label>Диск </label></text>
   <comboboxtext case-sensitive="false" value-in-list="true">
         <variable>DISK</variable>
          '"$(DISKS)"'
          <action>echo ${DISK:0:3}</action>
          <action type="refresh">PART</action>
   </comboboxtext>
<text><label>Раздел</label></text>
   <comboboxtext case-sensitive="false" value-in-list="true">
         <variable>PART</variable>
          '"$(PARTS "$DISK")"'
          <action>echo $DISK</action>
   </comboboxtext>
</vbox>
...

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
но не могу понять как это сделать
Для начала заменить строгие (одинарные) кавычки на простые (двойные).
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
но не могу понять как это сделать
Для начала заменить строгие (одинарные) кавычки на простые (двойные).
По теме это ничего не даст. Но тогда придется все " экранировать \"

Попробуйте так "'$PARTS' '$DISK'"
Возможно это #! /usr/bin/gtkdialog -e плохая идея - заменить на bash
В тяжелых случаях - сохранить переменную в /tmp/qwer и считывать

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
По теме это ничего не даст.
Неужели?
Но тогда придется все " экранировать \"
Не все, некоторые просто не понадобятся.
Попробуйте так "'$PARTS' '$DISK'"
И получите MAIN_DIALOG развалившийся на части. :D
Здесь похожее окно.
« Последнее редактирование: 23 Январь 2016, 09:49:03 от DdShurick »
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Вот мой пример с кавычками, переменными и
Код
export GUI="`echo "$XML" | sed -e 's/##.*//'`"
позволяющим комментировать строки xml ##
Этот скрипт активно юзается в ПРа

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Вот мой пример с кавычками, переменными и
Код
export GUI="`echo "$XML" | sed -e 's/##.*//'`"
Здесь первой кавычкой стоит двойная, а у топикстартёра одинарная, что доказывает мою правоту.
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Но XML='
доказывает мою правоту.
Я не особо вчитывался в скрипт.  Вариантов решения много. Просто рассказал что знаю по теме и приложил свой рабочий пример
« Последнее редактирование: 23 Январь 2016, 10:13:40 от sfs »

Оффлайн Shooshpanchik

  • Новичок
  • *
  • Сообщений: 12
  • Репутация: +0/-0
  • Автор темы
Спасибо, новичек я в этом деле, пробую всякие варианты
Зеленым - работает норм.
С красной пометкой проблема, сорри за нубство
Цитата
DISK1=sda
MAIN_DIALOG='

<window title="Windows Installator" icon-name="gtk-about" resizable="true" width-request="450" height-request="350">
<vbox>
<vbox>
<text><label>Диск </label></text>
   <comboboxtext case-sensitive="false" value-in-list="true">
         <variable>DISK</variable>
          '$(DISKS)'
          <action>DISK1=${DISK:0:3}</action>
          <action type="refresh">PART</action>
   </comboboxtext>
<text><label>Раздел</label></text>
   <comboboxtext case-sensitive="false" value-in-list="true">
         <variable>PART</variable>
          '$(PARTS $DISK1)'
          <action>echo $DISK</action>
   </comboboxtext>
</vbox>

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
Попробуйте <action>DISK1="'${DISK:0:3}'"</action> ну или через файл. Рабочий пример в аттаче

Оффлайн Shooshpanchik

  • Новичок
  • *
  • Сообщений: 12
  • Репутация: +0/-0
  • Автор темы
Толи IQ мой ниже среднего, толи коэффициент трения выше моих возможностей,
В консоль выводится только sda

Цитата
   DISK1="sda"
export MAIN_DIALOG='

<window title="Windows Installator" icon-name="gtk-about" resizable="true" width-request="450" height-request="350">
<vbox>
<vbox>
<text><label>Диск </label></text>
   <comboboxtext case-sensitive="false" value-in-list="true">
         <variable>DISK</variable>
          '$(DISKS)'
          <action>DISK1="sdb"</action>
          <action>echo '$DISK1'</action>

          <action type="refresh">PART</action>

Оффлайн Shooshpanchik

  • Новичок
  • *
  • Сообщений: 12
  • Репутация: +0/-0
  • Автор темы
Нафик все короче.
меняю на:
DISKS()
{
      lsblk -io KNAME,TYPE,SIZE,MODEL,FSTYPE | grep -v loop | while read line; do
      echo "<item>${line}</item>"
      done
}

и убираю второй комбобокс

Оффлайн Shooshpanchik

  • Новичок
  • *
  • Сообщений: 12
  • Репутация: +0/-0
  • Автор темы



Так даже красивее. А вот как сделать в нем моноширинный шрифт?
« Последнее редактирование: 23 Январь 2016, 14:07:21 от Shooshpanchik »

Оффлайн sfs

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 33965
  • Репутация: +231/-0
    • PuppyRus-A
На скрине gtkdialog gtk3?

Оффлайн Shooshpanchik

  • Новичок
  • *
  • Сообщений: 12
  • Репутация: +0/-0
  • Автор темы
На скрине есть окна Geany, окно терминала и окно с моей программой.
Все (кроме моей проги) взято из pra03-1512game,




Установил позавчера, и еще не врубился как копировать текст в буфер обмена из консоли.

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
не врубился как копировать текст в буфер обмена из консоли.
Выделить мышью, вставить клик средней кнопкой.
Код
# lsblk | awk '!/loop/ {print $1"\t"$4"\t"$6}'
NAME SIZE TYPE
sda 465,8G disk
├─sda1 10G part
├─sda2 1G part
├─sda3 444,8G part
└─sda4 10G part
sdb 3,7G disk
└─sdb1 3,7G part
sr0 1024M rom
??
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64