我有一个名为 var 的变量,用于存储目录中的文件列表。我循环遍历所有文件,如果找到目录,我会将“目录”输出到屏幕上。代码如下:
var=$(ls dir)
for file in $var; do
if [ -d $dir/$file ]; then
echo "Directory"
fi
done
我有两个问题:
1st- 我在函数内部执行此操作,并且我希望 $file 变量保持本地状态,这样当我的函数结束时,我就无法访问它。我该如何将该变量设置为本地变量?我无法做到,for local file in $var;
也无法在循环之前声明 $file。
$(ls dir)
第二,当包含名称中有空格的文件时,我的循环不起作用。例如,如果$dir
有 3 个文件,文件 1、文件 2 和文件 3,$var
则只会将文件 1 和文件 3 保留为真实文件,但文件 2 不起作用,因为它会将其分为文件和文件 2。我该如何解决文件名称中有空格的问题?
答案1
为了使 $file 本地化:您可以local file
在分配给它之前使用。
对于有空格的文件:不解析 ls,使用通配符,并使用双引号将变量引用引起来:
local file
for file in "$dir"/*; do # Note that $file will contain $dir as well as the filename
if [ -d "$file" ]; then
echo "Directory: $file"
fi
done
如果要在开始循环之前存储文件名,请使用数组而不是普通变量:
local -a filelist
filelist=("$dir"/*)
local file
for file in "${filelist[@]}"; do
...
看BashFAQ #20:“如何查找并安全地处理包含换行符、空格或两者的文件名?”了解更复杂的例子和更多的技巧。