【发布时间】:2019-07-05 21:07:54
【问题描述】:
我正在尝试使用“ls”读取目录并对其进行操作
目录示例:
$ ls -1
x x
y y
z z
脚本文件:myScript.sh
#!/bin/bash
files=(`ls -1`);
for ((i=0; i<"${#files[@]}"; i+=1 )); do
echo "${files[$i]}"
done
然而,输出是
$ myScript.sh
x
x
y
y
z
z
但是,如果我按以下方式定义“文件”
$ files=("x x" "y y" "z z")
$ for ((i=0; i<"${#files[@]}"; i+=1 )); do echo "${files[$i]}"; done
x x
y y
z z
如何保留“files=(`ls -1`)”中的空格?
【问题讨论】:
-
for filename in *; do echo "$filename"; done?还是array=( * ); for ((i = 0; i < ${#array[@]}; i++)); do echo "${array[i]}"; done? 从不使用for i in $(ls anything),参见Bash Pitfalls #1 -
好的,除了在 "${array[$i]}" 中添加 $ 之外,2 中的两个示例都有效。我仍然不明白为什么可以使用“ls”来明确区分文件名,但是操作 (
ls -1) 会破坏它,但编写“*”可以正常工作。无论如何,谢谢您的建议,这比我最终找到的解决方案要好。 -
@DavidC.Rankin,...错误的文件名不仅来自随机的 dingbat,还来自错误。你听说过我关于 Python 库中缓冲区溢出导致 Python 脚本创建文件名的恐怖故事,该文件名导致维护同一目录的 shell 脚本删除
*?即使在没有操作员错误的情况下也会发生令人讨厌的事情。 -
是的,@CharlesDuffy,这句俏皮话更多地是一种“面面相觑”的同情,而不是一个包含噩梦文件名来源的包罗万象的列表。 (我什至是一个 dingbat,有时 3-liner 坏了,并吐出我很难摆脱的文件名
:)总而言之,吸取的教训是防止最坏的情况发生,而不是寄希望于它你的盒子上不存在。
标签: arrays bash ls spaces preserve