Конечно, вы можете использовать цикл, но зачем вам использовать цикл, если он вам не нужен?
В оболочке есть все инструменты для перечисления файлов в каталоге и их подсчета. Основная идея (упакованная в функцию) - это
count_files () {
set *
echo $#
}
, т.е. установить позиционные аргументы в список имен файлов в текущем каталоге и вывести количество позиционных аргументов. Это не работает в нескольких крайних случаях:
-
, это интерпретируется как опция для установки
. Легко решается с помощью набора - *
. *
остается без изменений. Если вы хотите быть переносимым на оболочки POSIX, вам нужно обработать этот особый случай. Если вы можете позволить себе требовать ksh, bash или zsh, у них есть способы получше. .
). Их нужно включать отдельно. В glob . *
перечислены файлы точек, включая .
и ..
, кроме pdksh и всех других потомков оболочки Forsyth и zsh (и bash
, если GLOBIGNORE
не пусто). Предполагая, что их не следует считать, просто вычтите 2. Решение POSIX:
count_files () {
set -- * .*
if [ "$1" = "*" ] && ! [ -e "$1" ] && ! [ -L "$1" ]; then
shift # Remove the * which didn't match any file
fi
echo $#
}
Решение Ksh93:
function count_files {
typeset FIGNORE='@(.|..)'
set -- ~(N)
echo $#
}
Решение Bash:
count_files () (
shopt -s dotglob nullglob
set -- *
echo $#
)
Решение Zsh:
count_files () {
emulate -LR zsh
set -- *(DN)
echo $#
}
Решение грубой силы :Эмуляция USB-клавиатуры для отправки необходимых команд. (Вы должны потребовать от пользователя включить режим разработчика и перейти к определенному начальному состоянию, чтобы вы знали, какие нажатия клавиш требуются.)
Вы не будете первым, кто будет использовать фальшивую клавиатуру для развертывания Chromebook. См., например, Многоножка . Вы можете объединить клавиатуру и хранилище на одном USB-накопителе, который также действует как USB-концентратор, чтобы иметь несколько идентификаторов устройств.