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?
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?
Yanıtlar:
-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:0:1}, bir indeks değil, bir uzunluktur.
[[: [[ $1 == -* ]].
[[ : [[mi?
[[sadece sözdizimi adı ve iki nokta üst üste sadece bir noktalama işareti.
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.
İ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ı:
1, yani:$10(0'dan başlayarak).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}" = "-" ]
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 [[)
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.