Могу ли я сравнить параметр сценария с массивом переменных и обработать его?

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

К сожалению, пока gparted правильно идентифицировал мои папки и файлы и определил структуру моего диска, он просто сообщил о несоответствиях в таблице разделов, но не исправил их. В разделе «Устройства» предлагалось выполнить спасение данных, но оказалось, что для этого нужно установить gpart. Его нет на LiveCD, и в ограниченном количестве репозиториев, разрешенных на LiveCD, его нет. Чтобы попасть куда угодно, вам нужно выполнить полную установку с обновлениями.

Но вы не устанавливаете дату установки на поврежденный диск без полной перестройки. Итак,

я выбрал / dev / sdb1 как root и убедился, что было выбрано что-то еще, кроме раздела подкачки на съемном диске. Программа установки предполагает, что можно использовать любые существующие разделы подкачки, но на поврежденном диске это опасное предположение. Установка прошла хорошо, но я отказался от своего старого дистрибутива и выбрал UbuntuGnome 16.04 вместо него. Я хотел выделить старый дистрибутив как причину своих проблем, но был почти уверен

Установка прошла гладко, но все было по-другому. Пару часов с ним собрали меня, он мне понравился гораздо больше, чем мой старый дистрибутив. Itg был немного сыроват и имел некоторые глючные детали, но в целом он был более чем приличным.Мне не нравилось, что в нем был только Firefox в качестве браузера, и на нем не было gpart, parted или других инструментов восстановления, но, глядя на нижнюю часть DVD-диска, он имел примерно в два раза больше связанного программного обеспечения, чем мой старый дистрибутив , так что это было хорошо.

Решив не возвращаться к своему старому дистрибутиву и посчитав неудобным работать с LiveCD, я решил выполнить вторую установку во второй новый раздел. в обеих установках у меня был процесс загрузки на / dev / sdb, а не на / dev / sda, который используется по умолчанию. / dev / sda был поврежден, поэтому запись в него не производится, пока я не скопирую свои учетные записи в / home. Иначе я могу случайно испортить его хуже. Каждый раз, когда вы выполняете новую установку или запускаете update0grup в терминале, текущая установка становится основной. Теперь я был готов загрузить съемный диск. Ранее я удалил все, кроме / home, на двух из трех разделов на / dev / sda. С LiveCD у вас должна быть возможность монтировать разделы, затем вы используете терминал и вводите следующие команды:

    sudo su root
    cd /m*/*/*/home

Первая команда дает вам идентификатор root и постоянное питание, пока вы находитесь в этом сеансе терминала, без тайм-аутов. Но при этом остаются $ HOME и $ USER. Однако "~" заменяется на / root. Вы можете выйти из корневого каталога, набрав «exit» или выполнив «su» для другого идентификатора.

Вторую команду, возможно, придется изменить. Это позволяет смонтировать раздел либо в / mnt, либо в / media, либо в любую другую папку, начинающуюся с «m». Обычно это единственные два в системе Linux. Но даже без «m» команда будет успешной только в том случае, если есть «домашняя» папка на двух уровнях.Если это не диск с «домом», выберите имя папки на разделе, чтобы помочь. Если вы не знаете, что находится в разделе, вы можете использовать эту последовательность команд, чтобы получить большую часть пути к нему:

   cd /m*/$USER; dir *; dir */

Скорее всего, это приведет к прокрутке вне поля зрения. Для прокрутки вверх или вниз удерживайте клавиши Ctrl + Shift и используйте клавиши со стрелками вверх и вниз. Определите раздел, к которому вы хотите перейти, и сделайте следующее: «cd». Опять же, вам нужно ввести только часть того, что есть, используя *, чтобы заполнить остальное.

Поскольку мы здесь, чтобы сохранить учетные записи пользователей и устранить все остальное, я предполагаю, что вы использовали «дом», теперь он находится в правом разделе. Фактически, вы сейчас находитесь в ... / доме. Итак, все, что мы хотим удалить, - это один слой назад. Мы идентифицируем текущий уровень только с точкой (.) И один уровень назад с двумя точками (..). Теперь «home» - единственная папка на этом уровне, которая начинается с «h», и это упрощает нашу работу:

    rm -r ../[!h]*

Эта команда рекурсивно удаляет все, что не начинается с «h», на один уровень назад. Это включает в себя файлы и папки, а с -r это означает, что находится в этих папках, независимо от того, есть ли в их именах буква «h» или нет. Вот и все. Теперь вы хотите попытаться получить данные, если это возможно. Но для этого мне нужен gpart, а это означало загрузку одного из двух недавно установленных разделов. Итак, я набрал «перезагрузить сейчас» и выполнил процесс перезапуска.

