Попробуйте это,
Для папок:
ls -lR * | awk -F '[ /]' ' !/^-/ && !/^d/{if ($NF ~ "exam" ) print $NF}' | wc -l
Для файлов:
ls -lR * | awk '/^-/ {if ($NF ~ "exam" ) print $NF}' | wc -l
Вы можете использовать подстановку параметров для удаления знака минус:
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
Хорошо, а как определяется абсолютное значение ?
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