LINUX.ORG.RU

Помогите написать bash-скрипт

 ,


0

1

Всем привет. Сразу оговорюсь, я не айтишник, я музыкант, поэтому многое из того что для вас просто, для меня - темный лес. Теперь к делу. У меня есть скрипт с esac, который в зависимости от расширения файла выполняет над ним ту или иную команду. tar для архивов, mplayer для видосиков и т.д. Использую как пейджер в mc. Но для файлов *.imd у меня есть два действия, fuseiso и kpartx, сейчас я просто ручками перед монтированием коменчу ту или другую строку, а надо автоматизировать этот момент. Идея такая: в базовом скрипте на *.img я укажу выполнить другой скрипт, который должен дать мне выбор, если я нажму 1 - выполнить fuseiso, если нажму 2 - kpartx. И вот как это сделать, ума не приложу. Из того, что удалось нагуглить, есть команда read, у меня получается сделать так, чтобы скрипт ожидал ввода единицы или двойки, но за этим ничего не следует! Как сделать, чтобы работало? Подскажите, пожалуйста, или киньте ссылку на хороший ликбез.

UPD

Я опять справился сам)

Заработало в итоге вот так (я подредактировал код из примера, поэтому такие переменные):

#!/bin/bash

asksure() {
echo -n "fuseiso 1 kpartx 2 "
while read -r -n 1 -s answer; do
  if [[ $answer = ["12"] ]]; then
    [[ $answer = ["1"] ]] && retval=0
    [[ $answer = ["2"] ]] && retval=1
    break
  fi
done

echo # just a final linefeed, optics...

return $retval
}

### using it
if asksure; then
  fuseiso "$1" ~/mnt
else
  sudo kpartx -av "$1" && sudo mount /dev/mapper/loop0p1 ~/mnt2 && cp -rv ~/mnt2/* ~/mnt && sudo umount ~/mnt2 &
& sudo kpartx -ad "$1"
fi

И мне теперь интересно, насколько это все лютый костыль, и можно ли было сделать по другому?

★★★

Последнее исправление: Dog (всего исправлений: 1)

Костыль или нет, но выглядит монструозно.

Например, «case» вместо «if»:

case ${answer} in
  2) retval='1';;
  *) retval='0';;
esac

Легко и понятно можно добавить проверку других значений.

andytux ★★★★★
()

А если mc, то все можно сделать без лишних скриптов, силами «user menu».

Например. Настроить «условия видимости», чтобы для «*.IMD» показывал команду «fuseiso», а для «*.imd» - «kpartx».

Вместо read использовать встроенный в mc макрос (код для «user menu»):

answer=%{Enter: fuseiso=1 kpartx=2}
case ${answer} in
...
andytux ★★★★★
()
Ответ на: комментарий от andytux

Спасибо, попробую. Про mc не знал, что так можно, но вариант с регистрами не годится, потому что монтирую рандомные .img файлы, и моим способом независимо от регистра будет диалог, а какой вариант сработает с каким .img вообще узнать можно только опытным путем.

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

Здесь есть пара примеров mount-umount. В частности, для образа memtest там пришлось помудрить.

andytux ★★★★★
()
Последнее исправление: andytux (всего исправлений: 1)

#!/usr/bin/env bash

asksure() {
  local r retval=127
  select r in fuseiso kpartx; do  [[ $r ]] && { retval=$REPLY; break; }; done
  return $retval
}

asksure
case $? in 
  1) fuseiso "$1" ~/mnt;;
  2) sudo kpartx -av "$1" && sudo mount /dev/mapper/loop0p1 ~/mnt2 && cp -rv ~/mnt2/* ~/mnt && sudo umount ~/mnt2 && sudo kpartx -ad "$1";;
esac
vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.