Bagaimana cara memeriksa apakah tidak ada parameter yang disediakan untuk suatu perintah?

75

Bagaimana Anda memeriksa apakah $*kosong? Dengan kata lain, bagaimana cara memeriksa apakah tidak ada argumen yang diberikan untuk suatu perintah?

baik sebenarnya
sumber

Jawaban:

112

Untuk memeriksa apakah tidak ada argumen yang disediakan untuk perintah, periksa nilai $#variabel,

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi

Jika Anda ingin menggunakan $*( tidak disukai ),

if [ "$*" == "" ]; then
    echo "No arguments provided"
    exit 1
fi

Beberapa penjelasan:

Pendekatan kedua tidak disukai karena ekspansi parameter posisi *memperluas ke parameter posisi, mulai dari satu. Ketika ekspansi terjadi dalam tanda kutip ganda, itu berkembang menjadi satu kata dengan nilai setiap parameter dipisahkan oleh karakter pertama dari variabel khusus IFS. Itu berarti sebuah string dibangun. Jadi ada overhead tambahan.

Di sisi lain #memperluas ke jumlah parameter posisi.

Contoh:

$ command param1 param2

Sini,

Nilai $#is 2 dan nilai $*is string "param1 param2" (tanpa tanda kutip), jika IFS tidak disetel. Karena jika IFS tidak disetel, parameter dipisahkan oleh spasi

Untuk lebih jelasnya man bashdan baca topik bernama Parameter Khusus

Sachin Divekar
sumber
5
Atau if ! (($#)); ..., atau if (($# == 0)); ..., atau if [ $# -eq 0 ]; ..., atau ! (($#)) && ..., atau(($#)) || ...
nicerobot
7
[ $# -eq 0 ]adalah bentuk IME yang paling umum. Ada kasus tepi di mana "$#"bisa kosong: jika ada satu argumen yang kosong, atau jika ada beberapa argumen kosong dan $IFSkosong.
Gilles 'SO- berhenti menjadi jahat'
1
The "$*"ekspresi juga akan mengevaluasi untuk ""jika hanya satu ""parameter disahkan. Tetapi sebagian besar waktu Anda mungkin tidak akan peduli.
manatwork
Saya percaya itu harus = bukan == ... saat ini saya mendapatkan kesalahan operator yang tidak terduga, dan mengubah ke = memperbaiki masalah.
sebenarnya
@Charlotte Itu berarti Anda tidak menggunakan bash. Anda menggunakan shuntuk mengeksekusi skrip. AFAIK ==hanya valid dalam bash.
Sachin Divekar
14

Jika Anda hanya tertarik untuk membayar jika argumen tertentu tidak ada, 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
Menepuk
sumber
-4

ini adalah salah satu cara Anda bisa tahu bahwa Anda tidak punya argumen

NO_ARGS=0
if [ $# -eq "$NO_ARGS" ]; then
    {do something}
fi
Joel Dsouza
sumber
5
Itu kelihatannya merupakan cara berbelit-belit untuk melakukan apa yang ditulis oleh jawaban yang diterima 5 tahun yang lalu ....
Jeff Schaller