Есть разница между одинарными и двойными кавычками, и это не вопрос стиля. Одиночные кавычки будут буквально повторять то, что вы пишете, поэтому вы можете быть уверены, что то, что вы пишете, будет именно тем, что будет напечатано. С другой стороны, двойные кавычки будут интерполировать значение переменных.
Из man bash
:
Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа внутри кавычек. Одиночные кавычки не могут находиться между одинарными кавычками, даже если им предшествует обратная косая черта.
Заключение символов в двойные кавычки сохраняет буквальное значение всех символов внутри кавычек, за исключением $, обратной кавычки, \ и, если включено раскрытие истории,!. Символы $ и обратная кавычка сохраняют свое особое значение в двойных кавычках. Обратная косая черта сохраняет свое особое значение только в том случае, если за ней следует один из следующих символов: $, `,", \ или новая строка. Двойные кавычки можно заключить в двойные кавычки, поставив перед ними обратную косую черту. Если этот параметр включен, расширение истории будет выполняется, если символ! в двойных кавычках не экранирован обратной косой чертой. Обратная косая черта перед! не удаляется.
Итак, в вашем примере:
#!/bin/bash
PLACE="World"
echo "Hello $PLACE !"
echo 'Hello $PLACE !'
приведет к следующему результату:
Hello World !
Hello $PLACE !
Предполагая, что конечная строка имеет новую строку (иначе эта строка будет потеряна) и что cmd2
установлено что-то разумное, мощеная прокладка кода оболочки может выглядеть примерно так
#!/bin/sh
IFS=" "
while read word andtherest; do
$cmd2 --argword="$word" --argtext="$andtherest"
done
так как все оставшиеся поля должны быть объединены в иостальные
в соответствии с тем, как ведет себя read
.
Попробуйте немного awk:
/usr/bin/awk -f
{
cmd=$1;
gsub($1 " +", "")
printf("%s --argword=%s --argtext=\"%s\"\n", cmd2, cmd, $0)
}
Этот вывод принимает переменную awk в качестве имени для cmd2 .
Вы можете проверить это следующим образом:
$ echo "word1 text with spaces and so on" |
awk -v cmd2=foo '{ cmd=$1; gsub($1 " +", ""); printf("%s --argword=%s --argtext=\"%s\"\n", cmd2, cmd, $0) }'
foo --argword=word1 --argtext="text with spaces and so on"