Как я создаю сценарий удара, который суммирует какое-либо количество параметров командной строки?

Ctrl+U наиболее вероятен, потому что у Вас есть курсор в конце строки. Во-вторых, какую версию хинду Вы называете "последним системным обновлением"?

И что хотели бы Вы ctrl+left/right делать?

  • Добавьте к конфигурации zsh:

bindkey '^[[1;5C' emacs-forward-word
bindkey '^[^[[D' emacs-backward-word

  • И от старого фрагмента я нашел (мог бы помочь):

bindkey ";5C" forward-word
bindkey ";5D" backward-word

  • или взгляните на эту ссылку, которая должна выручить Вас?

Примечание: Если конфигурация работает, но воображаемые ключи не делают то, что Вы хотите, это, возможно, потому что ключевое определение отличается от Вашего и моего, сделайте: cat > /dev/null и нажмите клавиши, Вы хотели бы быть произведенными и корректировались бы соответственно.

5
06.11.2013, 01:16
3 ответа

Никакая потребность в bash, плоскость sh сделает также:

#! /bin/sh - 
IFS=+; echo "$(($*))"

$* в оболочках POSIX, расширяется до списка позиционных параметров (в этом случае, аргументы сценарию) разделенный первым символом $IFS (или пространство, если $IFS сброшен или ничто если $IFS пусто). $((...)) оболочка внутренний арифметический оператор расширения (обратите внимание, что это поддерживает десятичные, восьмеричные и шестнадцатеричные числа),

Если Вам нужна поддержка с плавающей точкой, это - то, где Вам будет нужна другая оболочка как ksh93 или zsh (нет bash как bash только целочисленная арифметика поддержек), хотя Вы могли также использовать awk:

#! /usr/bin/awk -f
BEGIN {t=0; for (i in ARGV) t+=ARGV[i]; print t}

Это будет использовать long (для целого числа) и double (для плавающей точки), вводят числа, как реализовано Вашей системой. Входные числа должны быть десятичной или инженерной записью с плавающей точкой в английском стиле (разделитель с плавающей точкой является символом точки независимо от локали). С некоторыми awk реализации, это перестанет работать, если первое число будет отрицательно как awk попытался бы интерпретировать его как опцию.

Некоторые awk реализации как GNU awk когда POSIXLY_CORRECT находится в среде, также поддерживают hexadecimals включая с нотациями двоичного порядка. Или с --non-decimal-data, это понимает octals и hexadecimals:

$ POSIXLY_CORRECT=1 ./sum  0xap3 0xa
90 # (0xa * 2^3) + 0xa
$ awk --non-decimal-data -f ./sum  010
8
15
27.01.2020, 20:31
  • 1
    . Но я действительно надеюсь, что Вы не смущаете его ^^, кажется, что он изучает основы сценариев оболочки, и Вы бросаете его управление IFS ^^, всегда хорошо знать, но вероятно немного слишком рано для него... Или дайте объяснения такой как IFS=+ means afterward the "$*" will expand to "all the arguments separated by a '+'", hence the $((computation)) will be replaced with the sum of all arguments –  Olivier Dulac 05.11.2013, 12:13

Можно использовать следующую функцию удара:

sum() {
    local sum=0
    for arg in "$@"; do
        (( sum += arg ))
    done   
    echo $sum
}
8
27.01.2020, 20:31
  • 1
    Как вопрос о стороне, там способ определить, сколько args находится в командной строке без цикличного выполнения? –  John 05.11.2013, 09:13
  • 2
    $# количество args –  rici 05.11.2013, 09:19
  • 3
    , Спасибо, прекрасный. Один последний вопрос я забыл разъясняться.. есть ли какой-либо способ, которым я могу обнаружить, если он похож на самый первый аргумент? Поэтому скажите, что это - самый первый аргумент, я могу сделать что-то специальное с ним. Например, как случайный пример, если самым первым аргументом являются 7, я повторяю это, самым первым аргументом являются 7. –  John 05.11.2013, 09:47
  • 4
    @John $1 первый аргумент, $2 второй аргумент, и так далее. Переменные 0$ являются названием сценария. Общее количество аргументов хранится в $ #. $ переменных и $* возвращают все аргументы.См. также: how-to.wikia.com/wiki / … –  Radu Rădeanu 05.11.2013, 10:04
  • 5
    @John обычно, если Вы хотите обработать первый аргумент по-другому Вы сначала, копирует его во что-то еще и затем смещает всю остальную часть споров с first=$1;shift –  icarus 19.11.2016, 19:45

Вариант нецикличного выполнения:

{ printf %d+ "$@"; echo 0; } | bc

Пример

Поместите вышеупомянутое в файл сценария, sum.

#!/bin/bash

{ printf %d+ "$@"; echo 0; } | bc

Выполните его как так:

$ ./sum 4
4
$ ./sum 4 4 5
13
8
27.01.2020, 20:31

Теги

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