Saya mencoba membuat skrip shell yang harus digunakan seperti ini:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
Script tersebut kemudian akan mengubah file gambar menjadi file teks. Inilah yang saya dapatkan sejauh ini:
#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1
Tapi saya tidak tahu bagaimana mendapatkan the -from
and -to
values. Ada ide tentang bagaimana melakukannya?
linux
bash
shell
parameters
Kristoffer
sumber
sumber
Jawaban:
Argumen yang Anda berikan kepada bashscript akan muncul dalam variabel
$1
dan$2
dan$3
di mana angka menunjukkan argumen.$0
adalah perintah itu sendiri.Argumen dipisahkan oleh spasi, jadi jika Anda memberikan
-from
dan-to
pada perintah, mereka akan berakhir di variabel ini juga, jadi untuk ini:Anda akan mendapatkan:
Mungkin lebih mudah untuk menghilangkan
-from
dan-to
, seperti:Kemudian Anda akan memiliki:
Sisi negatifnya adalah Anda harus memasoknya dengan urutan yang benar. Ada pustaka yang dapat mempermudah penguraian argumen bernama pada baris perintah, tetapi biasanya untuk skrip shell sederhana Anda sebaiknya menggunakan cara mudah, jika tidak ada masalah.
Kemudian Anda dapat melakukan:
Tanda kutip ganda di sekitar
$1
dan$2
tidak selalu diperlukan tetapi disarankan, karena beberapa string tidak akan berfungsi jika Anda tidak meletakkannya di antara tanda kutip ganda.sumber
Jika Anda tidak sepenuhnya terikat untuk menggunakan "dari" dan "ke" sebagai nama opsi Anda, cukup mudah untuk menerapkannya menggunakan getopts :
getopts
adalah program yang memproses argumen baris perintah dan dengan mudah menguraikannya untuk Anda.f:t:
menentukan bahwa Anda mengharapkan 2 parameter yang berisi nilai (ditunjukkan dengan titik dua). Sesuatu sepertif:t:v
mengatakan itu-v
hanya akan diartikan sebagai bendera.opts
adalah tempat parameter saat ini disimpan. Thecase
pernyataan adalah di mana Anda akan memproses ini.${OPTARG}
berisi nilai yang mengikuti parameter.${FROM_VAL}
Misalnya akan mendapatkan nilai/home/kristoffer/test.png
jika Anda menjalankan skrip Anda seperti:ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt
Seperti yang disarankan orang lain, jika ini adalah pertama kalinya Anda menulis skrip bash, Anda harus benar-benar membaca tentang beberapa dasar. Ini hanyalah tutorial singkat tentang cara
getopts
kerjanya.sumber
f:t:vs
akan-f some_f -t some_t -v -s
Menggunakan variabel
"$1"
,"$2"
,"$3"
dan sebagainya untuk argumen akses. Untuk mengakses semuanya, Anda dapat menggunakan"$@"
, atau untuk menghitung argumen$#
(mungkin berguna untuk memeriksa terlalu sedikit atau terlalu banyak argumen).sumber
Saya perlu memastikan bahwa skrip saya sepenuhnya portabel di antara berbagai mesin, shell, dan bahkan versi cygwin. Lebih jauh, rekan-rekan saya yang harus saya tulis skripnya, adalah programmer, jadi saya akhirnya menggunakan ini:
Rasional: Saya menyertakan
launcher.sh
skrip juga, karena keseluruhan operasi memiliki beberapa langkah yang semu independen satu sama lain (saya katakan "kuasi", karena meskipun setiap skrip dapat dijalankan sendiri-sendiri, biasanya semuanya dijalankan bersama ), dan dalam dua hari saya menemukan, bahwa sekitar setengah dari kolega saya, sebagai pemrogram dan semuanya, terlalu baik untuk menggunakan file peluncur, mengikuti "penggunaan", atau membaca BANTUAN yang ditampilkan setiap kali mereka melakukan sesuatu salah dan mereka mengacaukan semuanya, menjalankan skrip dengan argumen dalam urutan yang salah dan mengeluh bahwa skrip tidak berfungsi dengan baik. Menjadi orang yang mudah tersinggung, saya memutuskan untuk merombak semua skrip saya untuk memastikan bahwa itu adalah bukti kolega. Segmen kode di atas adalah yang pertama.sumber
Dalam bash
$1
adalah argumen pertama yang diteruskan ke skrip,$2
kedua dan seterusnyaJadi Anda bisa menggunakan:
Penjelasan tentang tanda kutip ganda;
pertimbangkan tiga skrip:
Sekarang panggil:
Ketika Anda memanggil
foo.sh "a b"
maka itu memanggilbar.sh a b
(dua argumen), dan denganfoo2.sh "a b"
itu memanggilbar.sh "a b"
(1 argumen). Selalu ingat bagaimana parameter dilewatkan dan diperluas dalam bash, itu akan menghemat banyak sakit kepala.sumber