Intereting Posts
Что такое верхняя левая кнопка в Windows KDE? Gnome 3: включить Ctrl + Alt + Bksp для каждого пользователя без редактирования каких-либо файлов? Отключить cronjob после перезагрузки команда awk с несколькими командами Не удается загрузить файл в контейнере lxc Debian wifi выпадает, а затем не будет повторно подключаться до перезагрузки Добавление текущей даты из переменной в имя файла Windows (пар) игры Является ли crontab многопоточным? Не удалось загрузить на Debian после клонирования двойной загрузки с HDD на SSD Как проверить файл с числовым именем и, если он существует, скопировать его с новым именем, используя следующий порядковый номер Как получить системное время с микросекундой Разрешение Нет сетевого интерфейса для lan9118, эмулируемого на QEMU 1.4.0 overo machine trap echo делает печать не записывать в консоль при записи в файл Не удается установить пакет: отсутствует ядро ​​Linux

Аргумент string для integer в bash

Пытаясь выяснить, как преобразовать аргумент в целое число для выполнения арифметики, а затем распечатать его, скажем, для addOne.sh :

 echo $1 + 1 >>sh addOne.sh 1 prints 1 + 1 

В bash нельзя преобразовать аргумент в целое число для выполнения арифметики. В bash переменные рассматриваются как целые или строковые в зависимости от контекста.

Для выполнения арифметики вы должны вызвать оператор арифметического расширения $((...)) . Например:

 $ a=2 $ echo "$a + 1" 2 + 1 $ echo "$(($a + 1))" 3 

или вообще предпочтительнее:

 $ echo "$((a + 1))" 3 

Вы должны знать, что bash (в отличие от ksh93, zsh или yash) выполняет только целочисленную арифметику. Если у вас есть числа с плавающей запятой (числа с десятичными знаками), тогда есть и другие инструменты для оказания помощи. Например, используйте bc :

 $ b=3.14 $ echo "$(($b + 1))" bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1") $ echo "$b + 1" | bc -l 4.14 

Или вы можете использовать оболочку с арифметической поддержкой с плавающей запятой вместо bash:

 zsh> echo $((3.14 + 1)) 4.14 

В bash вы можете выполнить преобразование из чего-либо в целое с помощью printf -v :

 printf -v int '%d\n' "$1" 2>/dev/null 

Плавающее число будет преобразовано в целое число, в то время как все не будет выглядеть так, как число будет преобразовано в 0. Экспоненциальность будет усечена до числа до e

Пример:

 $ printf -v int '%d\n' 123.123 2>/dev/null $ printf '%d\n' "$int" 123 $ printf -v int '%d\n' abc 2>/dev/null $ printf '%d\n' "$int" 0 $ printf -v int '%d\n' 1e10 2>/dev/null $ printf '%d\n' "$int" 1 

Аналогичная ситуация возникла в последнее время при разработке сценариев bash для работы в среде Linux и OSX. Результат одной команды в OSX возвратил строку, содержащую код результата; т.е. " 0" . Конечно, это не удалось проверить правильно в следующем случае:

 if [[ $targetCnt != 0 ]]; then... 

Решение заключалось в том, чтобы заставить (т. Е. «Преобразовать») результат в целое число, аналогичное тому, что @ John1024 ответил выше, чтобы он работал так, как ожидалось:

 targetCnt=$(($targetCnt + 0)) if [[ $targetCnt != 0 ]]; then... 

Использование $ (()) или (()) небезопасно, если вы не знаете, что такое строки (например, ввод пользователя). Учти это:

 foo=foo (( foo += 0 )) 

Это приведет к сбою сценария, когда он попытается рекурсивно оценить foo. То же самое:

 foo=foo foo=$(( foo + 0 )) 

Другой способ, вы можете использовать expr

Пример:

 $ version="0002" $ expr $version + 0 2 $ expr $version + 1 3