2009-05-25 2 views
22

По какой-то причине мне нужен мой скрипт, чтобы иметь возможность принимать аргументы с пробелами. Если, например, у меня есть сценарий, как следует,Передача аргумента, содержащего пространство в сценарии оболочки

for SOME_VAR in [email protected] 
do 
    echo "$SOME_VAR" 
    cd "$SOME_VAR" 
done; 

, если передать аргументы скрипта (если он называется foo.sh)

sh foo.sh "Hello world" 

Я ожидаю сценарий для печати Привет мир и смените каталог на «Hello world». Но я получаю сообщение об ошибке вместо

hello 
cd: 5: can't cd to hello 
world 
cd: 5: can't cd to world 

так как именно я прохожу спор с космическим полукокса в команду в скрипт ?!

ответ

40

Вы должны обернуть [email protected] в кавычки, тоже: "[email protected]"

Это говорит оболочке игнорировать пробелы в рассуждениях; он не превращает все аргументы в очень длинную строку.

+0

XD спасибо за ответ, я хотел был ответить на это сам, какое-то дополнительное объяснение http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST – Jeffrey04

+0

Но если $ @ - это список, вокруг него будет в основном слить его в одну длинную строку.Это не будет перебирать его правильно? И в этом случае нет реального использования в цикле for, нормальном 'echo '$ @"; cd "$ @ «' будет делать. Есть ли решение, в котором я могу иметь 'for i в' -constructs разграничение строки, но не пробел? –

+4

@AndreasWederbrand: Нет. «$ @» - это специальный токен, который означает «обернуть каждого человека аргумент в кавычках ". Таким образом,' a "bc" становится (или, скорее, остается) '" a "" bc "вместо" abc "или' "a" "b" "c". –