Абсолютное значение числа

Я хочу взять абсолютное число с помощью следующего кода в bash:

#!/bin/bash
echo "Enter the first file name: "
read first

echo "Enter the second file name: "
read second

s1=$(stat --format=%s "$first")
s2=$(stat -c '%s' "$second")

res= expr $s2 - $s1

if [ "$res" -lt 0 ]
then
        res=$res \* -1
fi

echo $res

Теперь проблема, с которой я столкнулся, заключается в выражении if, независимо от того, что я меняю, она всегда идет в if, я пытался поместить [[ ]] вокруг инструкции, но ничего.

Вот ошибка:

./p6.sh: line 13: [: : integer expression expected

Ответ 1

$ s2=5 s1=4
$ echo $s2 $s1
5 4
$ res= expr $s2 - $s1
1
$ echo $res

Что на самом деле происходит в четвертой строке, так это то, что res ничего не задано и экспортировано для команды expr. Таким образом, при запуске [ "$res" -lt 0 ] res расширяется до нуля, и вы видите ошибку.

Вы можете просто использовать арифметическое выражение:

$ (( res=s2-s1 ))
$ echo $res
1

Арифметический контекст гарантирует, что результат будет целочисленным, поэтому даже если все ваши термины undefined, вы получите целочисленный результат (а именно нуль).

$ (( res = whoknows - whocares )); echo $res
0

В качестве альтернативы вы можете сообщить оболочке, что res является целым числом, объявив его как таковой:

$ declare -i res
$ res=s2-s1

Интересно, что правая часть задания обрабатывается в арифметическом контексте, поэтому вам не нужен $ для расширений.

Ответ 2

Вы можете просто взять ${var#-}.

${var#Pattern} Удалите из $var самую короткую часть $Pattern, соответствующую внешнему концу $var. tdlp


Пример:

s2=5; s1=4
s3=$((s1-s2))

echo $s3
-1

echo ${s3#-}
1

Ответ 3

Я знаю, что эта ветка на данный момент старая, но я хотел поделиться функцией, которую я написал, которая может помочь с этим:

abs() { 
    [[ $[ [email protected] ] -lt 0 ]] && echo "$[ ([email protected]) * -1 ]" || echo "$[ [email protected] ]"
}

Это будет принимать любое математическое/числовое выражение в качестве аргумента и возвращать абсолютное значение. Например: abs -4 => 4 или abs 5-8 => 3