Apa artinya "$ {- # * i}"! = "$ -" artinya?

37

Dalam /etc/profileaku melihat ini:

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

Apa ${-#*i}artinya Saya tidak dapat menemukan definisi awal ekspansi parameter ${-.

Pete
sumber

Jawaban:

40

$-adalah flag opsi saat ini ditetapkan oleh shell itu sendiri, pada doa, atau menggunakan setperintah 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 ikarakter pertama :

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

Dalam kasus Anda, if [ "${-#*i}" != "$-" ]periksa apakah shell Anda interaktif atau tidak.

cuonglm
sumber
23

Ada parameter shell $-. Dalam hal ini:

$ echo $-
himB

${-}sama seperti $-persis ${foo}sama dengan $foo.

#*iberarti: 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 inilai $-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
Hauke ​​Laging
sumber
4
Ini adalah POSIX-kompatibel , meskipun.
grawity