передача нескольких аргументов через pipe

Есть разница между одинарными и двойными кавычками, и это не вопрос стиля. Одиночные кавычки будут буквально повторять то, что вы пишете, поэтому вы можете быть уверены, что то, что вы пишете, будет именно тем, что будет напечатано. С другой стороны, двойные кавычки будут интерполировать значение переменных.

Из man bash :

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

Заключение символов в двойные кавычки сохраняет буквальное значение всех символов внутри кавычек, за исключением $, обратной кавычки, \ и, если включено раскрытие истории,!. Символы $ и обратная кавычка сохраняют свое особое значение в двойных кавычках. Обратная косая черта сохраняет свое особое значение только в том случае, если за ней следует один из следующих символов: $, `,", \ или новая строка. Двойные кавычки можно заключить в двойные кавычки, поставив перед ними обратную косую черту. Если этот параметр включен, расширение истории будет выполняется, если символ! в двойных кавычках не экранирован обратной косой чертой. Обратная косая черта перед! не удаляется.

Итак, в вашем примере:

#!/bin/bash
PLACE="World"
echo "Hello $PLACE !"
echo 'Hello $PLACE !'

приведет к следующему результату:

Hello World !
Hello $PLACE !
1
22.05.2017, 20:59
2 ответа

Предполагая, что конечная строка имеет новую строку (иначе эта строка будет потеряна) и что cmd2 установлено что-то разумное, мощеная прокладка кода оболочки может выглядеть примерно так

#!/bin/sh
IFS=" "
while read word andtherest; do
    $cmd2 --argword="$word" --argtext="$andtherest"
done

так как все оставшиеся поля должны быть объединены в иостальные в соответствии с тем, как ведет себя read.

2
27.01.2020, 23:34

Попробуйте немного 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"
0
27.01.2020, 23:34

Теги

Похожие вопросы