Что означает typeset -i2 var = 2 # 0 в оболочке bash / korn? - PullRequest
2 голосов
/ 21 июня 2019

Я прочитал следующую инструкцию в скрипте оболочки korn:

typeset -i2 var=2#0

Мне удалось узнать, что с помощью typeset вы можете указать тип переменных, а параметр -i2 описывает, что переменная представляет собой целое число, которое должно интерпретироваться в основание 2 (двоичное). Однако я до сих пор не могу понять, что означает значение, присвоенное переменной (2#0).

Поиск в Google Я обнаружил, что такие инструкции, как variable#pattern, означают, что вхождения шаблона будут удалены из передней части переменной, но, похоже, это не так ...

РЕДАКТИРОВАТЬ: Кажется, что синтаксис -in является специфическим для оболочки Korn (ksh)

1 Ответ

2 голосов
/ 21 июня 2019

Синтаксис -i[n] typeset относится к ksh и недоступен в bash.В вашей попытке код -i2 означает представление выходных данных в содержимом базы 2, то есть в виде двоичного значения.В ksh93

typeset -i2 var=15
echo "$var"

выдает значение в двоичном виде

2#1111

Итак, с этой логикой ваш исходный код инициализирует значение для var в двоичном виде 0.Если бы вы инициализировали что-то как 2#1111, было бы более понятно, что означает флаг.Вы не можете использовать неосновные числа 2 с этим синтаксисом, поскольку он просто выдаст синтаксическую ошибку, т.е. что-то вроде выполнения typeset -i2 var=2#15 никогда не будет работать.

Обратите внимание, что typeset является устаревшей конструкцией как в ksh, так и в *.bash снаряды.Использование declare предоставляет аналогичные параметры и многое другое.В bash вы можете использовать арифметический оператор для того же $((..)), если вы определили число в базе 2

var='2#1111'
echo "$(( var ))"
15

Но нет встроенного способа выполнить преобразование базы 2 из десятичного числав bash без использования сторонних инструментов, таких как bc

echo 'obase=2;15' | bc
1111
...