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

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 
  • Необходимо получить выход Awk в определенной последовательности
  • чтение из файла и изменение его шаблона в массив?
  • Вывод NamingVariable для нескольких файлов в сценарии Bash
  • Самый быстрый способ конкатенации файлов
  • Почему это сравнение не равно?
  • Использовать звездочку в переменных
  • Блокировка в сценарии оболочки
  • Запуск программы с / sbin / runningcript в /etc/init.d без создания осиротевшего процесса
  • как добавить файл в ipset в сценарий оболочки?
  • файл шаблона в качестве входа в RS, FS в awk / sed / grep для распознавания и добавления столбцов
  • одномерный массив в оболочке, не работающий для индексов больше 08
  • Если файл существует в каталоге, то ...?
  • Linux и Unix - лучшая ОС в мире.