Вы правы в том, что эта математика не работает в bash и большинстве других оболочек, поскольку они следуют соглашению C, согласно которому число, начинающееся с 0
, является восьмеричным , а не десятичным :
$ echo "$((124000000 - 097000000))"
bash: 124000000 - 097000000: value too great for base (error token is "097000000")
Одно из решений состоит в том, чтобы правильно идентифицировать числа, которые нужно бить как базовые. -10:
$ echo "$((10#124000000 - 10#097000000))"
27000000
Проблема в том, что без префикса 10#
bash предполагает, что число, начинающееся с нуля, является восьмеричным.
В качестве альтернативы используйтеbc
:
$ echo "124000000 - 097000000" | bc -l
27000000
Или используйте awk:
$ echo "124000000 097000000" | awk '{print $1-$2}'
27000000
$ g=124000000
$ h=097000000
$ printf "Total time difference: %i milli seconds\n" "$(echo "$g - $h" | bc -l )"
Total time difference: 27000000 milli seconds
Или,
$ g=124000000
$ h=097000000
$ echo "$g $h" | awk '{printf "Total time difference: %i milliseconds\n",$1-$2}'; )
Total time difference: 27000000 milli seconds
Изman bash
:
Constants with a leading 0 are interpreted as octal numbers. A leading 0x or 0X denotes hexadecimal. Otherwise, numbers take the form [base#]n, where the optional base is a decimal number between 2 and 64 representing the arithmetic base, and n is a number in that base.
$ echo "$(( $(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N') ))"
27000000
Если мы хотим преобразовать наносекунды в миллисекунды:
$ echo "$(( ($(date -d '14:00:13.124' '+10#%s%N') - $(date -d '14:00:13.097' '+10#%s%N'))/1000000 ))"
27
$ echo "$(( ($(date -d '14:00:05.320' '+10#%s%N') - $(date -d '14:00:04.909' '+10#%s%N'))/1000000 ))"
411
Чтобы расширить мой комментарий, вам нужно сменить оболочку на zsh и установить автоподсказки zsh -. Сначала установите zsh и git с помощью sudo apt-get install zsh git
. Затем запустите chsh
и при появлении запроса введите /bin/zsh
. В-третьих, введите git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
, чтобы клонировать репозиторий автопредложений zsh -. Наконец, введите echo "source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh" >> ~/.zshrc
и либо введите source ~/.zshrc
, либо после этого запустите новую оболочку.
Использовать пользовательскую оболочку:Вы можете изменить оболочку по умолчанию на ту, которая предоставляет такую функцию:Fish shell или ZSH с дополнением zsh -autosuggestion . Имейте в виду, что оболочки отличаются , изменение оболочки на Fish или ZSH может изменить некоторые из ваших команд или сценариев .
Поиск с помощью Ctrl -R:Если вы не можете изменить свою оболочку (или если вы не хотите ), вы можете выполнить поиск в своей истории, используя Ctrl -R. Это отличается от -завершения мухи -, которое вы ищете, но может быть полезной альтернативой. См. Как переключаться между обратным -и -поиском в BASH? .