Это произошло, как и планировалось, но после установки некоторого необходимого и желаемого программного обеспечения через окно терминала с помощью apt-get и некоторых других команд я решил пойти дальше и изменить / etc / sudoers с помощью этой команды:

    sudo echo $USER '    ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers

См. на самом деле нет необходимости редактировать файл, если вы просто собираетесь что-то добавить к нему. Это поможет. Теперь, когда я использую «sudo», меня не спрашивают пароль.

Сделав это, я подумал, как мне получить данные. Был gpart,который сделал хорошую работу, сделав 2 из моих 3 разделов снова доступными для чтения, когда он был вызван gparted. С аргументом -w он может запросить то, что он прочитал, в другое место, но он, вероятно, перезапишет то, что уже было там. rsync допускает синхронизацию с включениями и исключениями там, где вы храните новейшие, но то же самое делает "cp -purf" без преимуществ включения и исключения. Но было не так много исключений, о которых можно было бы беспокоиться, кроме мусора. И был ddrescue, и я даже не изучил содержимое нескольких ISO-образов аварийного диска, которые я скачал. В любом случае я не был заинтересован в спасении поврежденного диска, я просто получил данные, если это возможно, и начал все сначала.

Затем при моей новой установке возникли проблемы с разделами. Теперь я точно знал, что это произошло по одной из двух причин: либо ext4 waa bad, либо swap. Это были единственные два типа разделов, которые я использовал в течение долгого-долгого времени. Все остальное изменилось, но это были две константы, я не знал, что делать со свопом, но он существует уже давно, и его роль достаточно проста, поэтому это был маловероятный кандидат. Скорее всего, это был ext4, и я мог его изменить.

Я начал со съемного диска с LiveCD и gparted. О решил, что могу отказаться от версии и попробовать ext3. Пробираясь обратно, он разбомбил хуже, чем ext4. fsck сообщил мне, что ext4 обрабатывает ext3 и обнаруживает невероятное количество ошибок на только что отформатированном диске на новом диске, который был признан чистым.Получается, нет отдельного ext? форматировать больше, и единственный способ получить старую копию ext4 - это использовать старый LiveCD. Вам придется вернуться на год или больше, и это может помочь при установке, но первое обновление заменит его версией, которая окажется дефектной.

Открывал ли я отчет об ошибке? Нет, и я не собираюсь этого делать. Во-первых, это мой личный опыт, я не могу говорить ни за кого другого. То, что это произошло на 4 ПК и шести жестких дисках, могло быть просто совпадением или отражать плохое сочетание программного обеспечения. верно? Это требует подтверждения, поэтому, если вам тоже не повезло, и вы используете ext4, об этом, возможно, стоит поговорить.

Во-вторых, мне надоели сайты, которые возлагают бремя доказательств на пользователя или ограничивают темы и публикации своим представлением о том, что необходимо. Не все хорошее получается по шаблону. Если есть ошибка, им нужно разобраться в ней самостоятельно. Не надевайте на меня указание пальцем на конкретную упаковку или комбинацию и не говорите: «Вот она! Я нашла для вас!». Это не моя роль здесь. Я просто пользователь, а не сопровождающий или разработчик.

Тем не менее, мне нужно было выбрать другую структуру для своих разделов, но какую? Я искал в Интернете, но это небольшая тема, и каждый оставляет ее на усмотрение. Затем я рассмотрел варианты gparted и установщика, когда вы используете «Что-то еще». Они не согласны. Есть, конечно, матчи, но их не так много. Вы сразу теряете варианты ext2, ext3, и ext4, но вам также нужно исключить FAT16, FAT32 и NTFS.Я не буду объяснять почему, просто не выбирайте их, если вам это действительно не нужно для совместимости с Windows или DOS. Что ж, я объясню вкратце: FAT16 bis слишком ограничен, лучше всего подходит для дискет, FAT32 слаб, а NTFS ошибочна и не имеет хорошего инструмента восстановления ни на стороне Windows, ни на Linux.

Вместо того, чтобы снова делать ставку на один тип раздела, я решаю использовать как минимум два. Перекрытие между gparted и установщиком было 3m, и я выбрал jfs и xfs. Я сделал их оба, по одному на раздел, и пока никаких проблем.

Что касается восстановления данных, 3-й раздел полностью пропал. Запись в таблице разделов для свопа, 4-го раздела, подскочила с примерно 6 ГБ до примерно 58 ГБ, отображая значительную часть 3-го раздела. В любом случае это было в значительной степени избыточным, так как я хранил там вещи, но у меня не было реального времени, чтобы его использовать.

