Saya mencoba untuk menulis sebuah bash script yang berisi fungsi sehingga ketika diberi .tar
, .tar.bz2
, .tar.gz
dll. file ini menggunakan tar dengan relevan switch untuk dekompresi file.
Saya menggunakan jika elif maka pernyataan yang menguji filename untuk melihat apa itu berakhir dan aku tidak bisa mendapatkannya untuk pertandingan menggunakan regex metakarakter.
Untuk menghemat terus-menerus menulis ulang script yang saya gunakan 'test' pada baris perintah, saya pikir pernyataan di bawah ini harus bekerja, saya telah mencoba setiap kombinasi dari tanda kurung, tanda kutip dan metacharaters mungkin dan masih gagal.
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $?
(this returns 1, false)
I'm yakin masalah adalah sederhana dan I've melihat di mana-mana, namun saya tidak bisa memahami bagaimana untuk melakukannya. Apakah seseorang yang tahu bagaimana saya bisa melakukan ini?
Untuk pertandingan regexes anda perlu menggunakan =~
operator.
Coba ini:
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
Atau, anda dapat menggunakan wildcard (bukan regexes) dengan ==
operator:
[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched
Jika portabilitas tidak perhatian, saya sarankan menggunakan [[
bukan [
atau tes
karena lebih aman dan lebih kuat. Melihat [Apa perbedaan antara tes, [ dan [[ ?]1 untuk rincian.
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
}
Dalam menanggapi Aquarius Kekuasaan di komentar di atas, Kita perlu untuk menyimpan regex pada var
Variabel BASH_REMATCH ditetapkan setelah anda mencocokkan ekspresi, dan ${BASH_REMATCH[n]} akan cocok nth kelompok dibungkus dalam kurung yaitu sebagai berikut ${BASH_REMATCH[1]} = "dikompresi"
dan ${BASH_REMATCH[2]} = ".gz"
if [[ "compressed.gz" =~ ^(.*)(\.[a-z]{1,5})$ ]];
then
echo ${BASH_REMATCH[2]} ;
else
echo "Not proper format";
fi
(Regex di atas isn't dimaksudkan untuk menjadi valid untuk penamaan file dan ekstensi, tapi itu bekerja untuk contoh)
Saya don't memiliki cukup rep untuk komentar di sini, jadi saya'm mengirimkan jawaban baru untuk meningkatkan dogbane's jawaban. Dot . di regexp
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo cocok
akan benar-benar cocok dengan karakter apapun, tidak hanya secara literal dot antara 'tar.bz2', misalnya
[[ sed-4.2.2.tar4bz2 =~ tar.bz2$ ]] && echo matched
[[ sed-4.2.2.tar§bz2 =~ tar.bz2$ ]] && echo matched
atau apa pun yang doesn't membutuhkan melarikan diri dengan '\'. Ketat sintaks maka harus
[[ sed-4.2.2.tar.bz2 =~ tar\.bz2$ ]] && echo matched
atau anda dapat pergi bahkan lebih ketat dan juga mencakup titik sebelumnya dalam regex:
[[ sed-4.2.2.tar.bz2 =~ \.tar\.bz2$ ]] && echo matched
Karena anda menggunakan bash, anda don't perlu membuat anak proses untuk melakukan hal ini. Berikut adalah salah satu solusi yang melakukan hal itu sepenuhnya berada bash:
[[ $TEST =~ ^(.*):\ +(.*)$ ]] && TEST=${BASH_REMATCH[1]}:${BASH_REMATCH[2]}
Penjelasan: kelompok sebelum dan setelah urutan "usus besar dan satu atau lebih ruang" disimpan oleh pola pertandingan operator di BASH_REMATCH array.