Bagaimana saya bisa merujuk ke string dengan indeks di sh / bash? Artinya, pada dasarnya membelahnya.
Saya mencoba menghapus 5 karakter nama file. Semua nama memiliki struktur: name_nr_code. Saya mencoba untuk menghapus bit kode 5 alfanumerik. name_nr_
selalu 10 karakter.
Apakah ada sesuatu seperti;
for i in * ; do mv "$i" "$i"[:10] ; done
bash
memberi tag jika Anda memintash
solusi?Jawaban:
Sesederhana ini.
(pesta)
Voila.
Dan penjelasan dari Advanced Bash-Scripting Guide ( Bab 10. Memanipulasi Variabel ) , (dengan tambahan NOTEsebaris untuk menyoroti kesalahan dalam manual itu):
NOTEkutipan yang hilang di sekitar ekspansi parameter!
echo
tidak boleh digunakan untuk data sewenang-wenang.NOTE:
expr substr
adalah ekstensi GNU.NOTE: Itu
echo
berlebihan dan membuatnya bahkan kurang dapat diandalkan. Gunakanexpr substr + "$string1" 1 2
.NOTE:
expr
akan kembali dengan status keluar non-nol jika outputnya 0 (atau -0, 00 ...).BTW. Buku ini hadir dalam repositori resmi Ubuntu sebagai
abs-guide
.sumber
${var:1}
tidak mengembalikan nilai darivar
"posisi pertama", tetapi sebenarnya dari posisi kedua.Dalam POSIX
sh
,"${var%?????}"
adalah$var
dilucuti dari 5 karakter membuntuti terakhir (atau$var
jika$var
mengandung kurang dari 5 karakter)"${var%"${var#??????????}"}"
adalah 10 karakter pertama dari$var
."${var%_*}"
adalah$var
dilucuti dari string terpendek yang cocok_*
pada akhir$var
(foo_bar_baz
->foo_bar
)."${var%%_*}"
: pertandingan yang sama tetapi yang terpanjang dan bukan yang terpendek (foo_bar_baz
->foo
).foo_bar_
:"${var%"${var##*_}"}"
(${var##pattern}
sama seperti${var%%pattern}
tetapi mencari pola di awal,$var
bukan di akhir).Dengan
zsh
:$var[1,-6]
untuk karakter pertama ke 6 dari akhir (jadi semuanya kecuali 5 terakhir).$var[1,10]
untuk 10 karakter pertama.Dengan
ksh
,bash
atauzsh
:"${var:0:10}"
: 10 karakter pertama dari$var
Dengan
bash
atauzsh
:"${var:0:-5}"
: all kecuali 5 karakter terakhir (memberikan kesalahan dan keluar dari skrip jika$var
diset tetapi berisi kurang dari 5 karakter, juga saat$var
tidak diatur denganzsh
).Jika Anda memerlukan
sh
kompatibilitas Bourne , sangat sulit dilakukan dengan andal. Jika Anda dapat menjamin hasilnya tidak akan berakhir dalam karakter baris baru yang dapat Anda lakukan:Anda juga akan memiliki batas panjang
$var
(bervariasi antar sistem).Dalam semua solusi itu, jika
$var
berisi byte yang tidak dapat membentuk bagian dari karakter yang valid, YMMV.sumber
sh
tidak menyediakan cara bawaan untuk mengeluarkan substring dari string (sejauh yang saya bisa lihat), tetapi denganbash
Anda dapat melakukannyaIni akan memberi Anda sepuluh karakter pertama dari nilai variabel
i
.Format umum adalah
${variable:offset:length}
.sumber
Sebagian besar cangkang mendukung beberapa jenis perluasan parameter yang dapat membantu Anda. Di bash, Anda bisa menggunakan
Di
dash
, offset tidak didukung, tetapi Anda dapat menggunakan pola awal dan akhir:sumber
Pertama, jangan gunakan
for
loop untuk nama file.Maka, sesuatu seperti ini akan membantu.
sumber
for
nama file?printf
untuk menjadi lebih aman. ... danread -r
.for
Lingkaran OP baik-baik saja kecuali mungkin untuk yang hilang--
. Saya dapat melihat setidaknya 10 bug dalam 4 baris kode Anda! banyak di antaranya praktik buruk yang terkenal seperti menganggap nama file adalah satu baris, gunakan gema, kutipan yang hilang