Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/33: Рейтинг темы: голосов - 33, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 38
1

Как присвоить переменной bash значение, считанное с диска

19.05.2012, 13:38. Показов 6396. Ответов 11
Метки нет (Все метки)

Попробую так:
Код
SIGN=$(dd if=/dev/hda skip 446 bs=1 count=1)
Просмотр значения переменной с помощью
Код
echo "$SIGN"
показывает пустоту (наверное, нужно какое-то преобразование типов, но в bash насколько я знаю типов как в Си нет)

Поэтому сделал так:
Код
echo "$SIGN" > SIGN.bin
Однако несмотря на то, что считывается только один байт, после считанного (считанных) байтов прибавляется 0А. И по всей видимости, значение инициализируется некорректно, потому что if [ $SIGN -eq 128 ] ... воспринимается интерпретатором как ошибка.

Как присвоить значение переменной, чтобы можно было потом его анализировать в скрипте?
0

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2012, 13:38
Ответы с готовыми решениями:

Присвоить переменной значение, считанное из файла
Ругается компилятор. Имеется некоторое (значение, данные) в формате *.txt, ну допустим число 44, ...

Как присвоить значение переменной, исходя из значения другой переменной?
Всем привет. Нужна помощь. Есть переменная, например "month" которая может принимать значения...

Как переменной описанной в программе присвоить значение переменной в Conditional Compilation Arguments?
Kak mozhno peremennij opisanoj v programme prisvoit` znachenie peremennoj v Conditional Compilation...

Как php переменной присвоить значение переменной javascript?
есть переменная php как ей присвоить значение переменной javascript?

11
Эксперт по компьютерным сетямЭксперт NIX
12230 / 7097 / 727
Регистрация: 09.09.2009
Сообщений: 27,704
19.05.2012, 16:38 2
имхо, результат выполнения команды - код ее завершения...
0
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 38
19.05.2012, 18:33  [ТС] 3
Цитата Сообщение от Dmitry Посмотреть сообщение
имхо, результат выполнения команды - код ее завершения...
Код выполнения команды dd? Она всегда выполнится. Мне же надо анализировать значение полученного байта. Проблема в том, что dd в качестве подстановки в другую команду дополняет в конце любой считанной последовательности зачем-то 0Ah. Возможно, это баг, но мне от этого не проще. Нужен один байт, чтобы потом его проверить с помощью if - else. А тут два байта, и как-то нужно выбрать первый и присвоить его значение анализируемой переменной.
0
Эксперт по компьютерным сетямЭксперт NIX
12230 / 7097 / 727
Регистрация: 09.09.2009
Сообщений: 27,704
19.05.2012, 19:32 4
выполните dd в файл
потом считайте этот файл например командой
cat имя_файла
получите его содержимое
0
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 38
20.05.2012, 09:24  [ТС] 5
Цитата Сообщение от Dmitry Посмотреть сообщение
получите его содержимое
И что потом с этим делать? )) Там два байта, а мне нужен первый, причем heh, а не ASCII.
После присвоения переменной значения с помощью cat чтение ее по echo дает пустое место, а в операторе сравнения все такая же ошибка.

Bash
1
2
SIGN=$(cat /path/bh.bin) # где bh.bin - однобайтовый файл 
echo "$SIGN" # пустое или нечитабельное значение
Вроде бы все должно быть просто, а чет никак не выходит результат. Пробовал утилиту awk:
получаю вначале дамп этого файла od_bh.bin (увы, в нем он формируется с адресами, которые тоже читаются как значения)
Bash
1
2
awk '{print $2} od_bh.bin' # - получаю 128 (то, что нужно), но
NEW_SIGN=$(awk '{print $2} od_bh.bin') # - ошибка синтаксиса, присвоение значение перемменной не происходит
Добавлено через 12 часов 32 минуты
В общем, задача распадается на два пути решения.

1. Из полученного значения
SIGN=NEEDBYTE OA # состоит из двух байтов (или лексем???) - NEEDBYTE и невесть откуда взявшегося довеска 0Ah
выделить первый байт.

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

Посоветуете что-нибудь, как это сделать?
0
Эксперт по компьютерным сетямЭксперт NIX
12230 / 7097 / 727
Регистрация: 09.09.2009
Сообщений: 27,704
20.05.2012, 10:10 6
нагуглилась тут такая себе команда как od:
Bash
1
2
3
# od -x --read-bytes=1 --skip-bytes=446 /dev/sda
0000676 0080
0000677
0
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 38
20.05.2012, 10:37  [ТС] 7
Цитата Сообщение от Dmitry Посмотреть сообщение
нагуглилась тут такая себе команда как od:
Bash
1
2
3
# od -x --read-bytes=1 --skip-bytes=446 /dev/sda
0000676 0080
0000677
О, спасибо за такой формат команды, не знал, что можно получить дамп прямо с диска. Я применял od для получения дампа файла (Ваш путь оказался короче), но проблема опять в том, что при этом получается "слишком много аргументов" (два адресных значения и одно значение самого байта, когда пытаешься работать с этим значением в операции сравнения с числом 80h. Т.е. опять приходим к необходимости выделить нужный байт и присвоить его значение переменной, которая и будет сравниваться. Но вот как? У меня никак не получается это сделать. Жопа какая-то, я весь в расстроенных чувствах.

Добавлено через 4 минуты
Может, как-то можно сравнить два файла?
0
Эксперт по компьютерным сетямЭксперт NIX
12230 / 7097 / 727
Регистрация: 09.09.2009
Сообщений: 27,704
20.05.2012, 11:00 8
с учетом того, что вы получаете два ИЗВЕСТНЫХ адреса, и к тому же фиксированных, грохните их например sed-ом
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
20.05.2012, 12:14 9
Код
[guest@localhost ~]$ s=$(sudo dd if=/dev/sdb1 skip=466 bs=1 count=1 2>/dev/null | hexdump -C | awk 'NR == 1 {print $2}')
[guest@localhost ~]$ echo "$s"
43
[guest@localhost ~]$
1
0 / 0 / 0
Регистрация: 01.07.2010
Сообщений: 38
20.05.2012, 14:47  [ТС] 10
Цитата Сообщение от accept Посмотреть сообщение
Код
[guest@localhost ~]$ s=$(sudo dd if=/dev/sdb1 skip=466 bs=1 count=1 2>/dev/null | hexdump -C | awk 'NR == 1 {print $2}')
[guest@localhost ~]$ echo "$s"
43
[guest@localhost ~]$
У Вас получилось? У меня нет. echo ничего не вывела, а сравнение
Bash
1
2
3
if [ $s -eq 128 ]; then
echo "ok"
fi
дает сообщение
Bash
1
line 5: [: -eq: ожидается использование унарного оператора
У меня bash-3.2 .

А может, реализовать эту задачу в perl? Только я, к сожалению, его пока не знаю.
0
2582 / 2255 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
20.05.2012, 21:30 11
лучше на с, перл с хексами примерно на таких же правах как баш
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
21.05.2012, 03:31 12
Цитата Сообщение от Atmel Посмотреть сообщение
У Вас получилось? У меня нет. echo ничего не вывела, а сравнение
Код
[guest@localhost ~]$ s=$(echo x)
[guest@localhost ~]$ echo "$s"
x
[guest@localhost ~]$ s=`echo x`
[guest@localhost ~]$ echo "$s"
x
[guest@localhost ~]$
проверь, выводит ли
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2012, 03:31

Как в bash проверить значение переменной чтобы совпадало с одним из вариантов?
например: PARAMETER="true" # может быть enabled, on, yes а дальше что-то типа: if ]; then echo...

Как присвоить значение переменной если значение позже устанавливается в цикле?
Кратко: if($_SESSION != ""){ $row = mysql_num_rows(mysql_query("...")); if($row > 0) $panel...

Как присвоить значение переменной?
Как одной переменной присвоить две переменые со значениями?? Тоесть мне нужно чтото типа...

Как присвоить значение переменной?
Ребята извините что не по теме но как мне переменой а присвоить значение 5?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.