Рейтинг:0

Как разделить разные значения данных в списке и назначить переменные в сценарии оболочки?

флаг ca

Скажем, у меня есть список данных в сценарии оболочки как это:

СписокДанных = ["
Кот
Собака
Кролик
Морская свинка
Хомяк
"]

Теперь, как мне настроить каждое отдельное значение данных в списке как переменную? Как это:

$Value0 = "Кот"
$Valu1 = "Собака"
$Value2 = "Кролик"
$Value3 = "Морская свинка"
$Value4 = "Хомяк"

Для справки: я знаком с такими утилитами командной строки, как Grep, AWK и SED. Тем не менее, я не совсем уверен, с чего начать что-то вроде этого.

Кроме того, для справки, я предпочитаю оболочку Fish, однако не стесняйтесь отвечать в формате BASH или SH. Не волнуйся, я могу перевести.

Рейтинг:3
флаг ca

Не уверен, что вам нужно. это помогает?

#!/бин/баш
Список данных=(
Кот
Собака
Кролик
Морская свинка
Хомяк
)

для я в {0..4}
делать
    значение[$i]=${СписокДанных[$i]}
    эхо "значение[$i] = ${значение[$i]}"
сделано

выходы:

значение[0] = Кошка
значение[1] = Собака
значение[2] = Кролик
значение[3] = морская свинка
значение[4] = Хомяк
MissBrae avatar
флаг ca
Нет, это не помогает. Я искал способ разобрать строки в списке и добавить их в отдельные переменные. Я имел в виду то, что написал буквально. Я не хотел получать случайную строку из списка.
NotTheDr01ds avatar
флаг vn
@MissBrae Справедливости ради, похоже, что решение здесь должно быть легко расширено до вашего варианта использования. Если у вас есть фиксированное количество элементов (что, по-видимому, необходимо, если вы анализируете их в статические переменные), то вы можете легко следовать примеру @jpbrain с `$mem0 = $value[0]; $mem1= $значение[1]; и т. д. Я заменил «значение» на «мем», так как из других комментариев это звучит так, как будто вы пытаетесь проанализировать.
Рейтинг:1
флаг vn

Поскольку вы предпочитаете оболочку Fish, я предложу три варианта.

Во-первых, учитывая Список данных в строковом формате вы можете использовать разделение строки чтобы разделить отдельные строки на фактический список:

> установить список данных "
  Кот
  Собака
  Кролик
  Морская свинка
  Хомяк
  "

> установить --show DataList

$DataList: установлен в глобальной области видимости, неэкспортированный, с 1 элементом
$DataList[1]: |\nКошка\nСобака\nКролик\nМорская свинка\nХомячок\n|

> установить значение (разделить строку -n \n "$DataList")
> установить --показать значение

$Value: задано в глобальной области видимости, неэкспортировано, с 5 элементами.
$Value[1]: |Кот|
$Value[2]: |Собака|
$Value[3]: |Кролик|
$Value[4]: |Морская свинка|
$Value[5]: |Хомяк|

> эхо $значение[2]

Собака

^ Пустые строки в примере предназначены исключительно для удобочитаемости и не отображаются в фактическом выводе.

Но если вы можете, просто вставьте данные в виде литерала списка в сценарий и избегайте лишних действий. разделение строки:

> установить DataList "Кот" \
  "Собака" \
  "Кролик" \
  "Морская свинка" \
  "Хомяк"

> установить --show DataList

$DataList: набор в глобальной области видимости, неэкспортированный, с 5 элементами
$DataList[1]: |Кот|
$DataList[2]: |Собака|
$DataList[3]: |Кролик|
$DataList[4]: |Морская свинка|
$DataList[5]: |Хомяк|

> эхо $DataList[2]
Собака

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

установить список данных "
Кот
Собака
Кролик
Морская свинка
Хомяк
"

установить v (разделить строку -n \n "$DataList")

установить сценарий (для i in (seq (count $v))
             echo 'установить значение'(math $i-1) '"'$v[$i]'"'
           конец)

eval (объединение строк ";" $scrpt)
установить --стереть v
установить --erase скрипт

Результат:

$Value0 = "Кот"
$Value1 = "Собака"
$Value2 = "Кролик"
$Value3 = "Морская свинка"
$Value4 = "Хомяк"
MissBrae avatar
флаг ca
Спасибо! Последний именно то, что я хотел! Возможно, моя причина необходимости сделать это объяснила бы, почему. Я создал сценарий оболочки для отображения информации о системе, такой как модель процессора, количество памяти, модель системной платы, а также версии ОС и ядра. Я хотел добавить способ отображения точной конфигурации памяти, а не только количества, скорости и количества модулей. Например. Память: 16 ГБ (8 ГБ x 2). У меня уже есть функция, которая анализирует dmidecode и устанавливает количество памяти как $MemoryCount и количество модулей как $ModulesInstalled и $TotalModules. Теперь у меня есть с чего начать.
MissBrae avatar
флаг ca
Ну... похоже, он должен делать то, что я хотел. Но я продолжаю получать ошибки, когда пытаюсь запустить его. Я не так хорошо знаком с циклами for в Fish, поэтому сам не смог отладить: ~/.local/ubin/test.fish (строка 13): Неожиданный конец строки, кавычки не сбалансированы. in (seq (количество $v)) echo 'установить значение''(math $i-1) '"'$v[$i]'"' конец) eval (объединение строк ";" $scrpt) установить --erase v сценарий ^ рыба: ошибка при чтении файла /home/braelin/.local/ubin/test.fish
NotTheDr01ds avatar
флаг vn
@MissBrae Ах да, если это анализ записей, то это имеет смысл. Но, вероятно, лучше опубликовать что-то более похожее на «реальные данные», которые вы используете. Скрипт мог быть и проще. Проблема с кавычками была моей ошибкой - я ее исправил. Обратите внимание, что Fish достаточно хорош, чтобы выделить дополнительную цитату (по крайней мере, строку) с проблемой, если вы вставите ее по запросу.
MissBrae avatar
флаг ca
Еще раз спасибо, за исправление! Я сделал свое собственное редактирование... кажется, что команда set --erase ожидает только 1 аргумент и не более, поэтому я разделил его на две строки. Теперь все работает как описано! Я буду иметь это в виду, чтобы не просто вопрос. Возможно, я получил бы лучшие ответы, если бы изложил свою настоящую проблему. Теперь... приступим к добавлению в мой скрипт сбора системной информации!
NotTheDr01ds avatar
флаг vn
@MissBrae Похоже, что `set --erase` с несколькими значениями является довольно недавней версией Fish 3.2. Не забудьте принять ответ - Спасибо!
Рейтинг:0
флаг it

Я бы сохранил значения в списке, разделенном двоеточием, и использовал «Функции пути Bash» Стивена Коллиера и вырезать -d: -f3 или похожие.

Вот мой предварительно написанный блоб:

Я использую bash_path_funcs Стивена Коллиера, описанную в Linux Journal еще в 2000 году:

https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/3768 https://www.linuxjournal.com/article/3935

путь добавления Функция добавляет запись в путь только в том случае, если ее там изначально нет. delpath -n удаляет все несуществующие каталоги из пути.

Вы можете получить pathfunc.tgz файл из https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

Ответить или комментировать

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