Как сделать аргумент как необязательный в bash?

Я рекомендую вам программное обеспечение Dia, которое вы можете легко получить из программного центра Ubuntu. Это простое приложение для перетаскивания для ER или любой другой UML или блок-схемы и содержит количество других фигур. Для получения дополнительной информации посетите эту ссылку.

1
задан 7 March 2015 в 00:03

6 ответов

Посмотрите на оператор shift. Он сдвигает аргументы 2 и далее в позиции 1 и далее, отбрасывая аргумент 1.

sum () {
    local total=0;
    while [ $# -gt 0 ]; do
        total=$(($total + $1))
        shift
    done
    echo $total
}
17
ответ дан 24 May 2018 в 03:49

Вы можете использовать рекурсивное определение, которое завершается, когда sum вызывается без аргументов. Мы используем тот факт, что test без аргументов имеет значение false.

sum () {
    test $1 && echo $(( $1 + $(shift; sum $@) )) || echo 0
}
4
ответ дан 24 May 2018 в 03:49

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

SUM () {
 [ $# -lt "2" ] && return 1
 for par in $@; do
   local sum=`expr $sum + $par`
 done
 echo $sum
 return 0
}

SUM 3 4 5
SUM 3 4 5 1 1 1 1 2 3 4 5

Это выведет 12 и 30.

$@ относится к параметру, $# возвращает количество параметров, в этом случае 3 или 11.

Протестировано на linux redhat 4

3
ответ дан 24 May 2018 в 03:49

Вы могли бы просто использовать небольшой цикл:

sum(){
    t=0;
    for i in "$@"; do t=$((t + i )); done
    echo $t;
}

Лично, однако, я просто использовал бы perl или awk:

sum(){
 echo "$@" | perl -lane '$s+=$_ for @F; print $s'
}

или [ ! d2]

sum(){
 echo "$@" | awk '{for(i=1; i<=NF; i++){k+=$i} print k}'
}
2
ответ дан 24 May 2018 в 03:49

Использовать 0 в качестве значений по умолчанию от $ 1 до $ 9:

SUM() { 
    echo "The sum is $((${1:-0}+${2:-0}+${3:-0}+${4:-0}+${5:-0}+${6:-0}+${7:-0}+${8:-0}+${9:-0}))"
}

From man bash:

${parameter:-word}
    Use Default Values. If parameter is unset or null, the expansion
    of word is substituted. Otherwise, the value of parameter is
    substituted.

Примеры:

$ SUM

Сумма равна 0

$ SUM 1 2 

Сумма равна 3

$ SUM 1 1 1 1 1 1 1 1 1 

Сумма равна 9

Тот же вывод с awk:

SUM() {
  echo -e ${@/%/\\n} | awk '{s+=$1} END {print "The sum is " s}'
}
2
ответ дан 24 May 2018 в 03:49

Это также мое собственное решение, которое я попробовал и нашел:

SUM() { 
    echo "The sum is $(($1+$2+$[$3]+$[$4]+$[$5]+$[$6]+$[$7]+$[$8]+$[$9]))"
 }

$ SUM 4 6 5
The sum is 15

Но ответ @ muru хороший.

1
ответ дан 24 May 2018 в 03:49

Другие вопросы по тегам:

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