dj_segfault'un işaret ettiği gibi, kabuk sizin için en iyisini yapabilir. Yine de, dize, daha düşük kasa için harici bir yere geri dönmek zorunda kalacak gibi görünüyor. Bunun için, yukarıdaki perl one-liners gibi pek çok seçeneğiniz var, ama bence muhtemelen en basit olanı.
# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`
burada sipariş
biraz önemlidir. Alt çizgilerden kurtulmak ve boşlukları altçizgilerle değiştirmek istiyoruz, bu yüzden önce alt çizgiler çizdiğimizden emin olmalıyız. Sonuna kadar olan şeyleri geçmek için beklemekle, sadece alfanümerik ve altçizgi olduğumuzu biliyoruz ve uzayımız olmadığından emin olabiliriz, bu yüzden kabuk tarafından yorumlanan özel karakterler hakkında endişelenmemize gerek yok.
Okuyucu için not: Bu işi yapmakta zorluk çekiyorsanız, bash veya sh'ı çağırıp aramadığınızı ve sisteminizin 'sh' şeklini nasıl yorumladığını görmek için shebang'ınızı kontrol edin. –
Bash 4'ten itibaren, aynı zamanda durum değişikliği de yapabilir. 'smallcase = $ {CLEAN ,,}' [Bash Hackers Wiki] (http: //wiki.bash-hackers.org/syntax/pe) parametre genişletmelerini, man sayfalarından daha fazla insan tarafından okunabilir bir şekilde açıklar. – toxalot
Güzel iş. Daha önce bu kabuk özelliklerinden haberdar değildim. Teşekkürler! Sadece zsh * bunların tümünü * yuvalayabileceğinizi keşfettim, bu yüzden hepsini bir satırda yapabilirsiniz: 'echo -n $ {$ {$ {str // _ /} ///_} // [^ a-zA-Z0-9 _] /} | tr A-Z a-z' .. bir betikte anlaşılmaz bir şey koymanızı öneriyorum. :) (düzenleme: biçimlendirme) –