[“$ {1: 0: 1}” = '-'] Anlamı


18

Bir MySQL işlemi başlatmak için aşağıdaki komut dosyası var:

if [ "${1:0:1}" = '-' ]; then
    set -- mysqld_safe "$@"
fi

if [ "$1" = 'mysqld_safe' ]; then
    DATADIR="/var/lib/mysql"
...

1: 0: 1 bu bağlamda ne anlama geliyor?


1
Cevabı gerçekten bilmek istiyorum, ama bunun SF için çok dar bir soru olduğunu hissediyorum. Unix sitesine taşımak için oy veriyorum.
Massimo

Yanıtlar:


19

-Görünüşe göre, kesikli bir argüman seçeneği için bir test . Gerçekten biraz garip. bashİlk ve yalnızca ilk karakteri ayıklamak için standart olmayan bir genişleme kullanır $1. 0Baş karakter endeksidir ve 1dize uzunluğudur. Böyle bir [ testşekilde de olabilir:

[ " -${1#?}" = " $1" ]

Her iki karşılaştırma testda, -kesikli argümanları da yorumladığı için özellikle uygun değildir - bu yüzden orada önde gelen alanı kullanıyorum.

Bu tür bir şey yapmanın en iyi yolu - ve genellikle yapılış şekli -:

case $1 in -*) mysqld_safe "$@"; esac

1
Kapat; ikinci sütunu izleyen sayı ${1:0:1}, bir indeks değil, bir uzunluktur.
chepner

Bir bashism şekilde [[: [[ $1 == -* ]].
Arthur2e5

2
Şahsen bunların burada -bir sorun olacağını düşünmüyorum test.. POSIX anlamların argüman sayısına göre tanımlarını veriyor. İki argüman alan böyle bir seçenek olmadığından, ham olarak yazmak güvenli olmalıdır.
Arthur2e5

@ Arthur2e5 - haklısın - sorun olmamalı - ve büyük olasılıkla sorunlu değil. hala tuhaf bir yol - iyi uymuyor. ne gelmez [[ : [[mi?
mikeserv

1
@mikeserv Peki web sayfasına bakmalısınız (bunu başka bir yerden okuyorsanız) .. Yorumum 'START_CODE [[END_CODE: START_CODE [[$ 1 == - *]] END_CODE ile' gibiydi. Birincisi [[sadece sözdizimi adı ve iki nokta üst üste sadece bir noktalama işareti.
Arthur2e5

11

Bu, $10. karakterden 1. karaktere kadar bir alt dize alacaktır . Yani dizenin ilk karakterini ve sadece ilk karakterini alacaksınız.

Dan bash3.2 man sayfasında:

  ${parameter:offset}
  ${parameter:offset:length}
          Substring  Expansion.   Expands  to  up to length characters of
          parameter starting at the character specified  by  offset.   If
          length is omitted, expands to the substring of parameter start-
          ing at the character specified by offset.   length  and  offset
          are  arithmetic  expressions (see ARITHMETIC EVALUATION below).
          length must evaluate to a number greater than or equal to zero.
          If  offset  evaluates  to a number less than zero, the value is
          used as an offset from the end of the value of  parameter.   If
          parameter  is  @,  the  result  is length positional parameters
          beginning at offset.  If parameter is an array name indexed  by
          @ or *, the result is the length members of the array beginning
          with ${parameter[offset]}.  A negative offset is taken relative
          to  one  greater than the maximum index of the specified array.
          Note that a negative offset must be separated from the colon by
          at  least  one space to avoid being confused with the :- expan-
          sion.  Substring indexing is zero-based unless  the  positional
          parameters are used, in which case the indexing starts at 1.

6

İlk argümanın ilk karakterinin $1bir çizgi olduğunu test ediyor -.

1: 0: 1 parametre genişleme değerleri şunlardır: ${parameter:offset:length}.

Bunun anlamı:

  • Adı: adlı parametre 1, yani:$1
  • Başlangıç: ilk karakterden 0(0'dan başlayarak).
  • Uzunluk: 1 karakter için.

Kısacası: ilk konum parametresinin ilk karakteri $1.
Bu parametre genişletmesi ksh, bash, zsh (en azından) olarak mevcuttur.


Test satırını değiştirmek isterseniz:

[ "${1:0:1}" = "-" ]

Bash seçenekleri

Diğer daha güvenli bash çözümleri şunlar olabilir:

[[ $1 =~ ^- ]]
[[ $1 == -* ]]

Daha güvenli, çünkü bunun alıntı ile ilgili bir sorunu yok (içinde bölünme yapılmaz [[)

POSIXly seçenekleri.

Daha eski, daha az yetenekli mermiler için şu şekilde değiştirilebilir:

[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}"        = "-" ]
case $1 in  -*) set -- mysqld_safe "$@";; esac

Yalnızca büyük / küçük harf komutu yanlış alıntıya daha dayanıklıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.