2012-02-20 4 views
1

공백이있는 쉘 인수 사이에 "{}"문자를 없애려고합니다. 예 :linux shell arguments를 이스케이프 처리합니다.

./cod4_start.sh 안녕하세요 28960 내가 두 번 인용 쉘은 {공백 HOSTNAME}으로 호스트 이름을보고, 비록 인수로 "공백 HOSTNAME"를 통과하면

"공백 HOSTNAME"

.

내 변수에 {} 문자가 없도록 스크립트에 전달하는 다른 인수가 있습니까?

set hostname [lindex $argv 5] 

그렇지 않으면 lrange 한 요소와 문자열로 구성하여 목록을 반환합니다 : 난 당신이 스크립트에서 lindex 대신 lrange를 사용해야합니다 생각

#!/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

: 여기

코드입니다 공백 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 : 네 - 네 말이 맞아. 나는이 두 변종을 추가했다. – 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" 
관련 문제