Pertanyaan Periksa keberadaan argumen input dalam skrip shell Bash


Saya perlu memeriksa keberadaan argumen input. Saya memiliki skrip berikut

if [ "$1" -gt "-1" ]
  then echo hi
fi

saya mendapat

[: : integer expression expected

Bagaimana cara memeriksa argumen input1 terlebih dahulu untuk melihat apakah ada?


896
2018-06-26 05:49


asal


Jawaban:


Ini:

if [ $# -eq 0 ]
  then
    echo "No arguments supplied"
fi

Itu $# variabel akan memberi tahu Anda jumlah argumen input skrip disahkan.

Atau Anda dapat memeriksa apakah argumen adalah string kosong atau tidak seperti:

if [ -z "$1" ]
  then
    echo "No argument supplied"
fi

Itu -z switch akan menguji apakah perluasan "$ 1" adalah string null atau tidak. Jika itu adalah string nol maka tubuh dieksekusi.


1600
2018-06-26 05:55



Lebih baik untuk menunjukkan cara ini

if [[ $# -eq 0 ]] ; then
    echo 'some message'
    exit 1
fi

Anda biasanya harus keluar jika Anda memiliki terlalu sedikit argumen.


215
2017-11-13 19:25



Jika Anda hanya tertarik untuk mendeteksi jika suatu argumen tertentu hilang, substitusi parameter bagus:

#!/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

Dalam beberapa kasus Anda perlu memeriksa apakah pengguna menyampaikan argumen ke skrip dan jika tidak, kembali ke nilai default. Seperti pada skrip di bawah ini:

scale=${2:-1}
emulator @$1 -scale $scale

Di sini jika pengguna belum lulus scale sebagai parameter ke-2, saya meluncurkan emulator Android dengan -scale 1 secara default. ${varname:-word} adalah operator ekspansi. Ada operator ekspansi lain juga:

  • ${varname:=word} yang set tidak terdefinisi varname bukannya mengembalikan word nilai;
  • ${varname:?message} yang entah kembali varname jika sudah didefinisikan dan tidak null atau mencetak message dan membatalkan skrip (seperti contoh pertama);
  • ${varname:+word} yang mengembalikan word hanya jika varname didefinisikan dan tidak nol; mengembalikan null sebaliknya.

66
2017-07-31 18:55



Mencoba:

 #!/bin/bash
 if [ "$#" -eq  "0" ]
   then
     echo "No arguments supplied"
 else
     echo "Hello world"
 fi

26
2017-10-21 04:20



Cara lain untuk mendeteksi jika argumen dilewatkan ke skrip:

((!$#)) && echo No arguments supplied!

Perhatikan itu (( expr )) menyebabkan ekspresi dievaluasi sesuai aturan Shell Aritmatika.

Untuk keluar tanpa adanya argumen, seseorang dapat mengatakan:

((!$#)) && echo No arguments supplied! && exit 1

Lain (sejalan) cara mengatakan di atas adalah:

let $# || echo No arguments supplied

let $# || { echo No arguments supplied; exit 1; }  # Exit if no arguments!

help let mengatakan:

let: let arg [arg ...]

  Evaluate arithmetic expressions.

  ...

  Exit Status:
  If the last ARG evaluates to 0, let returns 1; let returns 0 otherwise.

26
2017-07-20 10:26



Saya sering menggunakan cuplikan ini untuk skrip sederhana:

#!/bin/bash

if [ -z "$1" ]; then
    echo -e "\nPlease call '$0 <argument>' to run this command!\n"
    exit 1
fi

10
2017-12-29 17:55



Sebagai pengingat kecil, operator tes numerik di Bash hanya bekerja pada bilangan bulat (-eq, -lt, -ge, dll.)

Saya ingin memastikan $ vars saya int

var=$(( var + 0 ))

sebelum saya mengujinya, hanya untuk mempertahankan terhadap kesalahan "[: integer arg required".


3
2017-10-24 22:39



Jika Anda ingin memeriksa apakah argumen itu ada, Anda dapat memeriksa apakah # argumen lebih besar dari atau sama dengan nomor argumen target Anda.

Naskah berikut menunjukkan bagaimana ini bekerja

test.sh

#!/usr/bin/env bash

if [ $# -ge 3 ]
then
  echo script has at least 3 arguments
fi

menghasilkan output berikut

$ ./test.sh
~
$ ./test.sh 1
~
$ ./test.sh 1 2
~
$ ./test.sh 1 2 3
script has at least 3 arguments
$ ./test.sh 1 2 3 4
script has at least 3 arguments

3
2017-09-13 16:45