LINUX.ORG.RU

Укротить лапшу в bash-скрипте

 


0

3

Редко пишу что-то на bash. Вот скрипт-хелпер, который создает, монтирует и удаляет read-only снапшоты для LVM. Вроде же мелочь. Почему скрипт получается такой большой?

Можно сделать его более лаконичным?

#!/bin/bash

function printUsage() {
    echo -e "Usage:\n`basename "$0"` <VG> <LV>"
    exit 1
}

function removeSnapshot() {
    mountpoint -q $MOUNT_DIR_SNAPSHOT;
    IS_MOUNTED=$?

    if [ $IS_MOUNTED -eq 0 ];
    then
        umount $MOUNT_DIR_SNAPSHOT || return 1
    fi
    lvremove -f $LV_SNAPSHOT_PATH || return 1
    return 0
}

if [[ "$#" -ne 3 ]]; then
    printUsage
fi

ACTION=$1
VG=$2
LV=$3

LV_PATH="/dev/$VG/$LV"
echo $LV_PATH
LV_SNAPSHOT="${LV}_snapshot_ro";
LV_SNAPSHOT_PATH="/dev/$VG/$LV_SNAPSHOT";
MOUNT_DIR_SNAPSHOT="/mnt/$VG-$LV_SNAPSHOT";

case $ACTION in
    create)
        mkdir -p $MOUNT_DIR_SNAPSHOT || exit 1

        if [ -e $LV_SNAPSHOT_PATH ]
        then
            removeSnapshot || exit 1
        fi

        # read-only snapshot
        lvcreate -s -p r -n $LV_SNAPSHOT -L 4G $LV_PATH &&
        mount -o ro $LV_SNAPSHOT_PATH $MOUNT_DIR_SNAPSHOT || exit 1
        ;;

    remove)
        removeSnapshot || exit 1
        ;;

    *)
        printUsage
        ;;
esac

exit 0;
★★★★★

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

Зачем тебе экономить на читабельности? Жалко символов? Если да, ты скажи я тебе отсыплю: aaaaaaaaaaaabbbbbbbbbbbbbbbcccccccccc....

   mountpoint -q $MOUNT_DIR_SNAPSHOT;
    IS_MOUNTED=$?

    if [ $IS_MOUNTED -eq 0 ];

######### заменяетса на ################

if mountpoint -q $MOUNT_DIR_SNAPSHOT; then

anonymous
()
Ответ на: комментарий от anonymous

Зачем тебе экономить на читабельности? Жалко символов?

Наоборот, я не хочу экономить на читабельности. Лаконичный и понятный код читабельнее лапши. Твой пример наглядно показывает это. Спасибо.

Chaser_Andrey ★★★★★
() автор топика

ради поржать в тупую сократил всё что на глаза попалось, за работоспособность и урон моску и глазам не ручаюсь

#!/bin/bash
printUsage(){ echo -e "Usage:\n`basename "$0"` <VG> <LV>";exit 1;}

removeSnapshot(){
  mountpoint -q $MOUNT_DIR_SNAPSHOT||
    umount $MOUNT_DIR_SNAPSHOT ||exit 1

  lvremove -f $LV_SNAPSHOT_PATH ||exit 1;}

[[ $# -ne 3 ]]&& printUsage

ACTION=$1
VG=$2
LV=$3
LV_PATH="/dev/$VG/$LV"
LV_SNAPSHOT="${LV}_snapshot_ro";
LV_SNAPSHOT_PATH="/dev/$VG/$LV_SNAPSHOT";
MOUNT_DIR_SNAPSHOT="/mnt/$VG-$LV_SNAPSHOT";
echo $LV_PATH

case $ACTION in
create)
  mkdir -p $MOUNT_DIR_SNAPSHOT ||exit 1

  [ -e $LV_SNAPSHOT_PATH ]&& removeSnapshot

  lvcreate -s -pr -n $LV_SNAPSHOT -L 4G $LV_PATH&&
    mount -o ro $LV_SNAPSHOT_PATH $MOUNT_DIR_SNAPSHOT ||exit 1
  ;;
remove)removeSnapshot;;
*)printUsage;;
esac

anonymous
()

Вот вам на java ) Но это пока прототип, над которым я работаю, но примерно так на нем можно будет делать автоматизации и различные утилиты. К тому же стартует оно по особому, почти как нативное апп, на порядки быстрее запуска обычных JAR-ов на JVM.

final class xlvm {
    Path MOUNT_DIR_SNAPSHOT;
  
    @Argument
    String vg;

    @Argument
    String lv;

    {
        LV_PATH = Paths.get("/dev", vg, lv);
        xansi(LV_PATH);

        LV_SNAPSHOT = format("%s_snapshot_ro", lv);
        LV_SNAPSHOT_PATH = Paths.get("/dev", vg, LV_SNAPSHOT);
        MOUNT_DIR_SNAPSHOT = Paths.get("/mnt", format("%s-%s", vg, LV_SNAPSHOT));
    }

    @Option
    boolean create() {
        try {
            createDirectories(MOUNT_DIR_SNAPSHOT);
        } catch (IOException e) {
            throw fatal("Can't create directories: %s", MOUNT_DIR_SNAPSHOT);
        }

        if (exists(LV_SNAPSHOT_PATH) && !remove())
            throw fatal("Can't remove %s", LV_SNAPSHOT_PATH);

        boolean isCreated = $$("lvcreate -s -p r -n %s -L 4G %s && mount -o ro %s %s", LV_SNAPSHOT, LV_PATH, 
             LV_SNAPSHOT_PATH, MOUNT_DIR_SNAPSHOT);

        if (!isCreated)
           throw fatal("Can't create lvm snapshot");
    }

    @Option
    boolean remove() {
        boolean isMounted = $$("mountpoint -q %s", MOUNT_DIR_SNAPSHOT);

        if (isMounted)
            return $$("umount %s", MOUNT_DIR_SNAPSHOT);

        return $$("lvremove -f %s", LV_SNAPSHOT_PATH);
    }
}
foror ★★★★★
()

склоняюсь все больше к мысли, тонко прочувствовав грань, писать реализации, чуть более сложные, уже на python-е

anonymous
()

Так лучше?

#!/bin/bash -e

test "$#" = 3 || set -- help - -
ACTION=$1
VG=$2
LV=$3

LV_PATH="/dev/$VG/$LV"
LV_SNAPSHOT="${LV}_snapshot_ro";
LV_SNAPSHOT_PATH="/dev/$VG/$LV_SNAPSHOT";
MOUNT_DIR_SNAPSHOT="/mnt/$VG-$LV_SNAPSHOT";

case $ACTION in
    create)
        $0 remove $VG $LV
        lvcreate -s -p r -n $LV_SNAPSHOT -L 4G $LV_PATH
        test -d $MOUNT_DIR_SNAPSHOT || mkdir -p "$_"
        mount -o ro $LV_SNAPSHOT_PATH $MOUNT_DIR_SNAPSHOT
        ;;
    remove)
            ! mountpoint -q $MOUNT_DIR_SNAPSHOT || umount $_
            ! test -e $LV_SNAPSHOT_PATH || lvremove -f "$_"
        ;;
    *)
        ! echo -e "Usage:\n`basename "$0"` <VG> <LV>"
        ;;
esac
DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.