2012-12-03 26 views
0

我正在處理主要是shell和Perl文件的管道,所有這些都將參數(路徑)傳遞給下一個。我決定使用單個文件來存儲所有路徑並且爲每個文件調用它會更好。問題是我使用awk在每個文件的開始處抓取文件,結果是很多重複。在shell腳本中管道的簡單映射

我的問題是:我不知道是否有方法將鍵值對存儲在文件中,以便shell可以本機地使用鍵執行某些操作並返回值?它需要訪問外部文件,因爲管道使用許多腳本,並且特定文件中的映射會導致參數在各處傳遞。是否有一些我不知道的在外部文件上執行映射功能的小怪癖?

回答

3

你可以的環境變量賦值和源文件是根據需要,即一個文件。

$ cat myEnvFile 
path1=/x/y/z 
path2=/w/xy 
path3=/r/s/t 
otherOpt1="-x" 

裏面你的腳本,你可與. myEnvFile源或更多versbose相同的特徵sourc myEnvFile(假設的bash shell)的版本,即根據您如何描述你的問題,這

$cat myScript 
#!/bin/bash 
. /path/to/myEnvFile 
# main logic below 
.... 
# references to defined var 
if [[ -d $path2 ]] ; then 
    cd $path2 
else 
    echo "no pa4h2=$path2 found, can't continue" 1>&1 
    exit 1 
fi 

應該可以很好地工作,併爲您的所有變量設置提供一站式服務。

IHTH

+0

它太瘋狂了,它可能會工作!謝謝! –

3

在bash中,有mapfile,但它將文件的行讀入數字索引數組。要讀取一個空格分隔的文件到一個關聯數組,我會

declare -A map 
while read key value; do 
    map[$key]=$value 
done < filename 

然而,這聽起來像一個XY problem。你能否給我們一個例子(在代碼中)你實際上在做什麼?當我看到grep | awk | sed的很長一段時間時,通常有一種方法可以簡化。例如,通過參數傳遞數據比通過stdout | stdin傳遞更好?

換句話說,我質疑你的聲明:「我決定這將是更好的... ...」

+0

當我知道什麼是XY問題時,我非常興奮。 無論如何,我有一個龐大的shell和perl文件管道。第一個需要約8個參數。然後它將它們傳遞給以下腳本。將這與其他保存路徑的變量結合起來,我的最終目標是讓整個管道有一個文件保存所有路徑。然後,只要它想要某個路徑,它就會引用該文件。現在,路徑是一個雙列文本文件,我使用awk + ​​regex來查找變量,就像一個古老的地圖結構。這是否回答你的問題? –

+0

這可能表明我有多少新手,我是在java中「長大」的。所以我決定在Java程序員的思維方面做得更好。它可能不會更好。 –

+0

+1對於XY問題的建議尤其如此。 –