Альтернатива Bash Double Bracket Mult Match

Итак, вот выводы: Предположим, я создаю файлы в каталоге, скажем: john, alex_john, alex_john1 и john1, и я выполняю следующее:

[root@localhost ~]# ls | grep "john"
john
alex_john
alex_john1
john1
[root@localhost ~]# ls | grep "john\$"   <==here it would insert end of line
john
alex_john
[root@localhost ~]#  

Поэтому для второй группы будут напечатаны только файлы, заканчивающиеся на john.

-121--289103-

К мосту не добавлен физический интерфейс ( envmw ). Также необходимо перевести этот интерфейс в неразборчивый режим без IP-адреса:

brctl addif virbr0 envmw
ip addr add 0/0 dev envmw
ip addr del 192.168.66.1/24 dev envmw
ip link set envmw promisc on

Выполнение этих команд из удаленного сеанса - плохая идея, поскольку он изменяет конфигурацию интерфейса. Это, в свою очередь, приведет к отключению любого удаленного трафика, включая удаленный сеанс.

-121--289098-

Конечно:

N=444;M=555;echo "$(($N * $M))"

или

N=444;M=555;O="$(($N * $M))";echo $O

или

N=444;M=555;echo $N*$M | bc -l

Не забудьте запустить:

unset N && unset M

после однослойной оболочки, чтобы оболочка не загрязнялась бесполезными переменными.

1
04.08.2018, 01:26
3 ответа

На самом деле здесь можно использовать стандартные расширения параметров (вам просто не хватило подстановочного знака):

$ args=a:b:c:
$ x=b
$ echo "${args%$x:*}"
a:
$ if [ "$args" != "${args#*$x:}" ]; then echo 'b: is present'; fi
b: is present

(или в равной степени"${args%$x:*}")

Недостатком является то, что вам нужно поставить двоеточие после b, поэтому a:bили простое bне будет соответствовать, а также будет соответствовать a:bb:c. ([[ $var = *$x:* ]], а также очевидное совпадение шаблона с caseимеют тот же недостаток.)

Совпадение со всеми b, b:c, a:b, a:b:c, не совпадающее с a:bb:c, было бы немного сложнее. Все, о чем я могу думать, это что-то вроде этого:

args=a:b:c
x=b
IFS=:                   # affects globally
set -f                  # affects globally...
for x in $args; do
    if [ "$x" = "b" ]; then
        echo "b is present"
    fi
done

Если вы не хотите выписывать все случаи:

args=a:b:c
x=b
found=0
case "$args" in
    $x)     found=1;;
    $x:*)   found=1;;
    *:$x)   found=1;;
    *:$x:*) found=1;;
esac
if [ "$found" = 1 ]; then...; fi

Намного проще с регулярными выражениями (в Bash):

args=b:c
x=b
if [[ $args =~ (^|:)$x(:|$) ]]; then
    echo "b found"
fi
2
27.01.2020, 23:11

Следующее будет работать в sh:

if echo "$hasArgs" | grep -q "$x"; then
3
27.01.2020, 23:11

Это не одна -строка, но она вполне удобочитаема и может быть расширена для проверки любого количества аргументов:

hasArgs="a:b:c"
x=b
case "$hasArgs" in
    *$x*)
        echo "$x is present"
        ;;
esac
6
27.01.2020, 23:11

Теги

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