[英]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.