2015-08-10 1 views
0

Когда я храню большие значения в скрипте оболочки и загружается в переменную busybox, он печатает значения -ve.
Я знаю, что оболочка не имеет типа переменной, но тогда как мне избежать этого откидывания назад к значениям -ve?
Я использовал ниже командные команды в оболочке, и он печатает значение -ve.Как хранить большие значения в переменной скрипта оболочки

# let b=3841982464 
# echo $b 
-452984832 

Любое предложение/указатель?

EDIT:
Ответ предложил agilob работает на мой оригинальный вопрос, но моя фактическая проблема, я был последним, чтобы перейти к концу диска - 17KB Поэтому я использовал команду следующего

# b=$(($(blockdev --getsize64 /dev/mmcblk0) - $((17*1024)))) 
# echo $b 
-453002240 

Так до сих пор значение распечатывается -ve :(, используя выражение также дает фантастический результат следующим

# b=`expr $(blockdev --getsize64 /dev/mmcblk0) - 17408` 
# echo $b 
2147466239 

Ответ на актуальной проблемой
сек o Ответ на оригинальный вопрос ответил agilob, поэтому я принял этот ответ. И текущая проблема, которую я мог бы решить, как следует,

# b=$(blockdev --getsize64 /dev/mmcblk0) 
# echo $b 
3841982464 
# echo "$b 17408 - p" | dc 
3841965056 

AWK путь

Я попытался сделать это в AWK, как user1934428 предложил, это может быть сделано следующим образом,

# echo "$(blockdev --getsize64 /dev/mmcblk0) 17408" | awk '{ printf "%.0f", $1 - $2}' 
3841965056# 

ответ

2

Почему не только:

b=3841982464 
echo $b 
    => 3841982464 
+0

Omg Я думал, что это так же, как 'let b = 3841982464'. Спасибо. Btw В чем разница? – AnkurTank

+0

хорошо над решением работает. Но если я использовал его следующим образом: b = $ (($ (blockdev --getsize64/dev/mmcblk0) - $ ((17 * 1024)))) 'it prints' # echo $ b' '-453002240', Вы предлагаете использовать expr? – AnkurTank

+1

'let' оценивает выражение, пусть a = 1-1; echo $ a; будет печатать 0. Пожалуйста, примите ответ, если вы не возражаете;) – agilob

0

Вы в основном хотите сделать арифметику с помощью «произвольные длинные целые числа». Это не встроено в bash (в котором используется 8-байтное целое число).

Я бы сохранил номера только в обычных переменных окружения и использовал другие языки программирования (например, Ruby) для их обработки.

+0

Благодарим за сообщение @ user1934428, i do not есть рубин в моей доске. Я мог бы решить это с помощью 'dc' – AnkurTank

+1

Это просто пример. Есть много вариантов.Причина, по которой я, возможно, не буду делать это с помощью dc/bc, состоит в том, что иногда скрипты с такими числовыми требованиями легче решать, когда они полностью реализованы на другом языке, чем оболочка. Иногда я запускаю сценарий оболочки, используя Ruby или Perl или Awk для решения простых подзадач, и со временем я извлекаю все больше и больше функций из сценария и на выбранный язык программирования ;-) – user1934428

+0

Я согласен с вами в отношении Перемещение сценария на язык программирования лучше Идея. Просто из любопытства вы перемещаете небольшую функциональность скрипта на небольшие программы? Используете ли вы их сочетание? – AnkurTank