Что означает «$ {- # * 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} . Я не могу найти определение расширения параметра, начиная с ${- .

  • `eval` работает на Ubuntu, но не работает на Debian и Kali
  • Есть ли способ, использующий скрипт bash, чтобы получить местоположение изменений, сделанных в последнем git-коммите?
  • Как называется переменная окружения (?) С текущей шириной терминала?
  • Каковы некоторые из наиболее полезных алиасов и сценариев bash?
  • разделение строки в скрипте bash
  • Выбирать столбцы из файла csv переменной длины
  • Как явным образом установить tabname нового терминала gnome?
  • Есть ли элегантный способ установить переменную оболочки в содержимое файла?
  • 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 
    Linux и Unix - лучшая ОС в мире.