dash
Script saya mengambil parameter dalam bentuk hostname:port
, yaitu:
myhost:1234
Sedangkan port bersifat opsional, yaitu:
myhost
Saya perlu membaca host dan port menjadi variabel yang terpisah. Dalam kasus pertama, saya bisa melakukan:
HOST=${1%%:*}
PORT=${1##*:}
Tapi itu tidak berfungsi dalam kasus kedua, ketika port dihilangkan; echo ${1##*:}
hanya mengembalikan nama host, alih-alih string kosong.
Di Bash, saya bisa melakukan:
IFS=: read A B <<< asdf:111
Tapi itu tidak berhasil dash
.
Dapatkah saya membagi string di :
dalam dasbor, tanpa melibatkan program eksternal ( awk
, tr
, dll)?
%%
menjadikannya serakah (berlawanan dengan%
), jadi ia melakukan ini, setidaknya sebagian; itu tidak akan berhasil##
.Jawaban:
Kerjakan saja:
Anda mungkin ingin mengubah
case $1
tocase ${1##*[]]}
ke akun untuk nilai$1
like[::1]
(alamat IPv6 tanpa bagian port ).Untuk memecah, Anda dapat menggunakan operator split + glob (biarkan ekspansi parameter tidak dikutip) karena memang untuk itulah:
(meskipun itu tidak akan mengizinkan nama host yang mengandung titik dua (seperti untuk alamat IPv6 di atas)).
Operator split + glob tersebut menghalangi dan menyebabkan begitu banyak kerusakan pada sisa waktu sehingga akan tampak adil jika digunakan kapan saja diperlukan (walaupun, saya setuju itu sangat rumit untuk digunakan terutama mengingat POSIX
sh
tidak memiliki dukungan untuk ruang lingkup lokal, baik untuk variabel (di$IFS
sini) maupun untuk opsi (dinoglob
sini) (meskipunash
dan turunannya sepertidash
beberapa yang melakukannya (bersama-sama dengan implementasi AT&Tksh
,zsh
danbash
4.4 ke atas)).Catatan yang
IFS=: read A B <<< "$1"
memiliki beberapa masalah sendiri:-r
yang artinya backslash akan menjalani beberapa pemrosesan khusus.[::1]:443
menjadi[
dan:1]:443
bukannya[
ke string kosong (yang Anda butuhkanIFS=: read -r A B rest_ignored
atau[::1]
dan443
(yang Anda tidak dapat menggunakan pendekatan itu)-d ''
dalamzsh
ataubash
dan data tidak mengandung karakter NUL, tapi kemudian diketahui bahwa herestrings (atau heredocs) jangan menambahkan karakter baris baru ekstra!)zsh
( di mana sintaks berasal dari) danbash
, di sini string diimplementasikan menggunakan file sementara, sehingga umumnya kurang efisien daripada menggunakan${x#y}
atau membagi + operator glob.sumber
Hapus saja
:
dalam pernyataan terpisah; juga, hapus $ host dari input untuk mendapatkan port:sumber
Pikiran lain:
sumber
String di sini hanyalah pintasan sintaksis untuk dokumen baris tunggal di sini.
sumber