2017-12-13 21 views
0

シェルスクリプトを使っていくつかの文字列を解析する良い方法を探しています。文字列は、一部のアプリケーションでは呼び出しパラメータとして使用されます。シェルスクリプトを使用して複雑な文字列を解析する

のように、彼らはになります。私は唯一のシェルスクリプトを使用することを許可してい

parsingParams -c "id=uid5 prog=/opt/bin/example arg=\"-D -t5 >/dev/null 1>&2\" info='fdhff fd'" start 

。いくつかのsedとcutコマンドを使用しようとしましたが、何もうまく動作しません。

プログレの正しい値を返し
prog=$(echo [email protected] | cut -d= -f3 | sed 's|\s.*$||') 

が、私はそれを得るための良い方法を見つけることができなかった引数の値について:

私の試みは次のようにしています。 infoパラメータは省略可能でもあります。 誰でもこの問題を解決できる良いアイデアがありますか?あなたはシェルがあなたの入力文字列を解析できるようにevalを使用することができますように事前に 多くのおかげで

+0

あなたが分離された必要がある部分、すなわち、解析された欲しいものを正確に記述してください。これは、「正しい」ソリューションがどのように見えるかに大きな影響を与えます。 – DevSolar

+0

@DevSolar id、prog、arg、infoの値を抽出したいと思います。 –

+0

'parsingParams'の中から、それらを' -c "..." 'パラメータとして取得しますか? – DevSolar

答えて

1

evalの

$ eval "id=uid5 prog=/opt/bin/example arg=\"-D -t5 >/dev/null 1>&2\" info='fdhff fd'" 
$ echo $id 
uid5 
$ echo $prog 
/opt/bin/example 
$ echo $arg 
-D -t5 >/dev/null 1>&2 
$ echo $info 
fdhff fd 
+2

...ユーザーが提供したコードを評価するべきではないという大きな注意点があります... – DevSolar

+0

ユーザーが提供していれば、一度に1つずつvarを要求できます –

4

は見えるが、あなたが入力をコントロールしていない場合は(それが信頼できないソースから来る場合)大きな脆弱性が導入されます(攻撃者が何とか-c "rm -rf /"をあなたのプログラムに渡すと想像してください)。

より安全な方法は、ユーザー入力の許可された形式を明示的に指定することです。

有効なフィールド(コンテンツ、ないセパレーター)を指定した場合、スペースが引用されている場合は、(cut付き)空間上の分割を持っている問題は、回避することができ、GNU awkで、たとえば、あなたが使用することができますFPAT

var="val with spaces" 
var='val with spaces' 
var=val_no_spaces 

今ウィット:

$ params="id=uid5 prog=/opt/bin/example arg=\"-D -t5 >/dev/null 1>&2\" info='fdhff fd'" 
$ awk -v FPAT="[^=]+=(\"[^\"]*\"|'[^']*'|[^ ]*) *" '{for (i=1; i<=NF; i++) print $i}' <<<"$params" 
id=uid5 
prog=/opt/bin/example 
arg="-D -t5 >/dev/null 1>&2" 
info='fdhff fd' 

有効なフィールドは、次のいずれかの形式になります(改行と仮定するとparamsでは許可されていない1行に1つずつ、)時間の割り当てスプリット、あなたもcutで、さらにそれらを処理することができます

$ awk ... | cut -d $'\n' -f3 
arg="-D -t5 >/dev/null 1>&2" 
関連する問題