В то время как bash
, как и все оболочки POSIX, поддерживают добавление шестнадцатеричных чисел с
printf '%x\n' "$((0xfff + 0xaaa))"
(см.:Как добавить два шестнадцатеричных числа в сценарий bash)
Это в лучшем случае ограничено 64-битными целыми числами.
Для таких больших чисел можно использоватьbc
:
{
echo obase=16
echo ibase=16
echo 436389bdc34dd718c7959db8d6df16967f2b9895e515da45fb09136183a7a9e2 +\
1f0c45bbe9bc71a862f0d9672d056d2d741719a2b2d46ea6b269931d0b57674f |
LC_ALL=C tr a-f A-F
} | BC_LINE_LENGTH=0 bc
BC_LINE_LENGTH=0
избегает переноса строки с реализацией GNU bc
. В других реализациях вместо этого вы можете использовать канал sed 'N;s/\\\n//'
.
Или GNU awk
с -M
(, если построен с поддержкой арифметики произвольной точности):
$ gawk -M 'BEGIN{printf "%x\n", \
0x436389bdc34dd718c7959db8d6df16967f2b9895e515da45fb09136183a7a9e2 + \
0x1f0c45bbe9bc71a862f0d9672d056d2d741719a2b2d46ea6b269931d0b57674f}'
626fcf79ad0a48c12a86772003e483c3f342b23897ea48ecad72a67e8eff1131%
Ответ на ваш вопрос в некоторой степени зависит от того, какой механизм будет использоваться для запуска скрипта.
Предположим, что сценарий вызывается из какой-либо программы резервного копирования, которая не вызывается немедленно при подключении USB-устройства (, как это было бы в случае, если вы запускаете его из правила udev , для например ), то вы можете использовать udevadm info
для сбора всей необходимой информации.
Идея была бы следующей:
udevadm info --query=all /dev/sdX
на каждый, вы можете определить, какой из них является USB-накопителем, потому что вывод будет иметь одну строку с указанием E: ID_BUS=usb
E: ID_MODEL=Flash_Disk
<... >
E: ID_VENDOR=Generic
Поэтому, проанализировав вывод udevadm
с помощью grep
или аналогичного, вы сможете собрать всю необходимую информацию для своих целей.