Saya mencoba mempelajari cara menggunakan getopts sehingga saya dapat memiliki skrip dengan input yang diuraikan (walaupun saya pikir getopts bisa lebih baik). Saya mencoba menulis skrip sederhana untuk mengembalikan persentase penggunaan partisi. Masalahnya adalah bahwa salah satu fungsi bash saya sepertinya tidak seperti yang saya referensi $1
sebagai variabel di dalam fungsi. Alasan saya referensi $1
adalah karena get_percent
fungsi dapat melewati titik mount sebagai argumen opsional untuk ditampilkan, bukan semua titik mount.
Naskah
#!/usr/bin/bash
set -e
set -u
set -o pipefail
get_percent(){
if [ -n "$1" ]
then
df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
else
df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
fi
}
usage(){
echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2
}
# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
get_percent
exit 0
fi
# ...
Hasil
$ bash thing.sh
thing.sh: line 8: $1: unbound variable
$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable
bash
shell-script
scripting
Timothy Pulliam
sumber
sumber
getopts
, bukan? Script Anda keluar karena-u
sebelum menelepongetopts
.Jawaban:
set -u
akan dibatalkan persis seperti yang Anda jelaskan jika Anda mereferensikan variabel yang belum ditetapkan. Anda memanggil skrip Anda tanpa argumen, jadiget_percent
dipanggil tanpa argumen, menyebabkan$1
tidak disetel.Periksa apakah ini sebelum memanggil fungsi Anda, atau gunakan ekspansi default (
${1-default}
akan meluas kedefault
jika belum diatur ke yang lain).sumber
[ -n "${1-}" ]
(yaitu, dengan nilai default kosong) untuk melihat apakah parameter ditetapkan dan tidak kosong; atau[ "${1+x}" = x ]
untuk melihat apakah sudah disetel, meskipun kosong.if [[ -n ${1-default} ]]
Ini adalah efek dari
set -u
.Anda dapat memeriksa
$#
di dalam fungsi dan menghindari referensi$1
jika tidak disetel.Dengan
$#
Anda dapat mengakses sejumlah parameter. Dalam konteks global ini adalah jumlah parameter untuk skrip, dalam suatu fungsi itu adalah jumlah parameter untuk fungsi.Dalam konteks pertanyaan, itu
Perhatikan bahwa Anda harus menggunakan
[ $# -ge 1 ] && [ -n "$1" ]
dan tidak[ $# -ge 1 -a -n "$1" ]
, karena yang pertama akan mengevaluasi$1
dan kemudian memeriksa$#
.sumber
Karena ini adalah
bash
Anda dapat menghindari pemeriksaan untuk$1
ditetapkan dan hanya menggunakan"$@"
($1
adalah parameter pertama,$@
semuanya; ketika dikutip ganda, akan hilang sama sekali jika tidak memiliki nilai, yang menghindarkannya ditangkap olehset -u
):Saya juga telah mengubah sedikit sisa baris sehingga Anda tidak mendapatkan {spasi} {tab} {spasi} antara dua nilai yang Anda hasilkan tetapi insead Anda hanya mendapatkan {tab}. Jika Anda benar-benar ingin dua ruang tak terlihat maka ubah
awk
untuk menggunakanprintf "%s \t %s\n", $1, $5
.sumber
$@
untuk Anda