Я решил просто использовать "cp -purf. Если бы папки и файлы были неповрежденными, я бы достал их достаточно легко. Но они мне все равно не нужны. Я бы восстановил / dev / sda1 / * в / dev / sdb1 / и / dev / sda2 / * tp dev / sdb2 /. Я сделал еще один шаг: я установил / dev / sda1 и / dev / sda2 как только для чтения. Я не собирался рисковать операцией записи идет плохо. Звучит совершенно маловероятно, но в последние месяцы у меня было много плохих вещей, и становилось все хуже. Могу я освободиться от этого сейчас.

О, команды, которые использовались на самом деле:

    dir /mnt
    sudo -i
    mkdir /mnt/sda1
    mkdir /mnt/sda2
    mkdir /mnt/sda3
    sudo mount -o ro /dev/sda1 /mnt/sda1
    sudo mount -o ro /dev/sda2 /mnt/sda2
    sudo mount -o ro /dev/sda3 /mnt/sda3
    dir /mnt/sda1
    home  hope
    dir /mnt/sda2
    hold  home
    dir /mnt/sda3
    lost+found
    dir /mnt/sda3/lost+found
    mkdir /mnt/hold1
    cp -rfup /mnt/sda1/home/* /media/$USER/sdb1/home/; cp -rfup /mnt/sda2/hold/* /media/$USER/sda1/home/; cp -rfup /mnt/sda2/home/* /media/$USER/sdb2/home/; cp -rfup /mnt/sda2/hope/* /media/$USER/sda2/home/

] Используя эту технику, я объединил 2 папки на / dev / sda1 в одну папку на / dev / sdb1 и проделал то же самое с двумя другими разделами. Теперь я начну с / dev / sda и заставлю gparted работать. опять таки.Гораздо быстрее и тщательнее, чем пытаться восстановить поврежденный диск, что в лучшем случае является неопределенным предложением.

0
09.02.2016, 19:05
3 ответа

В представленном вами сценарии: $ 1 содержит имя параметр, а массив $ содержит значения параметров. Чтобы получить результат в переменной $ ans , расширенной по запросу, есть несколько вариантов:

Eval

eval: развернуть $ 1 до Sigil , например, и присвоить $ Sigil ans:

eval ans\=\"\$\{"$1"\}\"

Однако это предполагает, что $ 1 - это однословная метка переменной. Если на входе есть другое содержимое, возможно, он будет оценен eval. Более надежное решение eval - использовать вместо него $ {array [i]} , поскольку содержимое массива контролируется сценарием.

Косвенное обращение

Ближайшая идиома в bash - $ {! 1} . То есть получить значение var, указанное $ 1 , именно то, что нам нужно.Опять же, более надежно с $ {array [i]} (как только будет найдено соответствие $ array [i] :

a="array[i]"; ans="${!a}"

Associative Array

Но все проблемы с eval и косвенного обращения можно было бы избежать, если бы мы использовали ассоциативный массив как для ключей массива, так и для значений массива.

Тогда легко найти правильное значение, если в массиве есть значение, это допустимое значение. Если массив не имеет значения для ключа, ключ недействителен.

Полный сценарий, основанный на этой концепции, может выглядеть следующим образом:

#!/bin/bash

[ $# -lt 1 ] && {  echo "This script needs at least one parameter!"; exit 1; }

declare -A a
    a=(
    [Sigil]="https://github.com/Sigil-Ebook/Sigil.git"
    [wp2epub]="https://github.com/mattharrison/epub-css-starter-kit.git"
    [csskit]="https://github.com/mrallen1/wp2md.git"
    )


### Process an error while informing of options.
for    val in "${!a[@]}"
do     d=$d${d:+", "}$last
       last=$val
done
d="Please inform one of $d or $last"
SayError(){ echo "$d" >&2; exit 1; }



### Process a valid command execution.
ExecCmd(){ git clone "$ans"; }



### Process all arguments of script.
for    arg
do     unset ans                          ### unset result variable.
       printf -v ans '%s' "${a[$arg]}"    ### Assign result to "$ans"
       ${ans:+:} SayError                 ### If "$ans" is empty, process error.
       ${ans:+false} || ExecCmd           ### With valid "$ans" execute command.
done

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

0
29.04.2021, 00:18
arr=($url1 $url2 $url3)

for i in ${arr[@]}; do
  if [[ $i == $1 ]] ;then
    ans=$i
    break
  fi
done
0
29.04.2021, 00:18

Используйте ассоциативный массив:

#!/bin/bash

declare -A url
url=( [url1]="http://www.google.com"
      [url2]="http://www.yahoo.com"
      [url3]="http://www.bing.com"
    )

if [[ -z $1 ]] ; then
    echo "This script needs at least one parameter!"
    exit 1
elif [[ -z ${url[$1]} ]] ; then
    echo 'Unknown option'
    exit 1
fi

echo "Let's search ${url[$1]}."
2
29.04.2021, 00:18

Теги

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