2015-05-05 2 views
1

Я хотел сделать это вычисление a * 256 ** 3 + b * 256 ** 2 + c * 256 + d и назначить вывод переменной и распечатать dec.Как назначить вывод вычисления переменной оболочки

dec ='a * 256 ** 3 + b * 256 ** 2 + c * 256 + d' 
echo $dec 

Я получаю синтаксическую ошибку с указанными выше строками.

+1

[ «Shellscript» не язык] (http://meta.stackoverflow.com/questions/292023/ пусть-shellscript огневого в скорлупе). Какую оболочку вы используете? –

ответ

2

Прежде всего, назначение сделано таким образом

dec='a * 256 ** 3 + b * 256 ** 2 + c * 256 + d' 

Это где ваша ошибка синтаксиса приехал. Тогда вы просто должны оценить вашу строку с оператором $ (()) таким образом:

echo $((dec)) 
+0

flag = $ ($ dec & (1 << 31)): чтобы увидеть, включен ли 31-й бит, я использую этот флаг. Но синтаксическая ошибка. Я не мог решить – user3823859

+0

@ user3823859 Это совершенно отдельный вопрос, но я думаю, что вы ищете 'flag = $ ((dec & 1 << 31))'. Для арифметического контекста необходимы двойные скобки. –

+0

dec2ip() { локального IP = Декабрь $ @ если [$ Декабре <0] затем Декабрь = $ ((декабрь + 429496796)) для е в {3..0} сделать ((октет = dec/(256 ** e))) ((dec - = октет * 256 ** e)) ip + = $ delim $ октет delim =. done printf '% s \ n' "$ ip" } Я решил половину проблемы с этим, но он показывает ошибку: синтаксическая ошибка около неожиданного токена '} ' – user3823859

1

Для целого арифметики, вы можете использовать оболочку:

dec=$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d)) 
echo "$dec" 

Это использует арифметический контекст ((...)) для вычисления значения.

Обратите внимание, что в задании нет места, это важно!

Оболочка не поддерживает арифметику с плавающей запятой, но bc или awk do. Например, используя AWK (и при условии, что у вас есть переменные оболочки $a, $b, $c и $d определены):

awk -v a="$a" -v b="$b" -v c="$c" -v d="$d" 'BEGIN{print a * 256 ** 3 + b * 256 ** 2 + c * 256 + d}' 

или с помощью бв:

printf '%s * 256^3 + %s * 256^2 + %s * 256 + %s\n' "$a" "$b" "$c" "$d" | bc -l 

Используя формат строки спецификатор %s для каждого из переменные оболочки означают, что перед передачей значений в bc точность не теряется.

Смежные вопросы