Bir fonksiyon içeren bir bash betiği yazmaya çalışıyorum, böylece bir .tar
, .tar.bz2
, .tar.gz
vb. dosyası verildiğinde dosyayı açmak için ilgili anahtarlarla tar kullanır.
Sonunda ne olduğunu görmek için dosya adını test eden if elif then deyimlerini kullanıyorum ve regex metakarakterlerini kullanarak eşleşmesini sağlayamıyorum.
Komut satırında 'test' kullandığım betiği sürekli yeniden yazmaktan kurtarmak için aşağıdaki ifadenin çalışması gerektiğini düşündüm, mümkün olan her parantez, tırnak ve metakarakter kombinasyonunu denedim ve yine de başarısız oldu.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
Sorunun basit olduğundan eminim ve her yere baktım, ancak nasıl yapılacağını anlayamıyorum. Bunu nasıl yapabileceğimi bilen biri var mı?
Regex'leri eşleştirmek için =~
operatörünü kullanmanız gerekir.
Bunu dene:
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
Alternatif olarak, ==
operatörü ile joker karakterleri (regex yerine) kullanabilirsiniz:
[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched
Taşınabilirlik bir sorun değilse, daha güvenli ve daha güçlü olduğu için [
veya test
yerine [[
kullanmanızı öneririm. Ayrıntılar için [test, [ ve [[ arasındaki fark nedir?]1 bölümüne bakınız.
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}
Yukarıdaki yorumda Aquarius Power'a yanıt olarak, Regex'i bir var
üzerinde saklamamız gerekiyor
BASH_REMATCH değişkeni ifadeyi eşleştirdikten sonra ayarlanır ve ${BASH_REMATCH[n]} parantez içine alınmış n'inci grupla eşleşir, yani aşağıdaki ${BASH_REMATCH[1]} = "compressed"
ve ${BASH_REMATCH[2]} = ".gz"
if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]];
then
echo ${BASH_REMATCH[2]} ;
else
echo "Not proper format";
fi
(Yukarıdaki regex, dosya adlandırma ve uzantıları için geçerli bir regex değildir, ancak örnek için işe yarar)