Найти длину массива в скрипте zsh

Просто удалите обратные кавычки из вашего скрипта:

#!/bin/sh

ls -lrt >> lsOutput.log

В противном случае команда выполняется, а затем ее вывод заменяется и выполняется.

Например:

echo date

выведет: date , а

`echo date`

выведет текущую дату, то есть сначала вычислится до date , а затем выполнится, что вызывает программа дата сама.

2
09.02.2019, 03:48
2 ответа

${#*[@]}будет длиной массива $*, также известного как $@или $argv, который является массивом позиционных параметров (в случае скрипта или функции, это аргументы скрипта или функции получил ). Хотя для этого лучше использовать $#.

*сам по себе является просто шаблоном шара. В контексте списка это расширяется до списка файлов в текущем каталоге, которые соответствуют этому шаблону. Поскольку *является шаблоном, который соответствует любой строке, он будет расширяться на все имена файлов в текущем каталоге (, кроме скрытых ).

Теперь вам нужно найти контекст списка для этого *для расширения, а затем каким-то образом подсчитать количество результирующих аргументов. Одним из способов может быть использование анонимной функции :

.
() {echo There are $# non hidden files in the current directory} *(N)

Вместо *я использовал *(N), который является *, но с подстановочным квалификаторомN(для nullglob ), который делает так, что если шаблон *не соответствует ни одному файлу, вместо того, чтобы сообщать об ошибке, он вообще ничего не расширяет.

Расширение *(N)затем передается этой анонимной функции. Внутри этой анонимной функции этот список файлов доступен в массиве $@/ $argv, и мы получаем длину этого массива с $#(, такую ​​же, как $#argv, $#@, $#*или даже неудобный синтаксис ksh вроде${#argv[@]}).

4
27.01.2020, 21:53
files=(*)
printf 'There are %d files\n' "${#files[@]}"

или

set -- *
printf 'There are %d files\n' "$#"

Вы должны сначала назвать массив (, как я сделал выше с files), или использовать построенный -в массиве $@, заполнив его подстановочным знаком, как я сделал во втором примере. В первом "длина" (количество файлов )массива выполняется с помощью синтаксиса ${#arrayname[@]}. Количество элементов в построенном -массиве находится в $#.

3
27.01.2020, 21:53

Теги

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