Как увеличить значение (десятичной) переменной (с ведущим нулем) на +1?

/var/log/apt/history.log* содержит журналы всех действий apt, включая имя пользователя, запрашивающего изменение (, что полезно, только если вы используете sudo, а не rootнапрямую ).

Уже есть некоторая интеграция между rkhunterи apt; см. /etc/apt/apt.conf.d/90rkhunterв вашей системе. Если вы хотите, чтобы это было включено, вам нужно изменить APT_AUTOGENв /etc/default/rkhunterна true.

Вы также можете добавить свои собственные задания до -или после -установки, например. для запуска сканирования непосредственно перед установкой...

Часть вашего вопроса о «передовой практике» слишком широка для этого места. В конечном счете, некоторые утверждают, что вы должны вносить изменения в свои системы только с помощью такого инструмента, как Ansible, который предоставляет свои собственные журналы всех изменений.

13
09.10.2019, 20:46
4 ответа

Ведущий 0 заставляет Bash интерпретировать значение как восьмеричное значение ; Восьмеричное число 012 равно десятичному числу 10, поэтому вы получите 11.

Чтобы принудительно использовать десятичную дробь, добавьте 10#(, если число не имеет ведущего знака):

BN=10#$(cat Build.number)
echo $((++BN)) > Build.number

Чтобы напечатать число, используя не менее трех цифр, используйте printf:

.
printf "%.3d\n" $((++BN)) > Build.number
32
27.01.2020, 19:52

bashобрабатывает константы, начинающиеся с 0, как восьмеричные числа в своих арифметических выражениях, поэтому 011на самом деле 9.

На самом деле это требование POSIX.

Некоторые другие оболочки, такие как mkshили zsh, игнорируют его (, если только он не находится в режиме, совместимом с POSIX ), поскольку он гораздо чаще мешает, чем полезен.

С ksh93, BN=011; echo "$(($BN))"выводит 9, но echo "$((BN))"выводит 11.

В bashвы можете использовать BN=$((10#$(<Build.number))), что должно работать, если число не начинается с -или +.

18
27.01.2020, 19:52

В любой оболочке POSIX вы можете запретить считать число восьмеричным, удалив его начальные нули с помощью комбинации форм раскрытия ${var#prefix}и ${var%%suffix}:

BN=001002; BN=$(( ${BN#${BN%%[!0]*}} + 1 )); echo "$BN"
1003

В оболочках, поддерживающих синтаксис ${var//pat/repl}, вы также можете сделать это, добавив перед ним 1и вычтя его из10^{number_of_digits}:

BN=000012; BN=$(( 1$BN - 1${BN//?/0} )); echo "$BN"; BN=$((BN+1)); echo "$BN"
12
13

Это работает в bash, zsh, ksh93, mkshи yash.

В bash, ksh93и zsh(, но не в yashи mksh), вы также можете использовать фортранский **оператор (возведения в степень):

BN=000012; BN=$(( 1$BN - 10**${#BN} ))
4
27.01.2020, 19:52

Вот функция для увеличения числовой строки. Он наблюдает ведущие нули и пытается сохранить количество цифр. Он не использует никаких переменных, поэтому не требует каких-либо расширений оболочки для объявления локальных переменных и не загрязняет пространство имен переменных :

.
# $1 -- decimal string, possibly with leading zeros or sign
# $2 -- integer increment, no leading zeros.
incnumstr()
{
  if [ $1 -lt 0 ] ; then
    set -- $(incnumstr ${1#-} $((- $2)))
    [ $1 -le 0 ] && printf "%s" ${1#-}  \
                 || printf "%s" -$1
    return
  fi

  set -- ${1#-} $2 # strip leading minus from zero

  [ $1 -eq 0 ] && printf "%s%0.*d" "$3" ${#1} $2 \
               || printf "%s%0.*d" "$3" ${#1} $(( ${1#${1%%[1-9]*}} + $2 ))
}

Интерактивные тесты:

$ echo $(incnumstr 0 0)
0
$ echo $(incnumstr -0 0)
0
$ echo $(incnumstr 0 1)
1
$ echo $(incnumstr 0 -1)
-1
$ echo $(incnumstr 00 1)
01
$ echo $(incnumstr 00 -1)
-01
$ echo $(incnumstr -10 10)
00
$ echo $(incnumstr -10 11)
01
$ echo $(incnumstr -10 20)
10
$ echo $(incnumstr -10 99)
89
$ echo $(incnumstr -10 110)
100
$ echo $(incnumstr 100 -90)
010
$ echo $(incnumstr 100 -99)
001
$ echo $(incnumstr 100 -100)
000
$ echo $(incnumstr 100 -101)
-001
$ echo $(incnumstr 100 -1234)
-1134
$ echo $(incnumstr -0000 0)
0000
$ echo $(incnumstr -0000 1)
0001
$ echo $(incnumstr -0000 -2)
-0002
0
27.01.2020, 19:52

Теги

Похожие вопросы