Печать значений в сценарии Array Bash

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

lsblk

Вы можете определить файловую систему с помощью опции -f:

lsblk -f

Определите запоминающее устройство, соответствующее вашей Windows.

Создайте каталог для доступа к содержимому раздела или диска Windows:

sudo mkdir /media/windows

Затем вы должны смонтировать раздел, выполнив что-то похожее на следующее:

sudo mount /dev/sda3 /media/windows

Где sda3 — это раздел, который в вашем случае может быть другим, а /media/windows — это точка монтирования, которую мы только что создали.

Если вы столкнулись с проблемой, попробуйте использовать явные параметры:

Сначала вам нужно подтвердить свой идентификатор с помощью команды id:

id

Тогда можно было бы сделать что-то вроде:

sudo mount -t ntfs-3g -o uid=1000,gid=1000,dmask=002,fmask=111 /dev/sda3 /media/windows

Это временное решение. Если вы хотите автоматически монтировать вашу файловую систему при загрузке системы, вы должны изменить файл:

/etc/fstab

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

-1
27.01.2021, 11:03
1 ответ

Есть несколько проблем с вашим кодом.

  • Первое, что нужно помнить, это то, что, поскольку ваша awkпрограмма заключена в одинарные кавычки (, что рекомендуется ), расширения параметров оболочки не происходит, и ваше выражение print $[i]не будет работать. См. этот исчерпывающий вопрос и ответ на StackOverflow о том, как использовать параметр оболочки в awkпрограммах.
  • Тем не менее, поле awk, номер которого хранится в переменной(awk)n, будет адресоваться через $n, а не $[n].
  • Вы присваиваете переменным val1значение val4, но фактически никогда их не используете, поэтому первая часть вашего примера скрипта ничего не делает.
  • Наконец, чтобы разыменовать переменную массива, вы должны указать ${val[i]}, а не $val[i](, что напечатает содержимое переменной$val-пустую строку -, за которой следует фиксированная строка[i]).

Есть также несколько неэффективных действий, таких как повторный вызов awkи (, насколько я могу судить )неспособность решить проблему ведущего Threadв вашем примере ввода при использовании только /в качестве разделителя полей.

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

#!/bin/bash

val=( $(awk '/^Thread/{n=split($2,a,/\//); for (i=1;i<=n;i++) printf("%s%s",a[i],OFS)}' Threadout.txt) )

for i in ${!val[@]}
do
    echo "${val[i]}"
done
  • Вызов awkразделит второе «поле» строки Thread 1/1/25/100, а именно часть 1/1/25/100в /на массив aи напечатает все элементы массива, разделенные символом OFS(, который по умолчанию равен пробелу ).
  • Сценарий оболочки возьмет выходные данные этой awkпрограммы и -, поскольку это список токенов, -разделенных пробелами, -назначит отдельные токены переменной массива valчерез val=( ... )утверждение.
  • Затем он перебирает индексы массива и печатает значения массива.

Вы можете прочитать о массивах bash немного подробнее в GNU Bash Reference Manual или GreyCat&Lhunath's Bash Guide . Я бы также рекомендовал вам взглянуть на shellcheck для отладки сценариев оболочки.

4
18.03.2021, 22:34

Теги

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