2012-02-20 9 views
1

私は空白を含むシェル引数の間に "{}"文字を取り除こうとしています。例えば:Linuxシェルの引数をエスケープする

./cod4_start.shこんにちは28960私はそれが二重引用符で囲まれたシェルは、{スペースでHOSTNAME}としてホスト名を見ていていても、引数として "SPACES WITH HOSTNAME" を渡したら

"SPACES WITH HOSTNAME"

私の変数に{}文字が含まれないように、スクリプトに渡す引数はありますか?ここで

はコードです:

#!/usr/bin/expect -f 
set pssword [lrange $argv 0 0] 
set port [lrange $argv 1 1] 
set mod [lrange $argv 2 2] 
set map [lrange $argv 3 3] 
set num [lrange $argv 4 4] 
set hostname [lrange $argv 5 5] 
set rcon [lrange $argv 6 6] 
set password [lrange $argv 7 7] 
set gtype [lrange $argv 8 8] 
set slots [lrange $argv 9 9] 
spawn su - kod -c cd cod4 -c "nohup ./cod4_lnxded +set s_num=$num +set net_port $port +set dedicated 2 +set fs_game mods/$mod +set logfile 0 +set sv_punkbuster 1 +set sv_hostname \'$hostname\' +exec fastdl.cfg +set rcon_password $rcon +set g_password '$password' +set promod_mode match_mr10 +set g_gametype $gtype +set sv_maxclients $slots +set ui_maxclients $slots +map $map" > /dev/null 2>&1 & 
expect "Password:" { send "$pssword\r" } 
expect "# " { send "q" } 
exit 

答えて

5

私はあなたのスクリプトでlindex代わりのlrangeを使用する必要がありますね:

set hostname [lindex $argv 5] 

そうでない場合lrangeを持つ文字列からなる一つの要素でリストを返します。スペース。 TCL表記では、これは{string with spaces}のようなものです。

補遺:

シュレンクあなたはまたlassignを使用することができます通り(あなたのTCLのバージョンによって異なります)

lassign $argv pssword port mod map num hostname rcon password gtype slots 

またはforeachトリック:

foreach {pssword port mod map num hostname rcon password gtype slots} $argv break 
+1

または使用 'lassign'、(または複数の変数を持つ古いforeachのトリック):

は、ここでデータを取得する別の方法です。 – schlenk

+0

@schlenk:はい - そうです。私はこれら2つのバリエーションを追加しました。 – bmk

+0

@bmk +1私の答えよりいい! – TrojanName

1

あなたはカーリーを得ている理由括弧は、入力リストから要素のリストを返すlrangeを使用しているためです。リストから要素を取り出すlindexを使うことができます(文字列として返されます)。あまりにも仕事と

set params_list [list pssword port mod map num hostname rcon password gtype slots ] 
set i 0 
foreach param $params_list { 
set $param [lindex $argv $i] 
incr i 
} 
puts "Map is: $map" 
関連する問題