2016-10-31 4 views
1

При запуске test.sh Баш скриптАргумент Octave анализирует аргументы, разделенные пробелами, как передать многословный аргумент?

#!/bin/bash +x 

./test.m $* 

который вызывает исполняемый скрипт test.m GNU Octave, в одном из следующих способов:

./test.sh my argument 
./test.sh "my argument" 
./test.sh 'my argument' 

argv() всегда анализирующие эти две строки:

ans = 
{ 
    [1,1] = my 
    [2,1] = argument 
} 

Есть ли способ получить оба слова в одном аргументе, без дальнейшей обработки Результат? Или иначе, может ли разделительный символ отличаться от пустого?

Интересно, что сам bash действительно имеет значение от первого вызова и двух других. $1 получит оба слова в последнем случае и только «мой» в первом.

Во-вторых, как было бы, если аргументы хранятся в переменной перед посланного в скрипт Octave:

#!/bin/bash +x 

a="[email protected]" 

./test.m $a 

это даст тот же результат, два слова:

ans = 
{ 
    [1,1] = my 
    [2,1] = argument 
} 

В то время как используя ./test.m "$a"

#!/bin/bash +x 

a="[email protected]" 

./test.m "$a" 

будет иметь последствия передачи одного Тринг, в том числе всех аргументов: ./test.sh "my argument" other упакует my argument other вместе:

ans = 
{ 
    [1,1] = my argument other 
} 
+0

@Suever извините, обновляемой ! – nightcod3r

ответ

3

Вы должны быть в состоянии либо окружать строку с "" или избежать пробелов с \ при вызове октавы сценария

./test.m "hello world" 
./test.m hello\ world 

проблема, связанная с тем, что вы вызываете свой октавный скрипт из другого сценария bash и , что bash-скрипт не перенаправляет ваши правильно экранированные строки на октавный вызов, так как вы 'только с использованием $*, который некорректно.Если вы только хотите, чтобы ваш скрипт октаву иметь один вход, вы хотите, чтобы окружить $* с ""

#!bin/bash 
./test.m "$*" 

И вызвать его, используя:

./test.sh "hello world" 

{ 
    [1,1] = hello world 
} 

более надежный вариант, однако, является использовать "[email protected]", который будет пересылать все входы надлежащим образом и позволяют передавать несколько аргументов из нескольких слов

#!/bin/bash 
./test.m "[email protected]" 

и использовать его

./test.sh "hello world" "how are you" 

{ 
    [1,1] = hello world 
    [2,1] = how are you 
} 

Update

Как отметил @Benjamin упоминалось выше, если вы хотите сохранить входы, вы хотите, чтобы сохранить их в массиве

a=("[email protected]") 
./test.m "${a[@]}" 
+0

'' $ @ "' делает это. Но теперь, как бы это было, если аргументы хранятся в переменной до фактического вызова октавного скрипта (вопрос обновлен). – nightcod3r

+0

@ nightcod3r Ваше обновление не совсем ясно, что именно вы пытаетесь сделать и почему. Вы можете показать фактический код? Вероятно, гораздо лучший способ. – Suever

+0

Код включен в обновление. – nightcod3r

Смежные вопросы