Bagaimana saya bisa membuat Bash Script mengambil input sebelum skrip dipanggil?

7

Pada dasarnya, Anda memanggil Bash Script saya dengan mengetikkan mybashscriptkonsol. Maka ini dimulai:

Welcome to mybashcript! Choose an option (login|logout|view|erase|quit|):

Pengguna kemudian mengetik input mana yang mereka inginkan, yang kemudian mengaktifkan Skrip Python lebih jauh ke bawah di setiap pohon opsi masing-masing.

Yang saya ingin tahu adalah, bagaimana saya bisa membuatnya sehingga pengguna hanya perlu mengetik (jika mereka telah menggunakan program sebelumnya) sesuatu seperti mybashscript loginatau mybashscript view.

Jadi kata apa pun yang ditambahkan setelah nama skrip Bash kemudian diambil sebagai input pertama dalam skrip itu sendiri. Apakah ini mungkin?

Ini skrip saya sejauh ini, saya tidak benar-benar mengerti bagaimana memasukkan $ 1 tanpa juga membiarkannya bertanya apakah tidak ada argumen.

#!/bin/bash

echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase):     "

read option

if [ "$option" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

 elif [ "$option" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

 elif [ "$option" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

 elif [ "$option" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

 else
  echo "Sorry, I didn't understand that." 

fi
pengguna
sumber
1
Argumennya adalah $ 0 untuk nama program, $ 1, $ 2 ... untuk argumen lain, $ # untuk jumlah argumen, $ * untuk semua argumen dari 1, $ @ sebagai $ *, tetapi jika dalam tanda kutip, argumen disimpan terpisah. Juga perintah shiftakan menghapus $ 1 dan menggeser yang lain ke bawah, $ 2 menjadi $ 1, $ 3 menjadi $ 2 ...
ctrl-alt-delor

Jawaban:

14
#!/bin/bash

case $# in
0) echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase):     "
   read option ;;

1) option=$1 ;;

*) echo "Sorry, I didn't understand that (too many command line arguments)"
   exit 2 ;;

esac

