1) Ваш код застрянет, поскольку awk ожидает входной файл или данные из STDIN.Вы можете добавить / dev / null, если не хотите обрабатывать какие-либо файлы.Вы можете прочитать этот вопрос SO , чтобы понять больше об этом.
2) Даже если вы исправите это, сумма не будет вычислена, так как переменная сумма будет сбрасываться во время каждого цикла, как считает awkэто как новая переменная.
Обратите внимание на разницу в выходных данных в следующих 3 попытках:
for user in "$@"
do
printf "\nUser: $user \n"
if [[ $user =~ [0-9]+ ]]; then
usersDigits=$(echo $user | tr -dc '0-9')
echo "$usersDigits"
echo "has digits"
printf "First Try : " && awk 'END {print $usersDigits}' < /dev/null
printf "Second Try : " && awk 'END {print "$usersDigits"}' < /dev/null
printf "Third Try : " && awk -v dg="$usersDigits" 'BEGIN {printf "Digits= " dg; sum+=dg; print " Sum= " sum}'
else
echo "doesn't have digits"
fi
done
Вывод для "test.ksh acs acs005 acs007":
User: acs
doesn't have digits
User: acs005
005
has digits
First Try :
Second Try : $usersDigits
Third Try : Digits= 005 Sum= 5
User: acs007
007
has digits
First Try :
Second Try : $usersDigits
Third Try : Digits= 007 Sum= 7
В первых двух, usersDigits не определен внутри awk.Надеюсь, это поможет.
Обновление: скрипт с логикой для вычисления суммы цифр
for user in "$@"
do
printf "\nUser: $user \n"
if [[ $user =~ [0-9]+ ]]; then
usersDigits=$(echo $user | tr -dc '0-9')
echo "$usersDigits"
echo "has digits"
printf "Sum of Digits:" && awk -v dg="$usersDigits" 'BEGIN {while( dg+0 > 0) {digit=dg%10; DigSum+=int(digit); dg=int(dg/10);}; print DigSum }' < /dev/null
иначе echo "не имеет цифр" fi done
Пример вывода:
./test.ksh acs acs005 acs007 acs123 345
User: acs
doesn't have digits
User: acs005
005
has digits
Sum of Digits:5
User: acs007
007
has digits
Sum of Digits:7
User: acs123
123
has digits
Sum of Digits:6
User: 345
345
has digits
Sum of Digits:12