#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
Apakah ada cara untuk merekatkan kedua garis ini menjadi satu garis?
bash
shell
shell-script
string
gsklee
sumber
sumber
sed
pasti akan diperlukan kurasa.Anda tidak dapat membuat sarang ekspansi di bash (atau di ksh, ash, dan shell lain selain dari zsh). Ini hanya batasan kosmetik, karena seperti yang Anda ilustrasikan, Anda dapat menetapkan ekspresi perantara ke variabel sementara. Agak menyebalkan untuk one-liners, tetapi dalam skrip lebih baik dibaca.
Anda bisa menghindari menggunakan utilitas eksternal
basename
dan menggunakan konstruksi manipulasi string sebagai gantinya:Di sini, itu terjadi bahwa Anda dapat menulis ulang skrip Anda untuk menempatkan substitusi perintah di luar . Itu bukan fenomena umum, Anda juga tidak mendapatkan apa pun selain perasaan satu garis tertentu.
Zsh, baik atau buruk, membuat Anda melakukan ekspansi sarang:
Atau Anda dapat menggunakan konstruksi bawaan zsh alih-alih
basename
:sumber
Saya akan pergi untuk:
Parameter kedua untuk nama file adalah sufiks yang akan dihapus dari nama file (lihat
man basename
)sumber
Anda bisa menggunakan satu
sed
perintah seperti berikut ini:sumber
Dengan menggabungkan
sed
, ini harus melakukan trik:(Ini tidak menjawab pertanyaan Anda karena saya tidak bisa; tidak yakin apakah itu mungkin.)
sumber
Bash
${}
constructs bekerja dengan nama variabel , jadi tidak ada cara untuk menyematkan perintah secara langsung. Pendekatan @ sr_ adalah alternatif jika Anda tidak keberatan dengan garpu tambahan.sumber
Garis
dapat dipersingkat dan dibuat lebih portabel dengan
sumber