我正在尝试学习bash shell脚本和awk,我编写了一些简单的代码,这些代码循环遍历给定的参数,并且如果params包含数字,则仅打印数字。
接下来,使用AWK,我将它们一一添加并打印总和。我被困在这里。这是我的代码:
#!/bin/bash
for user in "$@"
do
echo "$user"
if [[ $user =~ [0-9]+ ]]; then
usersDigits=$(echo $user | tr -dc '0-9')
echo "$usersDigits"
echo "has digits"
echo $(awk '{ sum+=$usersDigits } END { print sum }')
else
echo "doesn't have digits"
fi
done
我在做什么错了?
答案 0 :(得分:0)
1)您的代码将被卡住,因为awk期望输入来自STDIN的文件或数据。如果不想处理任何文件,则可以添加/ dev / null。您可以阅读this SO question来了解更多信息。
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
在前两个中,awk内部未定义usersDigits。希望对您有所帮助。
更新: 具有逻辑运算符的脚本,用于计算数字总和
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
其他 回声“没有数字” 科幻 完成
样本输出:
./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