Сделать отрицательные целые числа положительными в цикле

Попробуйте это,

Для папок:

 ls -lR * | awk -F '[ /]' ' !/^-/ && !/^d/{if ($NF ~ "exam" ) print $NF}' | wc -l

Для файлов:

 ls -lR * | awk  '/^-/ {if ($NF ~ "exam" ) print $NF}'  | wc -l
1
28.01.2021, 02:33
2 ответа

Вы можете использовать подстановку параметров для удаления знака минус:

read input
# 1, 5, -17, 32, 12
# expected absolute value: 67
absolute_value() {
    local absolute_value=0

    for nums in $input; do
      ((absolute_value += ${nums#-} ))
    done
    echo $absolute_value
}

absolute_value

Чтобы избежать использования цикла for -, вы можете попробовать это:

printf "%s\n" ${input/-/} | awk '{ sum += $1 } END { print sum }'

Я бы использовал цикл while и массив, чтобы контролировать, сколько вводов может сделать пользователь, и продолжал спрашивать, неправильный ли ввод:

declare -a arr
declare -a arr_abs
echo "Enter four numbers:"

while true; do
  read num
  [[ $num =~  ^[^-0-9]$ ]] && echo "Not a number..." && continue
  # keep the original values for any other use
  arr+=($num)
  # create an array with absolute values
  arr_abs+=(${num#-})
  [[ ${#arr[@]} -eq 4 ]] && break
done

absolute_value() {
   sum=$(printf "%s\n" ${arr_abs[@]} | awk '{ sum += $1 } END { print sum }')
   echo "The absolute sum is $sum"
}

absolute_value
0
18.03.2021, 22:34

Хорошо, а как определяется абсолютное значение ?

if [ "$num" -lt 0 ]; then
    num=$((-num))
fi

Во всяком случае, это:

for nums in $input

основан на разбиении слов -и несколько уродлив. Вы также получите интересные эффекты, если кто-то введет числа, отличные от -, или символы подстановки. Поскольку вы используете Bash, вы можете избежать проблем с символами подстановки, считывая значения в массив с помощью read -a. Также мы можем использовать [[ var -lt 0 ]].

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

#!/bin/bash
read -a nums
sum=0
for a in "${nums[@]}"; do
    if [[ $a = *[^-0-9]* ]]; then
        echo "invalid number: $a"
        exit 1
    fi 
    if [[ a -lt 0 ]]; then
        sum=$((sum + -a))
    else
        sum=$((sum +  a))
    fi
done
echo "$sum"

Обратите внимание, что Bash интерпретирует числа, начинающиеся с 0и 0x, как восьмеричные и шестнадцатеричные соответственно.


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

$ python3 -c 'print(sum(map(lambda x: abs(int(x)), str.split(input()))))'
1 5 -17 32 12
67
2
18.03.2021, 22:34

Теги

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