if [ "$option" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

elif [ "$option" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

elif [ "$option" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

elif [ "$option" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

else
  echo "Sorry, I didn't understand that." 

fi
Uwe
sumber
terima kasih banyak, bisakah Anda melihat sekilas edit saya? Saya tidak yakin bagaimana cara mengatasi ini untuk situasi saya.
pengguna
jawaban diperbarui.
Uwe
4

Dalam skrip bash Anda $1adalah argumen pertama, $2argumen kedua, dan sebagainya.

mis. jika Anda memiliki yang berikut di test.sh:

#!/bin/sh
echo You said \"$1\"

Maka Anda akan mendapatkan yang berikut ini:

user@host:~$ test.sh hello
You said "hello"
PP
sumber
terima kasih atas bantuannya, bisakah Anda melihat hasil edit saya?
pengguna
1

Cara untuk mengambil input dari baris perintah dan meneruskannya ke program Anda adalah dengan menggunakan $ 1 (untuk kata pertama setelah perintah), $ 2, $ 3 dan seterusnya.

Misalnya, katakanlah Anda menulis Bash Script ini (nama file: testcript):

#!/bin/bash
echo $1
echo $2
echo $5

Ini akan menjadi output ketika skrip dipanggil oleh pengguna dari konsol (ingat untuk menambahkan x izin sehingga skrip dapat dieksekusi oleh shell dan meletakkan skrip di / usr / local / bin /):

user:$ testscript how are you doing today?
how
are
today?

Terima kasih atas semua bantuan Anda, itu mendorong saya ke arah yang benar. Inilah yang akhirnya saya lakukan untuk kasus spesifik saya jika Anda penasaran; ini mungkin bukan cara terbaik atau paling elegan untuk Bash Script, tapi saya baru mulai hari ini !:

#!/bin/bash

if [ "$1" == "sign" ]; then
  python /usr/local/bin/guestbook.data/sign_guestbook.py

elif [ "$1" == "view" ]; then
  python /usr/local/bin/guestbook.data/view_guestbook.py

elif [ "$1" == "save" ]; then
  python /usr/local/bin/guestbook.data/save_guestbook.py

elif [ "$1" == "erase" ]; then
  python /usr/local/bin/guestbook.data/erase_guestbook.py

else
  echo -n "Hello $USER, welcome to the guestbook! Choose an option (sign|view|save|erase): "

  read option

    if [ "$option" == "sign" ]; then
      python /usr/local/bin/guestbook.data/sign_guestbook.py

    elif [ "$option" == "view" ]; then
      python /usr/local/bin/guestbook.data/view_guestbook.py

    elif [ "$option" == "save" ]; then
      python /usr/local/bin/guestbook.data/save_guestbook.py

    elif [ "$option" == "erase" ]; then
      python /usr/local/bin/guestbook.data/erase_guestbook.py

    else
      echo "Sorry, I didn't understand that." 

    fi

fi
pengguna
sumber
Saat Anda mulai terbiasa dengan bash, lihatlah untuk mengganti rantai if dengan pernyataan kasus. Itu cenderung lebih bersih dan lebih mudah dibaca / dipelihara. Tergantung pada gaya pengkodean Anda, Anda mungkin juga ingin menggunakan select: select name [in word]; lakukan daftar; selesai yang membuat menu primitif untuk Anda.
Joe
0

Seperti yang saya mengerti, yang Anda inginkan adalah mendapatkan argumen baris perintah.

Ambil contoh di bawah ini:

#! /bin/bash
echo "Welcome to mybashcript!"
echo "Selected option: $1"

$1 mewakili argumen baris perintah pertama yang diteruskan ke program Anda.

Jika kami memanggil skrip di atas (mari gunakan nama yang Anda miliki di pertanyaan Anda, mybashscript) dengan loginsebagai argumen

$ mybashscript login

Kami mendapatkan output di bawah ini:

Welcome to mybashscript!
Selected option: login

Jika lebih argumen yang diberikan, Anda dapat mengaksesnya menggunakan $2, $3, ..., dan seterusnya. Tapi itu hanya berguna ketika Anda memiliki sejumlah argumen. Jika Anda ingin menggunakan sejumlah variabel argumen, periksa posting ini di StackOverflow.

snowcrshd
sumber
0
$ cat test.sh
#!/bin/bash
launch() {
    if [[ "$1" =~ ^(sign|view|save|erase)$ ]]; then
        echo python /usr/local/bin/guestbook.data/${1}_guestbook.py
    else
        [ -n "$1" ] && echo "Sorry, I didn't understand that."
        return 1
    fi
}
show_help() {
        echo -n "Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): "
}
launch "$1" && exit
show_help
while read option; do
        if launch "$option"; then
                break
        else
                show_help
        fi
done

Menguji kodenya:

$ ./test.sh
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): a
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): sign
python /usr/local/bin/guestbook.data/sign_guestbook.py
$ ./test.sh
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): asign
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): view
python /usr/local/bin/guestbook.data/view_guestbook.py
$ ./test.sh a
Sorry, I didn't understand that.
Hello, welcome to the guestbook! Choose an option (sign|view|save|erase): save
python /usr/local/bin/guestbook.data/save_guestbook.py
$ ./test.sh erase
python /usr/local/bin/guestbook.data/erase_guestbook.py

Penjelasan:

[[ "$1" =~ ^(sign|view|save|erase)$ ]];menguji input menggunakan ekspresi reguler untuk kode yang lebih ringkas, bukan if-elsetangga. The $1mengacu pada argumen posisi pertama bahwa fungsi ini menerima, bukan naskah itu sendiri. Tes untuk [ -n "$1" ]hanya mencetak Sorrypernyataan jika ada beberapa input yang dimasukkan.

launch "$1" && exitmencoba memeriksa input apa pun melalui $1, jika berhasil skrip akan keluar.

Asumsi:

  1. Skrip python akan keluar dengan status yang berhasil, dan itulah cara if launch "$option"; then ...kerjanya. Jika asumsi ini salah dan pemeriksaan kondisi keluar tidak diperbaiki, kami akan mandek.
  2. Kita dapat menggunakan $1untuk meluncurkan skrip yang benar di jalan ${1}_guestbook.py.
hjk
sumber