My Bash script отправляет набор (несколько) параметров в программу C.
Это мой C программа :
$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main( int argc, char **argv )
{
printf("Parameter 1 is: %s \n", argv[1]);
printf("Parameter 2 is: %s \n", argv[2]);
return 0;
}
После компиляции (как MyCProgram
) она ведет себя нормально:
MyCProgram -f "/path/to/file/with spaces"
Parameter 1 is: -f
Parameter 2 is: /path/to/file/with spaces
Но при попытке отправить ей параметры через оболочку переменная :
$ var='-f "/path/to/file/with spaces" '
$ MyCProgram $var
Parameter 1 is: -f
Parameter 2 is: "/path/to/file/with
$ MyCProgram "$var"
Parameter 1 is: -f "/path/to/file/with spaces"
Parameter 2 is: (null)
$ MyCProgram '$var'
Parameter 1 is: $var
Parameter 2 is: (null)
$ MyCProgram "$(echo $var)"
Parameter 1 is: -f "/path/to/file/with spaces"
Parameter 2 is: (null)
$ MyCProgram "$(echo "$var")"
Parameter 1 is: -f "/path/to/file/with spaces"
Parameter 2 is: (null)
$ MyCProgram "$(echo '$var')"
Parameter 1 is: $var
Parameter 2 is: (null)
$ MyCProgram '$(echo "$var")'
Parameter 1 is: $(echo "$var")
Parameter 2 is: (null)
$ var="-f '/path/to/file/with spaces' "
$ MyCProgram $var
Parameter 1 is: -f
Parameter 2 is: '/path/to/file/with
Как мне получить правильное поведение , это так же, как при запуске без переменных оболочки?
Примечания :
После Крейг Эстей ответ , это прекрасно работает:
$ var=(-f "/file with spaces")
$ MyCProgram "${var[@]}"
Этот метод работает, но только если я вручную (явно) присваиваю значение var
. Предполагая, что var уже назначен (т. Е. Через чтение входных данных или чтение файлов), я бы сказал, что проблема здесь заключается в переносе его в переменную массива bash. Итак:
$ var='-f "/file with spaces"'
$ var2=( $var )
$ MyCProgram "${var2[@]}"
Parameter 1 is: -f
Parameter 2 is: "/file
Проблема все еще существует.