Answers:
$-
是外壳本身在调用时或使用set
内置命令设置的当前选项标志:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
是字符串删除的语法:(来自POSIX文档)
$ {parameter#[word]}
删除最小前缀模式。该词应扩展以产生样式。然后,参数扩展将产生参数,其前缀的最小部分被模式删除。如果存在,单词不应以不带引号的“#”开头。
$ {parameter ## [word]}
删除最大的前缀模式。该词应扩展以产生样式。然后,参数扩展将导致参数被删除,其中前缀的最大部分与模式匹配。
因此,${-#*i}
删除最短的字符串直到第一个i
字符:
$ echo "${-#*i}"
mBH
在您的情况下,请if [ "${-#*i}" != "$-" ]
检查您的外壳是否是交互式的。
有一个shell参数$-
。就我而言:
$ echo $-
himB
${-}
与$-
完全相同${foo}
相同$foo
。
#*i
表示:从变量值的开头删除(包括第一个)(尽可能少;在这里不起作用)i
。
$ echo "${-#*i}"
mB
换句话说:[ "${-#*i}" != "$-" ]
检查变量i
的值是否存在$-
,即检查外壳是否是交互式的。
换句话说,这是一种复杂且非伯恩兼容的书写方式:
case $- in
*i*) ...;;
*) ...;;
esac