以下のようにconfファイルの内容があります。
ファイル.conf:
key name
value pswd
ここで、上記の2つの変数を含むスクリプトを作成したいと思います。
スクリプトファイル
key="name" #key as variable
value="pswd" #value as variable
. /path/to/file.conf
キーと値のコマンドが見つからないというエラーが発生しました。
答え1
努力する
awk 'NF>1 { var=$1 ; $1 = "" ; printf "%s=\"%s\"\n",var,$0; }' file.conf > script.sh
このawk行はデフォルトで最初のフィールド(3つ以上の場合)をvar名として使用し、行の残りの部分を値として使用します(したがって$1=""
ダーティトリック)。
Terdonが提案したように、提供された値にはスペースはありません。
awk '{print $1 "=" $2 }' file.conf > script.sh
答え2
シェルがBourneスタイルで、変数がvar="value"
GNUで定義されていると仮定すると、sed
次のことができます。
sed -i 's/ /="/;s/$/"/' file.conf
または
sed -i -e 's/ /="/' -e 's/$/"/' file.conf
または
perl -i -pe 's/ /="/;s/$/"/' file.conf
これらは基本的に同じ考えです。 GNUsed
とLinuxperl
では-i
、スイッチはファイルをその場で編集し、各入力行を置き換えますs/foo/bar/
。したがって、最初の置換は最初のスペースを置き換え、2番目の置換は行の末尾に()を追加します。foo
bar
="
"
$
これらすべてが次に変換されます。
key name
value pswd
key1 foo bar
これに関して:
key="name"
value="pswd"
key1="foo bar"
答え3
file.conf
あなたが望むものの私の解釈は少し異なります。つまり、シェル変数の割り当てセットであるかのようにソーシングする方法が必要です。だから代わりに
. /path/to/file.conf
試してみてください
eval `while read var val; do echo "${var}='${val}'"; done < /path/to/file.conf`
確認する必要がある形式は、file.conf
ここで説明されている形式から逸脱しないでください。
変数の割り当てがグローバルかどうかわからないので、ループ内のすべての割り当てに対してevalを呼び出すのではなく、出力全体に対して意図的にevalを使用しています。 (リダイレクトされた入力のためにサブシェルで行われた可能性があります。)確信していますか?試してみることができると思いました :-)
答え4
$
二重引用符内では、、"
バックスラッシュ、およびバックティック文字が依然として特別であるため、二重引用符は引用符に最適な選択ではない可能性があります。
代わりに一重引用符文字(key='name'
)を使用します。なぜなら、心配すべき唯一の文字は'
それ自体だからです。
sed "s/'/'\\\\''/g;s/ /='/;s/\$/'/" < file.conf > file.sh