0

私は主にシェルファイルとPerlファイルのパイプラインを扱っており、それらはすべてパラメーター(パス)を次のファイルに渡します。1つのファイルを使用してすべてのパスを保存し、すべてのファイルに対してそれを呼び出す方がよいと判断しました。問題は、awkを使用して各ファイルの先頭にあるファイルを取得していることですが、これは多くの繰り返しであることが判明しています。

私の質問は、シェルがキーを使ってネイティブに何かを実行して値を返すことができるように、キーと値のペアをファイルに格納する方法があるかどうかわかりませんか?パイプラインは多くのスクリプトを使用し、特定のファイル内のマップによってパラメータがどこにでも渡されるため、外部ファイルにアクセスする必要があります。外部ファイルでマップ機能を実行する、私が知らないちょっとした癖はありますか?

4

2 に答える 2

3

bashにはがありmapfileますが、これはファイルの行を数値インデックス付き配列に読み取ります。空白で区切られたファイルを連想配列に読み込むには、

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

ただし、これはXY問題のように聞こえます。あなたが実際に行っていることの例を(コードで)教えていただけますか?grep | awk | sedの長いパイプラインを見ると、通常は単純化する方法があります。たとえば、パラメータによるデータの受け渡しは、stdout | stdinを介した受け渡しよりも優れていますか?

言い換えれば、私はあなたの声明に疑問を投げかけています。

于 2012-12-03T18:10:53.543 に答える
3

env var割り当てのファイルを作成し、必要に応じてそのファイルを入手できます。

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

. myEnvFileスクリプト内では、同じ機能のいずれかまたはより詳細なバージョンsourc myEnvFile(bashシェルを想定)を使用してソースを作成できます。

$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

于 2012-12-04T00:44:37.970 に答える