Pertanyaan bash: melewati jalur dengan spasi sebagai parameter?


Saya memiliki skrip bash yang menerima satu set file dari pengguna. File-file ini kadang-kadang di bawah direktori dengan spasi di nama mereka. Sayangnya tidak seperti itu pertanyaan ini semua nama file dilewatkan melalui antarmuka baris perintah. Mari kita asumsikan bahwa lintasan tersebut dikutip dengan benar karena dilewatkan oleh pengguna, sehingga spasi (kecuali ruang yang dikutip) adalah pembatas di antara jalur. Bagaimana saya akan meneruskan parameter ini ke subrutin dalam skrip bash saya dengan cara mempertahankan ruang yang dikutip?


16
2017-09-23 22:58


asal


Jawaban:


#! /bin/bash

for fname in "$@"; do
  process-one-file-at-a-time "$fname"
done

Perhatikan penggunaan kutipan yang berlebihan. Itu semua perlu.

Melewati semua argumen ke program lain bahkan lebih sederhana:

process-all-together "$@"

Kasus yang rumit adalah ketika Anda ingin membagi argumen menjadi dua. Yang membutuhkan lebih banyak kode dalam shell POSIX sederhana. Tetapi mungkin Bash memiliki beberapa fitur khusus.


19
2017-09-23 23:04



Kamu ingin "$@", yang memiliki sintaks khusus perluasan $@ tapi melestarikan kutipan ruang putih dari pemanggil (itu tidak membuat string raksasa tunggal dengan semua argumen di dalamnya). Jadi seseorang dapat memanggil skrip Anda seperti:

bash-script.sh AFile "Another File With Spaces"

Kemudian di skrip Anda, Anda dapat melakukan hal-hal seperti:

for f in "$@"; do 
  echo "$f"; 
done

dan dapatkan dua baris output (bukan 5).

Baca paragraf tentang Parameter Khusus "@" di sini: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters


3
2017-09-23 23:05



Bravo @Roland . Itu banyak untuk solusi Anda

Itu benar-benar berhasil!

Saya menulis fungsi skrip sederhana yang membuka jalur yang diberikan dengan nautilus.

Dan saya baru saja mengulang fungsi dengan "helper" ini -for-loop ke fungsi utama:

fmp ()  {

    fmp2() { 
        nautilus "$@"; 
    };

    for fname in "$@";
    do         
        fmp2 "$fname";         
    done; 
}

Sekarang saya bisa membuat semua skrip saya bekerja dengan jalur hanya dengan mengubahnya menjadi fungsi bertumpuk yang dibungkus oleh fungsi dengan helper-untuk-loop ini.


0
2017-09-24 15:41



"$var"

Sebagai contoh,

$ var='foo bar'

$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>

$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>

-1
2017-09-23 23:05