Специальные символы в значении переменной экранируются

Скажем, я объявляю переменную var как var="ls | grep a". Тогда я ожидал бы, что команда $var будет работать точно так же, как ls | grep a, но вместо этого символ | читается как экранированный \|, так что он скорее печатает ошибку, сообщая, что ни один файл с именем \|, grep или a найден.

Мой вопрос: как я могу заставить Bash интерпретировать | в значении var как не экранированное?

Я должен использовать его в выражении case, таком как

[ 110]

(edit2): и заставить его возвращать It works! 1, если $option равно str1 или str2, и It works! 2, если $option равно str3 или str4. Это потому, что я пишу функцию, в которой шаблоны случая могут изменяться в соответствии с пользовательскими данными.

Хотя я не думаю, что это важно знать, я использую lxterminal в Lubuntu 12.04, а $BASH_VERSION - 4.2.25(1)-release.

Любая помощь приветствуется, спасибо!

1
задан 06.05.2020, 21:26

1 ответ

Если я понимаю ваш вопрос, это может быть тем, что вы хотите:

#!/bin/bash

var="a|b"
first_option=$(echo $var | cut -d"|" -f1)
second_option=$(echo $var | cut -d"|" -f2)

is_working? () {
  case $1 in 
    $first_option ) echo "It works!" ;;
    $second_option ) echo "It also works!" ;;
    *  ) echo "It does not work"
  esac
}

#1
option=a
is_working? $option

#2
option=b
is_working? $option

#2
option=c
is_working? $option
1
ответ дан 06.05.2020, 21:26
  • 1
    @AndreasT Ничто более тогда простое, проверьте мой ответ теперь. – magnetar 06.05.2020, 21:27
  • 2
    Почему инвертирование option и var? Если var="aa|b" я ожидал бы его " к work" если и только если $option или aa или b, но Ваш первый пример распечатал бы It works! так или иначе. Кроме того, что, если я имел case ${option} in ${var1} )...;; ${var2} )...? – Toby 06.05.2020, 21:27
  • 3
    @AndreasT хорошо, попробуйте его теперь – Community 06.05.2020, 21:28
  • 4
    Большое спасибо за Ваш ответ, но как @gniourf_gniourf прокомментировало, что я предполагаю I wasn' t очень ясный о том, что я имел в виду. Я хотел бы, чтобы случаи в операторе выбора были переменными, а также протестированная опция. Я немного отредактировал свой вопрос, надеясь, что он может разъяснить то, что я ищу:) – Toby 06.05.2020, 21:28
  • 5
    Я имею в виду, Ваши работы кода только для единственного символа ${option} значение – Learning stats by example 06.05.2020, 21:28

Теги

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