Скрипт, а не функция. Это выводит количество символов в самом длинном имени файла, что я понял, что вы хотели:
#!/bin/bash
# include hidden files
shopt -s dotglob
# if the first argument is a directory
if [ -d "$1" ]; then
# move to that directory
cd "$1"
# set a variable to 0
long=0
# loop over all the files
for i in *; do
# print the filename - remove this line after testing
echo "$i"
# if the length of the current filename is longer
# than the value of the variable long, assign the
# length of the current filename to long
(( (${#i} > $long) )) && long=${#i}
done
# print the value of long
echo $long
# if the first argument wasn't a directory, print an error
else
printf "%s\n" "Not a directory"
fi
Это использует настройку dotglob, что приводит к тому, что с помощью * включение скрытых файлов , Чтобы увидеть его эффект, запустите эти команды в своем домашнем каталоге:
ls -d *
shopt -s dotglob
ls -d *
Чтобы отключить настройки shopt, используйте -u, например shopt -u dotglob.
Нам нужно проверить, что аргумент является каталогом, поэтому мы используем команды if и test (в форме [), которая имеет тест для каталогов, -d:
if [ -d "$1" ]; then
[d4 ] это означает, что если первый аргумент, переданный скрипту, является именем существующей директории, то выполните следующее. $1 является первым аргументом, и мы заключим его в двойные кавычки, чтобы остановить выполнение оболочки дополнительными расширениями для значения переменной. Нам нужно зайти в каталог, потому что нам нужно получить длина имени файла, а не весь путь (абсолютный или относительный). Мы не хотим этого:
$ for i in ~/*; do [ -d "$i" ] && echo "$i"; done
/home/zanna/custom
/home/zanna/Desktop
/home/zanna/Documents
/home/zanna/Downloads
...
, потому что, если мы сосчитаем длину $i, мы получим длину полного пути. Мы могли бы сделать некоторые текстовые обработчики (и, возможно, некоторые умные трюки, которых я не знаю), чтобы избавиться от пути, но разбор имен файлов обычно ненадежный, и если мы сменим каталог, мы сможем легко заставить оболочку подсчитывать символы для нас, используя [ f17], чтобы указать длину var (я считаю, что это количество символов, а не байтов). Обратите внимание, что скрипты выполняются в дочерней оболочке, а не в текущей оболочке, поэтому, если скрипт меняет каталог, рабочий каталог оболочки, вызывающей сценарий, не затрагивается.
В моем скрипте используется for для перебора файлов в каталоге. Линией, выполняющей работу, является
(( (${#i} > $long) )) && long=${#i}
Это означает, что если длина текущего значения i больше текущего значения long, тогда назначьте длину i к long. Поскольку мы сначала установили long в 0, первое имя файла всегда будет длиннее long (потому что оно как можно короче). После этого только длина более длинных имен файлов сможет заменить значение long. Поскольку мы знаем, что ${#i} и long будут содержать только целые числа, нам не нужно защищать их двойными кавычками. (( создает арифметический контекст в Bash, поэтому мы можем использовать > с его математическим значением (спасибо муру за указание на это в другом месте).
Если вы наберете команду
echo $PATH
, она отобразит ваш путь к команде или где будут найдены команды. Ваш текущий каталог будет отображаться как «.».
Самый простой способ запускать команды в вашем текущем каталоге:
./nuetrino_s1_1
[ f3] указывает системе на поиск команды в текущем каталоге [или $ PWD или present.working.directory].
Если вы наберете команду
echo $PATH
, она отобразит ваш путь к команде или где будут найдены команды. Ваш текущий каталог будет отображаться как «.».
Самый простой способ запускать команды в вашем текущем каталоге:
./nuetrino_s1_1
./ указывает системе на поиск команды в текущем каталоге [или $ PWD или present.working.directory].
Если вы наберете команду
echo $PATH
, она отобразит ваш путь к команде или где будут найдены команды. Ваш текущий каталог будет отображаться как «.».
Самый простой способ запускать команды в вашем текущем каталоге:
./nuetrino_s1_1
./ указывает системе на поиск команды в текущем каталоге [или $ PWD или present.working.directory].