2016-05-23 52 views
1

我正在接收我的主腳本的一個參數($ 1),這是一個文件,我應該讀取這些行。然後,我需要對這些行做一些操作,並將它們返回「固定」(已對它們執行操作,它們是新行)。我做這樣的:使用流水線從不同shell讀取行

cat "$1" | isValidParameters 

isValidParameters回報新線,這是我現在想讀入在我的主腳本的數組。我正在考慮做類似的事情:

while read -r -a arr; do 
    : 
done < $(cat "$1" | isValidParameters) 

但這似乎不起作用。我怎樣才能將我從isValidParameters收到的代碼讀入我的主腳本中的一個數組中,以便我可以在那裏對它們執行操作?謝謝。

---------------------------------------------- -------
我已經編輯我的代碼爲@chepner建議:

while IFS= read -r line; do 
    arr+=("$line") 
done < <(isValidParameters < "$1") 

printf "%s\n" "${arr[@]}" 

當我跑,我得到任何輸出。
我跑的是:./getApartments dos > output.txt

注:DOS是不是在我的目錄一個真實的文件,這些isValidParameters應打印:File is missing
這裏是isValidParameters

#!/bin/bash 
PATH=$PATH:. 

if(($# != 1 && $# != 3)); then 
    echo "Illegal or missing parameters" 
    exit 1 
fi 

if [[ !(-f $1) ]]; then echo "File is missing"; 
    exit 1 
fi 

#find . $1 \*.flat -print 

function search_file() { 
    #echo "$1" 

    for line in "$1"/*; do 
     if [[ $line == *.flat && -f "$line" ]]; then 
      echo "$line" 
     fi 

     if [[ $line == *.flat && -d "$line" ]]; then 
      search_file "$line" 
     fi 
    done 
} 

while read line; do 
    if [[ $line == *.flat && -f "$line" ]]; then 
     echo "$line" 
    fi 

    if [[ $line == *.flat && -d "$line" ]]; then 
     search_file "$line" 
    fi 
done < "$1" 

回答

1

read -a不讀取多行成的陣列;它將一行分割成字段並使用這些字段填充數組。如果您正在使用bash 4,你可以使用readArray命令:

readArray -t arr < <(isValidParameters < "$1") 

或追加到一個由線陣列線在早期版本的bash

while IFS= read -r line; do 
    arr+=("$line") 
done < <(isValidParameters < "$1") 
+0

是什麼'<(isValidParameters <「$ 1 「)'不同於'$(cat」$ 1「| isValidParameters)''? – LamaEu

+0

因爲'<'需要文件名,而不是文件的內容。 '<(...)'提供了一個「假」文件的名稱,從中可以讀取所附命令的輸出。 – chepner

+0

這是行不通的,tho:/ – LamaEu