Saya ingin skrip saya dapat mengambil input opsional,
misalnya skrip saya saat ini
#!/bin/bash
somecommand foo
tapi saya ingin mengatakan:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Saya ingin skrip saya dapat mengambil input opsional,
misalnya skrip saya saat ini
#!/bin/bash
somecommand foo
tapi saya ingin mengatakan:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Jawaban:
Anda dapat menggunakan sintaks nilai default:
somecommand ${1:-foo}
Akan di atas, seperti yang dijelaskan dalam Manual Referensi Bash - 3.5.3 Ekspansi Parameter Shell [penekanan tambang]:
Jika parameter tidak disetel atau nol , perluasan kata diganti. Jika tidak, nilai parameter diganti.
Jika Anda hanya ingin mengganti nilai default jika parameter tidak disetel (tetapi tidak jika itu nol, misalnya tidak jika itu adalah string kosong), gunakan sintaks ini sebagai gantinya:
somecommand ${1-foo}
Lagi dari Bash Reference Manual - 3.5.3 Ekspansi Parameter Shell :
Menghilangkan titik dua menghasilkan tes hanya untuk parameter yang tidak disetel. Dengan kata lain, jika titik dua dimasukkan, operator menguji keberadaan parameter dan nilainya tidak nol; jika titik dua dihilangkan, operator hanya menguji keberadaannya.
foo
jika $1
tidak disetel atau string kosong ", dan ${1-foo}
, "kembali foo
jika $1
tidak disetel".
Anda dapat menetapkan nilai default untuk variabel seperti:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Berikut ini beberapa contoh cara kerjanya:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
-
bingung (apakah dinegasikan?).
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
sama dengan ! -z
.
-n
dan ! -z
jadi saya akan mengatakan itu tidak terjadi di sini.
[ -n $1 ]
akan selalu benar . Jika Anda menggunakan bash, [[ -n $1 ]]
akan berperilaku seperti yang Anda harapkan, jika tidak Anda harus mengutip[ -n "$1" ]
jangan lupa, jika variabelnya $ 1 .. $ n Anda perlu menulis ke variabel biasa untuk menggunakan substitusi
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Untuk beberapa argumen opsional , dengan analogi dengan ls
perintah yang dapat mengambil satu atau lebih file atau secara default mendaftar semua yang ada di direktori saat ini:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Sayangnya, tidak berfungsi dengan benar untuk file dengan spasi di path. Belum menemukan cara membuatnya.
Dimungkinkan untuk menggunakan substitusi variabel untuk menggantikan nilai tetap atau perintah (seperti date
) untuk argumen. Jawabannya sejauh ini berfokus pada nilai-nilai tetap, tetapi inilah yang saya gunakan untuk menjadikan tanggal sebagai argumen opsional:
~$ sh co.sh
2017-01-05
~$ sh co.sh 2017-01-04
2017-01-04
~$ cat co.sh
DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY