Я только что сделал это. Вместо 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 до этого значения? Если это так, вы можете сделать это с помощью 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
}
Вы можете решить это двумя способами:
Дайте функции одно целое число и позвольте ей вывести целые числа между некоторым начальным значением (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
}
или любое другое количество вариаций.
Дайте фактические целые числа в качестве аргументов функции, используя, например,. 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
вместо ).