如何使用读取变量的函数?

SeH*_*oon 6 bash

 #!/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
Run Code Online (Sandbox Code Playgroud)

这是我的代码。我想做的是当我找到目录然后打印:

     __
/---/  |
|   d  |
--------
"filename"
Run Code Online (Sandbox Code Playgroud)

Byt*_*der 12

你的函数调用是错误的:

Pdir($i)        # this is wrong
Run Code Online (Sandbox Code Playgroud)

在 Bash 中,您可以像调用二进制可执行文件一样调用函数,方法是将它们的名称写为命令并将所有参数放在其后面,用空格分隔并且不包含在任何类型的括号中:

Pdir $i         # this is correct, but not good
Run Code Online (Sandbox Code Playgroud)

请注意,您几乎应该总是将变量放在双引号中,以防止它们在包含空格时被拆分并解释为多个参数,因此编写它的最佳方法是:

Pdir "$i"       # this is how you do it
Run Code Online (Sandbox Code Playgroud)

另一个小错误是你需要if[test和test之间留一个空格。

您还应该再次引用该变量,并且建议使用更现代的$(...)命令替换语法而不是`...`. 请注意,即使替换本身被双引号包围,也允许在命令替换括号内使用双引号。

if [ "$(stat -c %F "${a[$i]}")" = "directory" ]
Run Code Online (Sandbox Code Playgroud)

而不是解释ls为什么解析ls)的输出,最好在当前目录中获取一组文件和目录,例如使用shell glob

a=(*)
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,这只返回非隐藏文件,即所有不以点开头的文件。要同时列出隐藏的文件和目录,dotglob请首先在脚本中启用shell 选项:

shopt -s dotglob
a=(*)
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 8

您可以使用 shell glob*/仅匹配目录 - 从而无需进行单独的目录检查:

a=(*/)
Run Code Online (Sandbox Code Playgroud)

您的第一个循环是不必要的 - 它所做的只是计算数组中的元素,您可以使用它 ${#a[@]}

在任何情况下,您实际上都不需要知道元素的数量来循环它们 - 您可以使用

for i in "${a[@]}"; do
  Pdir "$i"
done
Run Code Online (Sandbox Code Playgroud)

同样的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
Run Code Online (Sandbox Code Playgroud)

如果您确实想处理所有文件a=(*)并显式测试它们,那么stat您可以使用直接 shell 测试而不是使用

[ -d "$i" ]
Run Code Online (Sandbox Code Playgroud)

help test在 shell 中运行以查看选项)。