2014-11-05 2 views
1

У меня есть это выражение:сделать СЕПГ удалить только если существует переменная

// Initially variables set to "" before process 

HOSTS_APACHE="" 

HOSTS="" 

// Some process ... 

export HOSTS_CANAL_TMP=$(echo $HOSTS | sed "s/$HOSTS_APACHE//") 

Это хорошо работает, когда Apache хостов существует в группе хостов (после обработки). Но это не работает, когда у меня есть группа хостов ($HOSTS), и у меня нет хоста apache для исключения.

Так что мне нужно подобное выражение, чтобы сделать SED $HOSTS_APACHE в случае, если есть апачи в $HOSTS и ничего не делать, если нет.

Теперь ошибка, когда не $HOSTS_APACHE исключить в $HOSTS

sed: -e expression #1, char 0: no previous regular expression 
+0

Используйте инструкцию 'if', чтобы проверить, есть ли что-либо в' $ HOSTS_APACHE'. – Barmar

+0

Это похоже на плохую идею. Что такое типичный контент '$ HOSTS' и' HOSTS_APACHE'? (из-за множественного числа, я боюсь, что хуже). Кроме того, ваша команда эквивалентна расширению параметра: 'export HOSTS_CANAL_TMP =" $ {HOSTS/$ HOSTS_APACHE /} "' (который не страдает от вашей проблемы), если у вас нет регулярного выражения в '$ HOSTS_APACHE '. Не могли бы вы объяснить, чего вы пытаетесь достичь (знаете, ProblemXY), вместо того, чтобы спрашивать о том, как вы думаете, решит ли ваша первоначальная проблема. –

ответ

2

Edit: Если я собираю ОП правильно, вопрос - или, возможно, второстепенный вопрос - это то, что HOSTS_APACHE является неупорядоченный, список хостов или имен хостов, разделенных пробелами. В этом случае решение следующим образом:

if [ -n "$HOSTS_APACHE" ]; then 
    HOSTS_CANAL_TMP=$(echo $HOSTS | sed "s/${HOSTS_APACHE// /\\|}//g") 
else 
    HOSTS_CANAL_TMP=$HOSTS 
fi 

Объяснение:

Если HOSTS_APACHE является "bar baz" то ${HOSTS_APACHE// /\\|} будет "baz\|bar". Расширение переменной с использованием double // является глобальной заменой символа «» (символа пробела) на \|.

Старый пост:

Там больше, чем один из способов достижения этой цели:

HOSTS_CANAL_TMP=$(echo $HOSTS | 
    if [ -n "$HOSTS_APACHE" ]; then 
     sed "s/$HOSTS_APACHE//" 
    else 
     cat # pass through 
    fi) 

[ -n STRING ] возвращает 0, если STRING имеет п на ноль длины.

Причина: |if ...; fi работает, потому что структура if действует как миниатюрная программа, которая принимает STDIN и записывает в STDOUT. Какая программа, которую он вызывает для обработки ввода-вывода, выбирается в соответствии с предложением if.

В качестве альтернативы можно использовать, если-то-иначе структуру вне субоболочки:

if [ -n "$HOSTS_APACHE" ]; then 
    HOSTS_CANAL_TMP=$(echo $HOSTS | sed "s/$HOSTS_APACHE//") 
else 
    HOSTS_CANAL_TMP=$HOSTS 
fi 
+0

У меня есть четыре хоста, два из них - апач. если порядок не то же самое, как и в апаче переменного, апач хост не удаляется из списка хостов HOSTS_APACHE = «BCD DEF» HOSTS = «а BCD CDE DEF» если [-n «$ HOSTS_APACHE» ]; затем экспорт HOSTS_CANAL_TMP = $ (эхо $ HOSTS | СЭД "с/$ HOSTS_APACHE //") еще экспорт HOSTS_CANAL_TMP = $ СОСТОЯЛСЯ фи – user3228279

+0

@ user3228279 я все еще возникают проблемы с пониманием того, что вы имеете в виду. – amphetamachine

+0

У меня есть две переменные ($ HOSTS и $ HOSTS_APACHE). Все значения в $ HOSTS_APACHE включены в $ HOSTS. Я хочу новую переменную с именем HOSTS_CANAL_TMP со всеми значениями, исключая те, которые находятся в $ HOSTS_APACHE. Когда: HOSTS_APACHE = "BCD CDE" HOSTS = "а BCD CDE DEF" Тогда: HOSTS_CANAL_TMP = "ABC DEF" Когда: HOSTS_APACHE = "BCD DEF" HOSTS = "а BCD CDE четкость " Затем: HOSTS_CANAL_TMP =" abc bcd cde def " – user3228279

1

Вам не нужно sed здесь вообще.

export HOSTS_CANAL_TMP=${HOSTS//"$HOSTS_APACHE"/} 

${var//str/subst} Синтаксис Bash-специфический (но так ставит export перед назначением, поэтому я предполагаю, что это безопасно здесь).

Однако вся проблема с описанием выглядит так: вместо этого вы должны использовать массив.

HOSTS=(foo bar baz) 
HOSTS_CANAL_TMP=("${HOSTS[@]/#$HOSTS_APACHE}") 

двойные кавычки для безопасности, но приведут к пустому элементу в HOSTS_CANAL_TMP. Если вы знаете, что значения в HOSTS можно безопасно использовать без кавычек, вы можете исправить это, извлекая двойные кавычки.

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