Тест Shell для нахождения шаблона в строке

В сценарии оболочки:

if [ -t 0 ]; then
  echo stdin is a terminal
fi

В a perl сценарий:

print "stdin is a terminal\n" if -t;

В C:

if (isatty(0)) puts("stdin is a terminal");

Они все делают то же, сделайте tty определенное ioctl и возвратите true если ioctl сбои с ошибкой ENOTTY. В моей системе, ioctl TCGETS, и я полагаю, что это довольно распространено, поскольку это - очевидное.

$ : | strace -e ioctl su
ioctl(0, TCGETS, 0x7ffff32dfc50) = -1 ENOTTY (Inappropriate ioctl for device)
su: must be run from a terminal
8
28.03.2015, 01:01
2 ответа

Да, последние версии Bash могут сделать это:

$ pwd
/home/terdon
$ line="I'm in /home/terdon"
$ [[ "$line" =~ "$PWD"$ ]] && echo yes
yes

Тот же синтаксис работает в ZSH и KSH, но не в тире. Насколько я знаю, Dash не имеет таких возможностей.

Обратите внимание, что ваше Regeex проверяет, заканчивается ли переменная $ Line с $ PWD . Чтобы проверить, соответствует ли $ PWD в любой точке $ LINE , удалить $ :

$ line="I'm in /home/terdon, are you?"
$ [[ "$line" =~ "$PWD" ]] && echo yes
yes
4
27.01.2020, 20:09

В любой POSIX-совместимой оболочке вы можете сделать:

case $line in (*"$PWD"*)
#    whatever your then block had
;;esac

Это работает в bash, dash, и практически в любой другой оболочке, которую вы можете назвать.

Его также можно использовать для простой обработки нескольких возможностей. Например:

case $line in 
(*"$PWD"*)
    echo \$PWD match\!
;;
(*"$OLDPWD"*)
    echo \$OLDPWD match\!
;;
(*)
    ! echo no match\!
;;esac

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

case $line in (*"$PWD"*|*"$OLDPWD"*)
    echo '$OLDPWD|$PWD match!'
;;esac

Обратите внимание на использование кавычек выше:

  1. case $line ...
    • Объект оператора case не будет разделен ни на $IFS, ни использован в качестве шаблона для gen имен файлов. Это аналогично тому, как обрабатывается левый аргумент в тесте [[.
  2. (*"$PWD "*)
    • Здесь также расширение shell не подвергается ни $IFS, ни генерации имен файлов - расширение без кавычек не будет ни разбивать, ни глобализировать.
    • Однако здесь расширение без кавычек может быть истолковано как шаблон, а не как буквальная строка, и поэтому расширение может означать несколько вещей в зависимости от того, заключено оно в кавычки или нет.
    • Важно заключать в кавычки любую переменную, используемую в шаблоне, которая должна быть интерпретирована буквально, точно так же, как вы бы заключили в кавычки символы шаблона, которые вы хотите интерпретировать буквально.
    • Например, если $PWD содержит * и не заключена в кавычки, то она будет истолкована как объект шаблона, а не как буквальное * для поиска.
13
27.01.2020, 20:09

Теги

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