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 ${-.

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.


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

4
Ini adalah POSIX-kompatibel , meskipun.
grawity
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.