Экранирование аргументов оболочки Linux - PullRequest
1 голос
/ 20 февраля 2012

Я пытаюсь избавиться от символов "{}" между аргументами оболочки, в которых есть пробелы. например:

. / Cod4_start.sh привет 28960 "ХОЗЯЙКА С ПРОСТРАНСТВОМ"

Как только я передаю "HOSTNAME WITH SPACES" в качестве аргумента, даже если оболочка с двойными кавычками видит имя хоста как {HOSTNAME WITH SPACES}.

Есть ли какой-либо другой аргумент, передаваемый скрипту, чтобы в моих переменных не было символов {}?

Вот код:

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

Ответы [ 2 ]

5 голосов
/ 20 февраля 2012

Полагаю, вам следует использовать 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 голос
/ 20 февраля 2012

Причина, по которой вы получаете фигурные скобки, заключается в том, что вы используете 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"
...