Jawaban:
$-
adalah flag opsi saat ini ditetapkan oleh shell itu sendiri, pada doa, atau menggunakan set
perintah builtin:
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
adalah sintaks untuk penghapusan string: (dari dokumentasi POSIX )
$ {parameter # [word]}
Hapus Pola Awalan Terkecil. Kata harus diperluas untuk menghasilkan pola. Ekspansi parameter kemudian akan menghasilkan parameter, dengan bagian terkecil dari awalan yang cocok dengan pola dihapus. Jika ada, kata tidak akan dimulai dengan tanda kutip '#'.
$ {parameter ## [word]}
Hapus Pola Awalan Terbesar. Kata harus diperluas untuk menghasilkan pola. Ekspansi parameter kemudian akan menghasilkan parameter, dengan bagian terbesar dari awalan yang cocok dengan pola dihapus.
Jadi ${-#*i}
hapus string terpendek hingga i
karakter pertama :
$ echo "${-#*i}"
mBH
Dalam kasus Anda, if [ "${-#*i}" != "$-" ]
periksa apakah shell Anda interaktif atau tidak.
Ada parameter shell $-
. Dalam hal ini:
$ echo $-
himB
${-}
sama seperti $-
persis ${foo}
sama dengan $foo
.
#*i
berarti: Hapus (sesedikit mungkin; tidak membuat perbedaan di sini) dari awal nilai variabel hingga (termasuk) yang pertama i
.
$ echo "${-#*i}"
mB
Dengan kata lain: [ "${-#*i}" != "$-" ]
memeriksa apakah ada i
nilai $-
variabel, yaitu memeriksa apakah shell itu interaktif.
Dengan kata lain, ini adalah cara yang berbelit-belit dan tidak kompatibel Bourne untuk menulis:
case $- in
*i*) ...;;
*) ...;;
esac