Запрашивать у пользователя тип файла в цикле while

Comprobar el sistema de archivos:

e2fsck -f /dev/mapper/vg_livecd-lv_home

mejor hacer resize/home en lugar deremove

Siga los pasos:

Step:1 Umount the file system
# umount /home/

Step:2 check the file system for Errors using e2fsck command.
# e2fsck -f /dev/mapper/vg_livecd-lv_home

Step:3 Reduce or Shrink the size of /home to required size.
# resize2fs /dev/mapper/vg_livecd-lv_home 50G

Step:4 Reduce the size using lvreduce command.
# lvreduce -L 50G /dev/mapper/vg_livecd-lv_home 

Step:5 Check the filesystem before mount
# e2fsck -f /dev/mapper/vg_livecd-lv_home

Step:6 Mount the file system and verify its size.
# mount /home

-> Pasos para aumentar LVM:

Step1: Check the free available space in the Volume group
#  vgdisplay < Volume-Group-Name>

Step2: Increase the size using Lvextend command
# lvextend -L +120G /dev/mapper/vg_livecd-lv_root

Step:3 Run the resize2fs command
# resize2fs /dev/mapper/vg_livecd-lv_root 

Step:4 Verify Size
# df -Th
0
05.06.2019, 18:52
4 ответа

Было опубликовано более элегантное решение, но я думаю, что важно указать на некоторые ошибки, из-за которых исходный скрипт не работает, и как их исправить.

Во-первых, когда вы проверяете переменную package1в цикле while, вам нужно поместить $перед ней, чтобы считать фактические данные, хранящиеся в этой переменной.

Затем используйте [[...]]вместо [...]в тесте цикла while, так как это позволяет вам выполнять сопоставление с образцом, используя подстановочный знак *. Однако это работает только в bash, а не в sh. См. этот ответ для подробного объяснения использования [[...]]по сравнению с [...].

Наконец, вам не нужно передавать строку <<< package1в конце цикла while.

Вот модифицированная версия вашего скрипта, которая работает так, как задумано.

#!/bin/bash

read -p "Enter zip file: " package1
while [[ "$package1" != *.zip ]]; do
    read -p "Please enter file ending in '.zip': " package1
    done 
echo $package1
2
28.01.2020, 02:15

Сделайте это логически проще, исследуя только финальное расширение:

while [ "${package1##*.}" != "zip" ]
do
    read -e -p "Specify a.zip file: " package1
done
echo $package1
2
28.01.2020, 02:15

Если вы хотите, чтобы пользователь выбирал один из существующих файлов, я бы использовал selectвместо read, чтобы позволить пользователю выбирать из списка, вместо того, чтобы писать имя файла, которое он может точно не знать.

select package1 in *.zip; do
    break;
done
echo "$package1"

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

0
28.01.2020, 02:15

Никогда не заставляйте пользователя вводить пути к файлам в интерактивном режиме. Им будет проще вызывать ваш сценарий, используя пути к файлам Zip-архивов в командной строке сценария. Это позволяет им использовать средство завершения имени файла и шаблоны подстановки имен файлов в оболочке.

Сценарий будет вызываться с использованием, например,.

./myscript /some/path/myarchive.zip

или

./myscript folder/archive-*.zip

или аналогичный.

В сценарии вы бы сделали

#!/bin/bash

for archive_path do
    printf 'Processing archive "%s"...\n' "$archive_path"

   # code to process "$archive_path" goes here
done

Цикл в скрипте будет перебирать все аргументы, переданные в скрипт, и на каждой итерации "$archive_path"будет путем к отдельному архиву, переданному в скрипт.

Нет необходимости проверять, заканчивается ли имя файла "$archive_path"какой-либо конкретной строкой, поскольку инструменты, которые вы будете использовать для работы с архивом, могут даже не учитывать суффикс имени файла. Если они это сделают, то они потерпят неудачу с соответствующим кодом выхода, который вы легко можете перехватить :

.
if ! unzip "$archive_path"; then
    printf 'Failed to run unzip on "%s"\n' "$archive_path" >&2
    exit 1
fi

Если вы используете set -eв скрипте (, вероятно, в качестве его первого оператора ), он будет автоматически завершаться, когда любая команда (, которая не является частью условного оператора ), возвращается с не -нулевой код выхода.

set -e

# The following would terminate the script if it failed:
unzip "$archive_path"

Относительно добавленного вами «редактировать» :То, что вы здесь делаете, — это внедрение инструмента просмотра файлов или файлового менеджера для выбора Zip-архивов. В зависимости от того, для чего вы на самом деле хотите использовать этот код, это может оказаться излишним.

1
28.01.2020, 02:15

Теги

Похожие вопросы