簡體   English   中英

在腳本shell bash中列出

[英]list in script shell bash

我做了這個劇本

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

嘗試這個:

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 (“如何讀取文件(數據流,變量)行-逐行(和/或逐場)?“)

將先前的答案與需要將文件列表存儲在變量中結合在一起。 你可以這樣做

echo -n "$list"|while read -r lin
do
 echo $lin
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM