Как перебрать предоставленный параметр?

Я только что сделал это. Вместо lsя использовал расширение пути, потому что если ваши имена файлов содержат странные символы (новой строки, например ), это разбивает вывод.

#!/usr/bin/env bash

((n=0))

for i in *; do
  [[ -f "${i}" ]] && ((n++))
done

((n==1)) && { echo "${n} file"; exit; }
echo "${n} files"
1
02.12.2019, 12:01
2 ответа

Я не совсем понимаю, о чем вы спрашиваете. Вы хотите указать параметр и перебрать значения от 1 до этого значения? Если это так, вы можете сделать это с помощью bash (и, возможно, других оболочек :

.
function test() {
    for ((i = 1; i <= $1; ++i)); do
        echo $i
    done
}

test 12
1
2
3
4
5
6
7
8
9
10
11
12

Если у вас нет оболочки, поддерживающей синтаксис for(...), вы можете сделать то же самое с:

function test() {
    i=1

    while [ $i -le $1 ]; do
        echo $i
        i=$(expr $i + 1)
    done
}
2
27.01.2020, 23:29

Вы можете решить это двумя способами:

  1. Дайте функции одно целое число и позвольте ей вывести целые числа между некоторым начальным значением (1 )и этим целым числом:

    count_up () { seq "$1"; }
    

    или

    count_up () {
        for (( i = 1; i <= $1; ++i )); do
            echo "$i"
        done
    }
    

    или

    count_up () {
        value=1
    
        while [ "$value" -le "$1" ]; do
            echo "$value"
        done
    }
    

    или любое другое количество вариаций.

  2. Дайте фактические целые числа в качестве аргументов функции, используя, например,. count_up {1..5}и определим функцию как просто

    count_up () { printf '%s\n' "$@"; }
    

    или

    count_up () {
        for value do
            echo "$value"
        done
    }
    

    Хотя не было бы особого смысла делать это таким образом, поскольку вы могли бы просто вызвать seq 5или использовать printf '%s\n' {1..5}напрямую (, функцию, вероятно, следует вызывать как-то вроде list_argsвместо ).

0
27.01.2020, 23:29

Теги

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