Двойные кавычки не помогают мне передать строковый аргумент с пробелами - PullRequest
1 голос
/ 27 апреля 2019

Я пишу несколько сценариев bash, чтобы упростить отправку заданий в вычислительный кластер с использованием oar синтаксиса , и для нужной мне опции говорят, что они используют синтаксис SQL (опция -p).

Для некоторого контекста, вот команда, которую я использую:

oarsub -q production -p "GPU = 'GTX 980'" -l "nodes=1,walltime=00:05" -I

Где я хочу иметь возможность изменять GTX 980 и 00:05 с заданными входамипользователем.

Я добился успеха, просто взяв время в качестве входа и оставив фиксированный графический процессор:

oarsub -q production -p "GPU = 'GTX 980'" -l "nodes=1,walltime=$1" -I

Я уже пробовал использовать двойные кавычки в качествеуказано в этих ответах 1 , 2 , 3 .Но похоже, что расширение параметров происходит следующим образом:

echo "$2"
oarsub -q production -p "GPU = "$2"" -l "nodes=1,walltime=$1" -I
manuel@machine$: bash job_script.sh 00:05 'GTX 980'
GTX 980
...
/!\ You asked for an Interactive job SO I will ignore arguments: 980 ; Is your syntax right?
...
[ADMISSION RULE] Job properties : (GPU = GTX) AND maintenance = 'NO'
Generate a job key...
Bad resource request (ERROR:  column "gtx" does not exist
LINE 4: ...alltime >= 300 OR max_walltime <= 0)) AND ((GPU = GTX) AND m...

Там, где кажется, что он не берет весь 'GTX 980' как завершенную строку, а вместо этого разделяет их на 'GTX'и' 980 'из-за предупреждения: /!\ You asked for an Interactive job SO I will ignore arguments: 980 ; Is your syntax right?.

Это способ передать имя GPU в качестве входного аргумента bash для команды?Или может быть какая-то проблема между тем, как bash форматирует и передает ввод в oarsub?

1 Ответ

0 голосов
/ 27 апреля 2019

Совет Огуз Исмаил в этот комментарий совершенно правильно. Однако, если значение другого позиционного параметра, $1, также может содержать пробелы, вы должны также процитировать его. И так как эти цитаты делают в противном случае, не указывайте, в любом случае:

oarsub -q production -p "GPU = '$2'" -l "nodes=1,walltime='$1'" -I

Обратите внимание: вызывающая оболочка расширяет это до что-то вроде

oarsub -q production -p GPU = 'blah blah' -l nodes=1,walltime='foo bar' -I

, где GPU = 'blah blah' и nodes=1,walltime='foo bar' обрабатываются как отдельные слова, которые передаются как oarsub как отдельные аргументы, как и должно быть.

Кроме того, как правило, нет необходимости иерархически вкладывать цитируемые части командной строки: вы можете просто объединить их, в основном так:

oarsub -q production -p 'GPU = '\'"$2"\' -l 'nodes=1,walltime='\'"$1"\' -I

Таким образом, вы полностью контролируете, какие части раскрываются и какие части могут быть разделены на слова. Однако это не обязательно в вашем случае. Таким образом, вы можете просто следовать приведенному выше предложению, которое намного проще для чтения и, следовательно, понятнее.

...