사용자가 여러 명령줄 인수를 합산하는 데 사용할 수 있지만 호환되지 않는 인수도 무시하는 bash 스크립트를 어떻게 만들 수 있습니까? 예를 들어, 내 스크립트가 sum이라고 가정해 보겠습니다.
sum 10 -argument1 -argument2 -argument3 20
30
sum 7 -argument1 2 -argument2 1 -argument3
10
답변1
의 경우 awk
합계와 각 개별 숫자 인수가 시스템 long
유형에 적합하다고 가정하고 -
선택적 선행 기호가 있는 십진수 시퀀스만 고려합니다.
#! /bin/sh -
awk 'BEGIN{
sum = 0
for (i = 1; i < ARGC; i++)
if (ARGV[i] ~ /^-?[0123456789]+$/)
sum += ARGV[i]
print sum}' "$@"
임의의 정밀도를 위해 다음을 사용할 수 있습니다 bc
.
#! /bin/sh -
awk 'BEGIN{
for (i = 1; i < ARGC; i++)
if (ARGV[i] ~ /^-?[0123456789]+$/)
print "s+="ARGV[i]
print "s"}' "$@" | bc
예:
$ ./sum1 999999999999999999999999 1
999999999999999983222784
$ ./sum2 999999999999999999999999 1
1000000000000000000000000
답변2
(최적이지 않은) 합계 예:
echo "$@" |awk '{for (i = 1; i <= NF; i++) j+=$i} END {print j}'
(숫자가 모두 awk
허용되는 숫자라고 가정)
예:
./ff 1 2 3.1 0x10 0100
86.1
경고: 숫자로 시작하는 모든 단어는 숫자로 해석됩니다.
답변3
이것은 또 다른 가능성이다
printf "%s\n" "$@" | awk '$1 ~ /^[[:digit:]]+$/ {s+=$1} END {print s}'
명령줄에서 각 인수를 가져와 한 줄에 하나씩 인쇄합니다. 스크립트 awk
는 이 데이터를 받아들이고 0이 아닌 양수 값을 추가하여 모든 데이터가 수신된 후 결과를 인쇄합니다.
예
#!/bin/sh
printf "%s\n" "$@" | awk '$1 ~ /^[[:digit:]]+$/ {s+=$1} END {print s}'
./sum 1 -argument2 2 -argument4 3
6
숫자 매개변수에 숫자만 포함되도록 보장할 수 있는 경우 $1 ~ /^[[:digit:]]+$/
검사 표현식을 에서 까지 단순화 할 수 있습니다 $1+0 > 0
.