Saya perlu membaca nilai dari terminal dalam skrip bash. Saya ingin dapat memberikan nilai default yang dapat diubah pengguna.
# Please enter your name: Ricardo^
Dalam skrip ini promptnya adalah "Silakan masukkan nama Anda:" nilai defaultnya adalah "Ricardo" dan kursornya akan setelah nilai default. Apakah ada cara untuk melakukan ini dalam skrip bash?
input
dan kemudian menggunakanname=${input:-$name}
.name=${!input:-$name}
dilakukan?$1
menjadi${1:-some_default_string}
sumber
-e
tampaknya wajib-i
untuk benar-benar berfungsiDalam Bash 4:
Ini menampilkan nama setelah prompt seperti ini:
dengan kursor di akhir nama dan memungkinkan pengguna untuk mengeditnya. Baris terakhir adalah opsional dan memaksa nama menjadi default asli jika pengguna menghapus input atau default (mengirimkan nol).
sumber
name
alih-alihinput
dalamread
perintah.$name
diawetkan jika pengguna menghapus nilai yang diusulkan (dan dengan demikian memasukkan string nol). Itu semua tergantung pada apa kebutuhan Anda. Saya mengatakan banyak hal dalam jawaban saya. Anda benar, meskipun, bahwa saya bisa lebih eksplisit dan mengatakan bahwa jika garis opsional tidak digunakan maka variabel bisa sajaname
.Kode:
Contoh dijalankan:
sumber
Saya menemukan pertanyaan ini, mencari cara untuk menyajikan sesuatu seperti:
Dengan menggunakan contoh di atas saya menyimpulkan ini: -
Harapan itu membantu seseorang untuk tidak harus memikirkan logika, jika mereka menemui masalah yang sama
sumber
Saya baru saja menggunakan pola ini, yang saya sukai:
sumber
Tetapkan default; cetak ini; baca nilai baru; jika ada nilai baru, gunakan di tempat default. Ada (atau pernah) beberapa variasi antara cangkang dan sistem tentang cara menekan baris baru di akhir prompt. Notasi '\ c' tampaknya berfungsi pada MacOS X 10.6.3 dengan bash 3.x, dan bekerja pada sebagian besar varian Unix yang berasal dari System V, menggunakan cangkang Bourne atau Korn.
Perhatikan juga bahwa pengguna mungkin tidak akan menyadari apa yang terjadi di balik layar; data baru mereka akan dimasukkan setelah nama sudah ada di layar. Mungkin lebih baik untuk memformatnya:
sumber
printf
lebih portabel dariecho
if (test -z "$xxx"); ...
' dan shellisms C lainnya.\c
, karena itu juga mendukungecho -n
! Namun, Anda harus menambahkan-e
untuk mendapatkan gema bash untuk menafsirkan lolos. Saya kira\c
untuk hal-hal yang tidak terucapkan:echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
$ bash --version
GNU bash, version 4.3.33(0)-release
a) "Saya ingin dapat memberikan nilai default yang dapat diubah pengguna." Andaecho "Please enter your name: $name \c"
tidak memungkinkan saya untuk mengedit nilai default. b) "dan kursor akan setelah nilai default." Tidak benar juga ... Jawaban oleh @Paused hingga pemberitahuan lebih lanjut. tidak memenuhi kedua persyaratan.sumber
Parameter -e dan -t tidak bekerja bersama. saya mencoba beberapa ekspresi dan hasilnya adalah potongan kode berikut:
sumber
;)
. Ini diizinkan pada SO! tapi kami tidak ingin mencemari pertanyaan lain dengan hal-hal yang tidak terkait.