2015-03-11 5 views
0

Я боролся с этим в течение некоторого времени, но мои текущие заявления Баша выглядеть следующим образом:Chaining Bash Заявление

trim() { 
    local var="$*" 
    var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters 
    var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters 
    echo -n "$var" 
} 

с

CV=trim `$(cat somejson | grep '\"fdsaf\"' | sed 's/ "fasdf": "\(.*\)",/\1/')` 

Это терпит неудачу, потому что я считаю,

$(cat somejson | grep '\"fdsaf\"' | sed 's/ "fasdf": "\(.*\)",/\1/')

интерпретируется как команда bash и возникает ошибка.

Вместо этого я реструктурировать это в

CV=$(cat somejson | grep '\"dasf\"' | sed 's/ "fasd": "\(.*\)",/\1/') 
NEW_CV=$(trim $UNTRIMMED_PROD_NAME) 

Есть уборщик способ цепи эти две команды вместе? Мой отредактированный подход выглядит беспорядочным.

+1

Вам не нужно указывать 'echo -n' - bash автоматически обрезает завершающие символы новой строки для замены команд –

ответ

3

Предполагая, что CV и UNTRIMMED_PROD_NAME - та же переменная (опечатка), то да, просто вставьте $() бит.

NEW_CV=$(trim $(grep '\"dasf\"' somejson | sed 's/ "fasd": "\(.*\)",/\1/')) 

Ваш оригинальный CV=trim `....` не работает правильно, потому что вы забыли внешний $() и оболочки увидели, что, как:

Установка CV=trim в среде команды, которая будет работать с результатами бега вывод команды cat somejson | grep '\"fdsaf\"' | sed 's/ "fasdf": "\(.*\)",/\1/' (да, работает вывод, у вас есть два исполнения там).

CV=trim `$(cat somejson | grep '\"fdsaf\"' | sed 's/ "fasdf": "\(.*\)",/\1/')` 

первые расширяет внутреннюю команду $() и получает результат и заканчивается с

CV=trim `cat-grep-sed-result` 

затем расширяет выполнение команды кавычки (в cat-grep-sed-result строку, принятую в качестве команды), которая, вероятно, бросание ошибки и в результате получается пустая строка и заканчивается

CV=trim 

, который затем обрабатывается как назначение.

+0

Я исправил литеральные обратные ссылки, но я не знаю, сохранил ли я ваше первоначальное намерение. При необходимости переустановите. –

+0

@glennjackman По сути, спасибо. И вы учили (или, возможно, напомнили мне) об удвоении бэк-тетов. –

+1

Может также посоветуем о преобразовании 'grep foo | sed bar' только для 'sed '/ foo/bar'' – tripleee

Смежные вопросы