Условное выражение ANDed, использующее regexp и переменные

Как уже сказано Caleb, ! используется для вызова замены истории удара.

Если как я Вы чувствуете, что Вам не нужна такая функция, можно отключить ее вставляющий следующую строку в ~/.bashrc:

set +H

Мне не нужен он, потому что история может быть восстановлена стрелкой вверх и Ctrl-r возрастающий обратный поиск. См. страницу руководства удара, раздел Commands for Manipulating the History для подробного списка ярлыков.

3
06.04.2011, 23:40
2 ответа

Похож на простую ошибку: ${ENDOFLINE%$} полосы a $ в конце $ENDOFLINE, но то, что Вы хотите сделать, использовать $ENDOFLINE буквально и имейте a $ после него для указания на конец строки.

if [[ ("$LINE" =~ "^#;") && (( ("$LINE" =~ "${ENDOFLINE}$") )) ]];

Это работает в zsh, но не в ksh или ударе. Bash требует regexp $ закрыться кавычки (иначе, это интерпретируется буквально), и ksh не нравятся двойные круглые скобки внутри [[ … ]] (это интерпретирует их как арифметическую инструкцию). Эти более простые работы строки во всех трех оболочках (отмечают это [[…]] одно из нескольких мест, где Вам не нужно "…" вокруг переменных расширений):

if [[ $LINE =~ ^"#;" && $LINE =~ $ENDOFLINE$ ]];

Если $ENDOFLINE никогда перекрытия с #; (например, если ENDOFLINE ;foo, Вы будете принимать #;;foo но отклонение #;foo), можно уменьшить это до единственного теста:

if [[ $LINE =~ ^"#;".*$ENDOFLINE$ ]];

Можно также использовать подстановочный шаблон вместо regexp здесь:

if [[ $LINE = "#;"*"$ENDOFLINE" ]];

[[…]] конструкция не существует во всех оболочках, это характерно для удара, ksh и zsh. На других оболочках (Граница, тире, что-либо POSIX), можно сделать подстановочные соответствия с case конструкция:

case $LINE in
  "#;"*"$ENDOFLINE") echo score;;
  *) echo no score;;
esac
6
27.01.2020, 21:15
  • 1
    псевдонима Большое спасибо. Ваша 'более простая' версия - то, в чем я нуждаюсь. Спасибо также за инструкцию относительно синтаксиса [[...]]. Я не мог найти ответ на свой вопрос онлайн, и я попробовал много вариантов кода, который я отправил здесь. Я боюсь свое понимание regexp на различных языках, в которых я кодирую, часто находится, желая. –  bev 07.04.2011, 00:03
  • 2
    я ценю дополнения к Вашему исходному ответу, и 'один тест' выражение и подстановочная тестовая работа в моем сценарии и подстановочный знак, отвечает на другой из моих вопросов. Я не понял, что подстановочный знак был возможен в том контексте. Пример 'случая' кажется очевидным, но я не думал о нем. У меня есть другой regexp вопрос, так как это было, был такой успех, который я отправлю через минуту. –  bev 07.04.2011, 01:57

Можно также сделать это использование grep:

end=blah
while read line; do
    if grep -Eq "^#;.*$end$" <<< "$line"; then
        echo score!
    else
        echo no score
    fi
done

(Это находится в ударе; синтаксис может немного отличаться в других оболочках, но принцип является тем же.)

0
27.01.2020, 21:15
  • 1
    у grep, но не, если Вы собираетесь использовать его в цикле. Замените целый цикл grep -q "^#;.*$end\$" <&3. –  Gilles 'SO- stop being evil' 07.04.2011, 00:58
  • 2
    Спасибо за Ваше предложение. Я помещаю Ваш ответ в свой файл примечаний для дальнейшего использования. Другое решение я не рассмотрел... –  bev 07.04.2011, 02:01

Теги

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