Что означает «$ {- # * i}"! = "$ -" означает?

В /etc/profile я вижу следующее:

 for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$i" else . "$i" >/dev/null 2>&1 fi fi done 

Что означает ${-#*i} . Я не могу найти определение расширения параметра, начиная с ${- .

  • Описание списка пакетов
  • Как проверить несколько условий в выражении IF
  • Как найти и заменить содержимое для нескольких файлов в текущем каталоге с помощью сценария оболочки или Linux?
  • Как настроить mutt для отображения заголовка даты в моем локальном часовом поясе в пейджере?
  • скрипт запущен в .xinitrc остается в процессах
  • Выйти из Google Chrome с терминала
  • Печать эха в файле и запрос параллельно
  • Измените исполняемую ссылку для значка приложения в запуске GNOME 3
  • 2 Solutions collect form web for “Что означает «$ {- # * i}"! = "$ -" означает?”

    $- это текущие флаги опций, установленные самой оболочкой, при вызове или с использованием встроенной команды:

     $ echo $- himBH $ set -a $ echo $- ahimBH 

    "${-#*i}" является синтаксисом для удаления строки: (из документации POSIX )

    $ {Параметр # [слово]}

    Удалите шаблон минимального префикса. Слово должно быть расширено для создания шаблона. Затем расширение параметра должно приводить к параметру, причем наименьшая часть префикса, сопоставленная стилю, удаляется. Если присутствует, слово не должно начинаться с некотируемого «#».

    $ {Параметр ## [слово]}

    Удалите самый большой шаблон префикса. Слово должно быть расширено для создания шаблона. Затем расширение параметра должно приводить к параметру, причем наибольшая часть префикса совпадает с удаленным шаблоном.

    Таким образом, ${-#*i} удаляет кратчайшую строку до первого символа i :

     $ echo "${-#*i}" mBH 

    В вашем случае, if [ "${-#*i}" != "$-" ] проверяет, является ли ваша оболочка интерактивной или нет.

    Существует параметр оболочки $- . В моем случае:

     $ echo $- himB 

    ${-} совпадает с $- точно так же, как ${foo} совпадает с $foo .

    #*i означает: Удалить (как можно меньше, не имеет значения здесь) от начала значения переменной до (включая) первого i .

     $ echo "${-#*i}" mB 

    Другими словами: [ "${-#*i}" != "$-" ] проверяет, есть ли значение i в значении переменной $- , то есть оно проверяет, является ли оболочка интерактивной.

    Другими словами, это сложный и не-Bourne-совместимый способ записи:

     case $- in *i*) ...;; *) ...;; esac 
    Interesting Posts

    Можно ли найти время прошлых сеансов пользователя?

    Как найти общий размер файла, сгруппированный по расширению

    Принимая аргументы оболочки и обновляя значения

    UTF8 математические символы и раскладка клавиатуры / ввод

    Почему этот связанный с массивом код печатает индекс в конце каждой строки?

    echo $ PATH не отражает «экспорт PATH», который я сделал в сценарии оболочки

    сжатие lrzip не сокращает случайные данные

    Отправить / dev / video0 локальной машины на целевую машину / dev / video0

    Почему оператор printf в этом цикле выводит массив из последовательности?

    Как назначить одну переменную на слово строки

    Как получить название веб-сайта с помощью командной строки?

    Применение изменения к каждой строке?

    Прошивка ethernet "Tigon": сообщение об ошибке, хотя работает

    С несколькими процессами может ли один процесс (p1) отправлять сигнал синхронизации SIGALRM, который принимается двумя или более процессами (p1, p2).?

    Выбор источника адреса ULA IPv6

    Linux и Unix - лучшая ОС в мире.