Bash skrip penguraian argumen dengan kutipan

8

Silakan pertimbangkan skrip sederhana ini bernama test :

#!/bin/bash
echo $1

dan perintah dan panggilan berikut:

$ echo "A B"
A B
$ echo ""A B""
A B
$ echo """A B"""
A B
$ echo """A B"""
A B

$ ./test "A B"
A B
$ ./test ""A B""
A
$ ./test """A B"""
A B
$ ./test """"A B""""
A

Bisakah seseorang tolong jelaskan mengapa panggilan tes tidak berperilaku seperti perintah gema atau arahkan ke dokumentasi yang relevan?

Toliveira
sumber
2
Sudah ada perintah tes , Anda beruntung Anda menggunakan path lengkap, jika tidak, Anda akan kesulitan men-debug situasi.
Rui F Ribeiro
3
Lebih baik untuk jenis tes ini adalah menggunakan printf '%q\n' "$@"daripada tidak echosama sekali, yang akan memancarkan argumen Anda satu-ke-a-line dengan karakter tersembunyi dan spasi putih lolos dalam bentuk yang terlihat.
Charles Duffy

Jawaban:

13

Karena echomenggabungkan semua argumen untuk mencetaknya, dan skrip Anda terbatas pada argumen pertama . Anda harus menggunakan "$@"dan tidak $1dalam skrip Anda.

Mari kita lihat argumen yang Anda berikan untuk pengujian Anda:

  • ./test "A B"
    • satu argumen, string 3 karakter AspaceB
  • ./test ""A B""
    • dua argumen
      • pertama, empty stringdigabung denganA
      • kedua, Bdisatukan denganempty string
  • ./test """A B"""
    • satu argumen, empty stringdisatukan dengan AspaceBdisatukan denganempty string
  • ./test """"A B""""
    • dua argumen
      • pertama, empty stringdigabungkan dengan empty stringdigabungkan denganA
      • kedua, Bdigabungkan dengan empty stringdigabungkan denganempty string

Catatan: Anda akan melihat hasil yang berbeda dari echojika Anda menggunakan lebih dari satu ruang dalam argumen Anda. Itu karena gema menyatukan argumennya dengan satu spasi:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B
glenn jackman
sumber
mereka adalah barang-barang kecil string kosong rapi .
mikeserv
2
tepatnya, harga jangan bersarang ...
mr.spuratic