Как я могу использовать функцию, которая читает переменную?

 #!/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"
6
задан 11 June 2017 в 00:57

2 ответа

Можно использовать шарик оболочки */ для соответствия только каталогам - таким образом, устранение необходимости к к отдельной проверке каталога:

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 в оболочке для наблюдения опций).

8
ответ дан 23 November 2019 в 07:16

Ваш вызов функции является неправильным:

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=(*)
12
ответ дан 23 November 2019 в 07:16

Другие вопросы по тегам:

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