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
. 0
Baş karakter endeksidir ve 1
dize uzunluğudur. Böyle bir [
test
şekilde de olabilir:
[ " -${1#?}" = " $1" ]
Her iki karşılaştırma test
da, -
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, $1
0. karakterden 1. karaktere kadar bir alt dize alacaktır . Yani dizenin ilk karakterini ve sadece ilk karakterini alacaksınız.
Dan bash
3.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 $1
bir çizgi olduğunu test ediyor -
.
1: 0: 1 parametre genişleme değerleri şunlardır: ${parameter:offset:length}
.
Bunun anlamı:
1
, yani:$1
0
(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.