Якщо вам відомо, що поточний каталог містить принаймні один не прихований файл:
set -- *; echo "$#"
Це, очевидно, узагальнюється для будь-якого світу.
У сценарії це іноді невдалий побічний ефект перезапису позиційних параметрів. Ви можете обійти це за допомогою допоміжної оболонки або з функцією (версія Bourne / POSIX), наприклад:
count_words () {
eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"
Альтернативне рішення - це $(ls -d -- * | wc -l). Якщо глобус є *, команду можна скоротити до $(ls | wc -l). Розбір результатів lsзавжди викликає занепокоєння, але тут він повинен працювати до тих пір, поки імена ваших файлів не містять нових рядків, або якщо ви lsїх уникаєте. І $(ls -d -- * 2>/dev/null | wc -l)має перевагу граціозно керувати випадком невідповідного глобу (тобто він повертає 0 у такому випадку, тоді як для цього set *методу потрібно чітко перевірити, чи глобул може бути порожнім).
Якщо імена файлів можуть містити символи нового рядка, слід використовувати альтернативу $(ls -d ./* | grep -c /).
Будь-яке з тих рішень, які покладаються на передачу розширення глобулу, lsможе не працювати зі списком аргументів занадто довгою помилкою, якщо є багато файлів відповідності.