Мартин прав насчет интерполяции: вам нужно использовать одинарные кавычки. Но учтите, что если вы пытаетесь передать аргументы команде, которая выполняется внутри строки, вам необходимо явно переслать их. Например, если у вас есть скрипт foo.sh вроде:
#!/bin/bash
echo 0:$0
echo 1:$1
echo 2:$2
Тогда вы должны назвать это так :
$ bash -c './foo.sh ${1+"$@"}' foo "bar baz"
0:./foo.sh
1:bar baz
2:
Или, в более общем смысле, bash -c '${0} ${1+"$@"}' <command> [argument]...
Не так :
$ bash -c ./foo.sh foo "bar baz"
0:./foo.sh
1:
2:
Не так :
$ bash -c './foo.sh $@' foo "bar baz"
0:./foo.sh
1:bar
2:baz
Это означает, что вы можете передавать аргументы подпроцессам, не встраивая их в командную строку и не беспокоясь о экранировании.