Periksa jumlah argumen yang dilewatkan ke sebuah Bash script

Saya ingin saya Bash script untuk mencetak pesan kesalahan jika diperlukan hitungan argumen ini tidak terpenuhi.

Saya mencoba kode berikut:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

Untuk beberapa alasan yang tidak diketahui I've mendapat error berikut:

test: line 4: [2: command not found

Apa yang saya lakukan salah?

Mengomentari pertanyaan (8)
Larutan

Sama seperti yang lain perintah sederhana, [ ... ] atau tes membutuhkan ruang-ruang di antara argumen.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

Atau

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Saran

Ketika di Bash, lebih memilih menggunakan [[ ]] bukan seperti itu doesn't melakukan firman membelah dan path ekspansi ke variabel yang mengutip mungkin tidak diperlukan kecuali's bagian dari sebuah ekspresi.

[[ $# -ne 1 ]]

Ini juga memiliki beberapa fitur lain seperti dikutp kondisi pengelompokan, pencocokan pola (extended pencocokan pola dengan extglob) dan regex yang cocok.

Berikut ini contoh cek jika argumen yang valid. Hal ini memungkinkan argumen tunggal atau dua.

[[ ($# -eq 1 || ($# -eq 2 && $2 == )) && $1 =~  ]]

Untuk murni ekspresi aritmatika, dengan menggunakan (( )) untuk beberapa orang, mungkin masih lebih baik, tetapi mereka masih mungkin di [[ ]] dengan operator aritmatika seperti eq, -ne, -lt, le, -gt, atau -ge dengan menempatkan ekspresi sebagai satu argumen string:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

Itu akan membantu jika anda akan perlu untuk menggabungkan dengan fitur-fitur lain [[ ]] juga.

Keluar script

It's juga logis untuk membuat script exit ketika tidak valid parameter yang dilewatkan ke dalamnya. Ini telah menyarankan di comments oleh ekangas tapi seseorang diedit ini jawaban untuk memilikinya dengan -1 sebagai nilai kembali, jadi saya mungkin juga melakukannya dengan benar.

-1 meskipun diterima oleh Bash sebagai argumen untuk keluar tidak secara eksplisit didokumentasikan dan tidak tepat untuk digunakan sebagai saran umum. 64 adalah juga yang paling formal nilai sejak itu's didefinisikan dalam sysexits.h dengan #define EX_USAGE 64 /* penggunaan baris perintah error */. Sebagian besar alat-alat seperti ls juga kembali 2 pada argumen yang tidak valid. Aku juga digunakan untuk kembali 2 di script saya tapi akhir-akhir ini saya tidak lagi benar-benar peduli, dan hanya digunakan 1 pada semua kesalahan. Tapi let's hanya tempat 2 di sini, karena itu's paling umum dan mungkin tidak OS-spesifik.

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi

Referensi

Komentar (2)

Itu mungkin ide yang baik untuk menggunakan ekspresi aritmatika jika anda're berurusan dengan angka-angka.

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi
Komentar (0)

Pada []: !=, =, == ... adalah string operator perbandingan dan -eq, -gt.... adalah aritmatika biner orang-orang.

Saya akan menggunakan:

if [ "$#" != "1" ]; then

Atau:

if [ $# -eq 1 ]; then
Komentar (3)

Jika anda're hanya tertarik pada bailing jika suatu argumen yang hilang, Parameter Substitusi adalah:

#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT
Komentar (4)

Sederhana satu kapal yang bekerja dapat dilakukan dengan menggunakan:

[ "$#" -ne 1 ] && ( usage && exit 1 ) || main

Ini rusak:

  1. tes bash variabel untuk ukuran parameter $# tidak sama dengan 1 (jumlah sub perintah)
  2. jika benar, maka penggunaan panggilan() fungsi dan keluar dengan status 1
  3. lain call main() fungsi

Berpikir untuk catatan:

  • penggunaan() hanya dapat menjadi sederhana echo "$0: params"
  • utama dapat menjadi salah satu lama script
Komentar (3)

Check out ini bash cheatsheet, hal ini dapat membantu banyak.

Untuk memeriksa panjang dari argumen yang dilewatkan dalam, anda menggunakan "$#"

Untuk menggunakan array argumen dilewatkan dalam, anda menggunakan "$@"

Contoh memeriksa suhu udara, dan iterasi akan sama: `` myFunc() { jika [[ "$#" -gt 0 ]]; kemudian untuk arg di "$@"; melakukan echo $arg dilakukan fi }

myFunc "$@" ``

Ini articled membantu saya, tetapi telah hilang beberapa hal untuk saya dan situasi saya. Mudah-mudahan ini akan membantu seseorang.

Komentar (0)

Dalam kasus anda ingin berada di sisi yang aman, saya sarankan untuk menggunakan getopts.

Berikut ini adalah contoh kecil:

    while getopts "x:c" opt; do
      case $opt in
        c)
          echo "-$opt was triggered, deploy to ci account" >&2
          DEPLOY_CI_ACCT="true"
          ;;
            x)
              echo "-$opt was triggered, Parameter: $OPTARG" >&2 
              CMD_TO_EXEC=${OPTARG}
              ;;
            \?)
              echo "Invalid option: -$OPTARG" >&2 
              Usage
              exit 1
              ;;
            :)
              echo "Option -$OPTARG requires an argument." >&2 
              Usage
              exit 1
              ;;
          esac
        done

lihat lebih detail di sini untuk contoh http://wiki.bash-hackers.org/howto/getopts_tutorial

Komentar (0)

Di sini sederhana satu liners untuk memeriksa jika hanya satu parameter yang diberikan jika tidak keluar script:

[ "$#" -ne 1 ] && echo "USAGE $0 <paramETER>" && exit
Komentar (0)

Anda harus menambahkan spasi di antara kondisi pengujian:

if [ $# -ne 1 ]; 
    then echo "illegal number of parameters"
fi

Saya harap ini membantu.

Komentar (0)