#!/bin/bash
declare -a a=(`ls`)
var=0
while [ -n "${a[$var]}" ]
do
var=`expr $var + 1`
done
Pdir(){
if[ "`stat -c %F ${a[$i]}`" = "directory" ]
then
echo " __ "
echo "/---/ |"
echo "| d |"
echo "--------"
echo "${a[$i]}"
else
echo "nope"
fi
}
for((i=0; i < var ; i++))
do
Pdir($i)
done
Это - мой код. То, что я хочу сделать, - когда я нахожу, что каталог затем печатает:
__
/---/ |
| d |
--------
"filename"
Можно использовать шарик оболочки */
для соответствия только каталогам - таким образом, устранение необходимости к к отдельной проверке каталога:
a=(*/)
Ваш первый цикл является ненужным - все, что он делает считать элементы в массиве, который можно получить использование ${#a[@]}
В любом случае, Вы не должны на самом деле знать число элементов для цикличного выполнения по ним - можно использовать
for i in "${a[@]}"; do
Pdir "$i"
done
Также , printf лучше, чем эхо . Так
#!/bin/bash
Pdir(){
printf '%s\n%s\n%s\n%s\n' \
" __ " \
"/---/ |" \
"| d |" \
"--------" \
"$1"
}
shopt -s nullglob
dirs=(*/)
for d in "${dirs[@]}"; do
Pdir "$d"
done
<час> , Если Вы делаете , хотят обработать все файлы т.е. a=(*)
и протестировать их явно, затем вместо того, чтобы использовать stat
можно использовать прямой тест оболочки
[ -d "$i" ]
(работайте help test
в оболочке для наблюдения опций).
Ваш вызов функции является неправильным:
Pdir($i) # this is wrong
В Bash Вы вызываете функции точно так же, как Вы вызвали бы двоичные исполняемые файлы, путем написания их имени как команды и помещения всех аргументов позади него, разделенный с пробелами и не включенные в любой вид скобок:
Pdir $i # this is correct, but not good
Обратите внимание, что необходимо почти всегда помещать переменные в двойные кавычки, чтобы препятствовать тому, чтобы они будили разделение и интерпретируемый как несколько аргументов, если они содержат пробелы, таким образом, оптимальный способ записать это был бы:
Pdir "$i" # this is how you do it
Другая крошечная ошибка состоит в том, что Вам нужно пространство между if
и [
тест.
Необходимо также заключить переменную в кавычки снова, и рекомендуется использовать более современное $(...)
синтаксис замены команды вместо `...`
. Обратите внимание, что двойные кавычки в фигурных скобках замены команды позволяются, даже если сама замена окружается двойными кавычками.
if [ "$(stat -c %F "${a[$i]}")" = "directory" ]
И вместо того, чтобы интерпретировать вывод ls
(Почему бы не проанализировать ls
?), это лучше для получения массива файлов и каталогов в текущем каталоге, например, использовании шарика оболочки:
a=(*)
Обратите внимание, что по умолчанию это только возвращает нескрытые файлы, т.е. все, что не запускается с точки. Чтобы также перечислить скрытые файлы и каталоги включите dotglob
опция оболочки в Вашем сценарии однажды сначала:
shopt -s dotglob
a=(*)