Saya memiliki skrip berikut untuk meluncurkan proses MySQL:
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
Apa artinya 1: 0: 1 dalam konteks ini?
Saya memiliki skrip berikut untuk meluncurkan proses MySQL:
if [ "${1:0:1}" = '-' ]; then
set -- mysqld_safe "$@"
fi
if [ "$1" = 'mysqld_safe' ]; then
DATADIR="/var/lib/mysql"
...
Apa artinya 1: 0: 1 dalam konteks ini?
Jawaban:
Ini adalah tes untuk -
opsi argumen putus - putus, rupanya. Agak aneh, sungguh. Ini menggunakan bash
ekspansi non-standar dalam upaya untuk mengekstraksi karakter pertama dan hanya karakter pertama dari $1
. Ini 0
adalah indeks karakter kepala dan 1
panjang string. Dalam [
test
seperti itu mungkin juga:
[ " -${1#?}" = " $1" ]
Tidak ada perbandingan yang cocok test
, karena ia menginterpretasikan -
argumen yang putus-putus - itulah sebabnya saya menggunakan ruang terdepan di sana.
Cara terbaik untuk melakukan hal semacam ini - dan cara biasanya dilakukan - adalah:
case $1 in -*) mysqld_safe "$@"; esac
${1:0:1}
adalah panjang, bukan indeks.
[[
: [[ $1 == -* ]]
.
[[ : [[
harus dilakukan
[[
hanya nama sintaks, dan titik dua hanyalah tanda baca.
Ini akan mengambil substring dari $1
0 ke karakter 1. Jadi Anda akan mendapatkan karakter pertama dan hanya karakter pertama dari string.
Dari bash
halaman manual 3.2:
${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.
Ini sedang menguji bahwa karakter pertama dari argumen pertama $1
adalah tanda hubung -
.
1: 0: 1 adalah nilai-nilai untuk ekspansi parameter: ${parameter:offset:length}
.
Itu berarti:
1
, yaitu:$1
0
(dinomori dari 0).Singkatnya: karakter pertama dari parameter posisi pertama $1
.
Perluasan parameter tersebut tersedia dalam ksh, bash, zsh (setidaknya).
Jika Anda ingin mengubah jalur tes:
[ "${1:0:1}" = "-" ]
Solusi bash yang lebih aman lainnya mungkin:
[[ $1 =~ ^- ]]
[[ $1 == -* ]]
Lebih aman karena ini tidak memiliki masalah dengan mengutip (tidak ada pemisahan dijalankan di dalam [[
)
Untuk cangkang yang lebih tua dan kurang mampu, dapat diubah menjadi:
[ "$(echo $1 | cut -c 1)" = "-" ]
[ "${1%%"${1#?}"}" = "-" ]
case $1 in -*) set -- mysqld_safe "$@";; esac
Hanya perintah case yang lebih tahan terhadap kesalahan mengutip.