Абсолютное значение числа
Я хочу взять абсолютное число с помощью следующего кода в 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