我不确定该如何做,但我一直在尝试循环遍历不同的目录来创建多个文件。
例如:在当前目录中,有 3 个目录:
- 罗马帝国
- 卡萨罗马
- 埃菲尔铁塔
我的目的是光盘进入每个目录(使用循环和变量以防目录名称发生变化)在 shell 脚本中创建新文件夹,但在调用时,我在间距部分遇到了一些问题光盘。
调用代码的名称 Code,以下是我到目前为止尝试过的:
declare -a place
for d in */
do
place=("${place[@]}" "$d")
done
number=($(ls -lR | grep ^d | wc -l))
在这里,我们保存目录的名称
- 罗马帝国/
- 卡萨罗马/
- 埃菲尔铁塔/
和数字保存给定目录中的目录数,在本例中为:3。
for (( k=0 ; k < ${number} ; k++ ))
do
echo " This is place: ${place[k]} "
cd ${place[k]}
# Creating new files are not shown
cd ..
done
其结果是:
This is place: Roman Empire/
./Code.sh: line 4: cd: Roman: No such file or directory
任何关于如何做到这一点的帮助和指示都会很好
答案1
您收到的错误是因为在 bash 中(和最多其他 shell)形式扩展$var
或${var}
受单词拆分(和文件名生成,也称为通配符,尽管这不是这里的问题)的影响 - 请参阅什么时候需要双引号?
但是你可以大大简化你的代码。
不需要显式循环将目录列表放入数组中;你只需这样做
shopt -s nullglob place=( */ )
如果你喜欢循环,那么添加项目的更简单的方法是
place=() for d in */; do place+=("$d") done
无需执行诸如解析输出以
ls
获取计数之类的繁琐工作,因为您可以直接从数组中获取计数${#place[@]}
。因此ndirs=${#place[@]} for ((k=0; k<ndirs; k++)); do cd "${place[k]}" # do stuff cd - done
请注意,由于它们都是算术评估上下文,因此
ndirs
inside(( ... ))
和k
inside都不${place[k]}
需要显式地取消引用它们。$
你甚至不需要 C 风格的循环,你只需这样做
shopt -s nullglob place=( */ ) for p in "${place[@]}"; do cd "$p" # do stuff cd - done
(或者只是
for p in */; do ...
如果您不需要该数组用于任何其他目的)。