1

我做了这个脚本

#!/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

脚本的最终目的是分析每一行;这就是我希望能够恢复整条生产线的原因。也许该列表不是最好的解决方案,但我不知道如何恢复这些行。

4

5 回答 5

1

首先,我们假设您的文件名都不包含换行符:

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
于 2013-10-10T17:30:45.863 回答
0

将先前的答案与将文件列表存储在变量中的需要相结合。你可以这样做

echo -n "$list"|同时读取 -r lin
做
 回声$林
完毕
于 2013-10-10T20:16:51.730 回答
0

你可以更换

echo $i

echo -n "$i "

echo -n 在没有换行符的情况下输出到控制台。

于 2013-10-10T16:37:06.677 回答
0

另一个用while循环而不用管道来做:

#!/bin/bash

while read line
do
    echo "line: $line"
done < <(ls -l)
于 2013-10-10T16:55:46.813 回答
0

首先,我希望您没有真正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(“如何读取文件(数据流,变量)行-逐行(和/或逐场)?”)

于 2013-10-10T17:02:40.900 回答