Bash: irisan parameter posisi


19

Bagaimana saya bisa mendapatkan sepotong $@di Bash tanpa terlebih dahulu harus menyalin semua parameter posisi ke array lain seperti ini?

argv=( "$@" )
echo "${argv[@]:2}";

1
Selalu mengutip "$@". argvTugas Anda akan pecah jika ada argumen yang berisi spasi.
jordanm

Jawaban:


31

Anda dapat menggunakan format yang sama dengan array lainnya. Untuk mengekstrak elemen ke-2 dan ke-3 $@, Anda harus melakukan:

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 

1
Tetapi ini tampaknya bekerja dengan basis char by char di v4.1.2, apakah ada cara untuk melakukannya berdasarkan kata per kata?
Alexej Magura

@AlexejMagura Saya tidak mengerti maksud Anda. Itu bertindak pada elemen-elemen array. Jika Anda memiliki elemen satu karakter, itu akan berfungsi "pada karakter". Jika setiap elemen adalah kata, itu berfungsi pada kata-kata. Apakah Anda mungkin mencoba ini pada string dan bukan array?
terdon

Saya mencobanya pada salinan "$ @", yang saya kira mungkin menjadi string pada saat itu, saya tidak yakin.
Alexej Magura

Pada bash 4.2.46, "${@:1:2}"sebenarnya memberi saya argumen baris perintah 1 dan 2 . Sementara itu, beri saya argumen baris perintah penuh , dan beri saya nama skrip diikuti oleh argumen baris perintah penuh . "${@:1}""${@:0}"
Rockallite

@Rockallite baik, ya. Elemen ke-2 dan ke-3 dari $@ array adalah argumen ke-1 dan ke-2. "${@:1}"akan mencetak seluruh array yang dimulai dengan elemen ke-2 (argumen ke-1) dan ${@:0}seluruh array mulai dari elemen ke-1 yang merupakan nama skrip. Apa yang kamu harapkan?
terdon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.