Saya perlu menggabungkan dua variabel untuk membuat nama file yang memiliki garis bawah. Mari kita memanggil variabel saya $FILENAME
dan di $EXTENSION
mana nama file dibaca dari file.
FILENAME=Hello
EXTENSION=WORLD.txt
Sekarang...
Saya telah mencoba yang berikut ini tanpa hasil:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Saya selalu mendapatkan semacam hasil aneh. Biasanya garis bawah dulu.
Saya membutuhkannya
echo $NAME
Hello_WORLD.txt
bash
shell-script
Rhyuk
sumber
sumber
Jawaban:
Anda dapat menggunakan sesuatu seperti ini:
Ini juga berfungsi:
sumber
echo
tidak mungkin bisa membantu. Perintah kedua sudah diberikan dalam pertanyaan.Anda:
semuanya baik-baik saja, jadi akan:
(tetapi tentu tidak
seperti itu menggunakanNAME=$(echo ${FILENAME}_${EXTENSION})
echo
dan yangsplit+glob
operator yang ).akan sama dengan:
as
_
(bertentangan dengan\
atau'
) adalah karakter yang valid dalam nama variabel.Masalah Anda adalah bahwa Anda memiliki garis yang dibatasi dengan CRLF dan bukan hanya LF, yang berarti bahwa konten variabel tersebut berakhir dengan karakter CR.
Karakter CR, ketika ditulis ke terminal memberitahu terminal untuk memindahkan kursor ke awal baris. Jadi
Hello<CR>_WORLD.TXT<CR>
ketika dikirim ke terminal akan ditampilkan sebagai_WORLD.TXT
(menimpaHello
).sumber
Saya sudah beralih menggunakan
${FILENAME}_${EXTENSION}
sintaks yang disebutkan di atas.Saya biasa menggunakan
$()
ketika saya harus menggabungkan dua variabel dengan garis bawah. Misalnya,$YYYYMMDD$()_$HHMMSS
untuk menghasilkan nama file yang berisi stempel waktu dalam format YYYYMMDD_HHMMSS. Bagian tengah$()
tidak menghasilkan apa-apa dan memecah dua variabel secara terpisah.Saya biasa
time
mengukur tugas menggunakan$YYYYMMDD$()_$HHMMSS
metode dan beberapa di atas, dan mereka semua melaporkan 0ms di server lama saya menggunakan ini. Kinerja sepertinya tidak menjadi masalah.sumber
$()
tidak garpu subkulit dalam beberapa shell (beberapa mengoptimalkannya). Ini juga membajak operator untuk sesuatu yang tidak dirancang untuknya.${x}_y
adalah apa yang kamu inginkan.Anda harus menggunakan variabel dalam huruf kecil (ini adalah praktik terbaik).
Jadi, saya akan menggunakan nama file dan ekstensi sebagai ganti FILENAME dan EXTENSION
Seperti yang Anda katakan bahwa "nama file dibaca dari file", saya akan menganggap bahwa skripnya adalah:
Dan Anda ingin menggabungkan kedua variabel $ nama file dan $ ekstensi dengan garis bawah
_
.Contoh yang Anda berikan (kecuali: tidak ada dobel \) berfungsi dengan benar di sini:
Seperti beberapa lainnya:
Jadi, masalah Anda bukan dengan bagaimana variabel tetap bersatu, tetapi dengan isi vars. Tampaknya masuk akal untuk berpikir bahwa ini:
akan membaca carriage carriage return
\r
jika membaca dari file windows.Salah satu solusi sederhana (untuk ksh, bash, zsh) adalah menghapus semua karakter kontrol dari variabel baca:
Ini bisa disimulasikan dengan nilai yang memiliki carriage return:
Atau, mengganti nilai
filename
:Kesimpulan.
Jadi ini:
Akan mendapatkan nilai yang benar
name
bahkan jika vars lain berisi karakter kontrol.sumber
Jawaban Stéphane Chazelas ,
tentu saja merupakan jawaban terbaik, dan harus menjadi jawaban yang diterima. Namun, dalam semangat jawaban pengguna208145 , berikut adalah alternatifnya:
sumber
Anda juga dapat menggunakan ini: pisahkan vars terpisah dengan spasi dan gabungkan mereka menggunakan tr untuk menghapus ruang.
sumber