我做了这个脚本
#!/bin/bash
liste=`ls -l`
for i in $liste
do
echo $i
done
问题是我希望脚本逐行显示每个结果,但它逐字显示:
我有 :
my_name
etud
4096
Oct
8
10:13
我想要:
my_name etud 4096 Oct 8 10:13
脚本的最终目的是分析每一行;这就是我希望能够恢复整条生产线的原因。也许该列表不是最好的解决方案,但我不知道如何恢复这些行。
首先,我们假设您的文件名都不包含换行符:
ls -l | IFS= while read -r line; do
echo "$line"
# Do whatever else you want with $line
done
如果您的文件名可能包含换行符,事情就会变得棘手。在这种情况下,最好(尽管速度较慢)用于stat
单独从每个文件中检索所需的元数据。请咨询man stat
有关您当地的各种stat
工作方式的详细信息,因为不幸的是它不是很标准化。
for f in *; do
line=$(stat -c "%U %n %s %y" "$f") # One possibility
# Work with $line as if it came from ls -l
done
将先前的答案与将文件列表存储在变量中的需要相结合。你可以这样做
echo -n "$list"|同时读取 -r lin 做 回声$林 完毕
你可以更换
echo $i
和
echo -n "$i "
echo -n 在没有换行符的情况下输出到控制台。
另一个用while循环而不用管道来做:
#!/bin/bash
while read line
do
echo "line: $line"
done < <(ls -l)
首先,我希望您没有真正ls
在您的真实代码中使用它,而只是将其用作示例。如果你想要一个文件列表,ls
是错误的工具;有关详细信息,请参阅http://mywiki.wooledge.org/ParsingLs。
其次,现代版本的 bash 有一个名为readarray
.
尝试这个:
readarray -t my_array < <(ls -l)
for entry in "${my_array[@]}"; do
read -a pieces <<<"$entry"
printf '<%s> ' "${pieces[@]}"; echo
done
首先,它创建一个数组(称为my_array
),其中包含正在运行的命令的所有输出。
然后,对于该输出中的每一行,它创建一个名为 的数组 pieces
,并发出带有箭头括号的每一部分。
如果您想一次读取一行,而不是一次读取整个文件,请参阅http://mywiki.wooledge.org/BashFAQ/001(“如何读取文件(数据流,变量)行-逐行(和/或逐场)?”)