#!/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"
答案1
你的函数调用是错误的:
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
?),最好获取当前目录中的文件和目录数组例如使用 shell glob:
a=(*)
请注意,默认情况下,这仅返回非隐藏文件,即不以点开头的所有内容。要列出隐藏文件和目录,请先dotglob
在脚本中启用一次 shell 选项:
shopt -s dotglob
a=(*)
答案2
您可以使用 shell glob*/
仅匹配目录 - 从而无需进行单独的目录检查:
a=(*/)
您的第一个循环是不必要的 - 它所做的只是计算数组中的元素,您可以使用${#a[@]}
无论如何,你实际上并不需要知道元素的数量来循环它们 - 你可以使用
for i in "${a[@]}"; do
Pdir "$i"
done
还printf 比 echo 更好。 所以
#!/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
如果你做想要处理所有文件 iea=(*)
并明确测试它们,那么stat
你可以使用直接 shell 测试
[ -d "$i" ]
(在 shell 中运行help test
以查看选项)。