Betiğimin isteğe bağlı bir girdi alabilmesini istiyorum,
örneğin şu anda benim senaryom
#!/bin/bash
somecommand foo
ama şunu söylemek isterim:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Betiğimin isteğe bağlı bir girdi alabilmesini istiyorum,
örneğin şu anda benim senaryom
#!/bin/bash
somecommand foo
ama şunu söylemek isterim:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
Yanıtlar:
Varsayılan değer sözdizimini kullanabilirsiniz:
somecommand ${1:-foo}
Yukarıdakiler, Bash Referans Kılavuzu - 3.5.3 Kabuk Parametre Genişletme [vurgu mayını] ' nda açıklandığı gibi olacaktır :
Parametre ayarlanmamış veya null ise , sözcüğün genişletilmesi değiştirilir. Aksi takdirde, parametrenin değeri değiştirilir.
Yalnızca parametre ayarlanmadıysa (ancak boş değilse, örneğin boş bir dize değilse değil) varsayılan bir değeri değiştirmek istiyorsanız, bunun yerine bu sözdizimini kullanın:
somecommand ${1-foo}
Yine Bash Referans Kılavuzundan - 3.5.3 Kabuk Parametre Genişletme :
İki nokta üst üste işareti atlandığında yalnızca ayarlanmamış bir parametre için sınama yapılır. Kolon dahil edilirse, operatör her iki parametrenin varlığını ve değerinin boş olmadığını test eder; iki nokta üst üste işareti atlanırsa, operatör yalnızca varlığını test eder.
foo
eğer $1
ayarlanmazsa veya boş dize " ve ${1-foo}
"geri dönüş, foo
eğer $1
ayarlanmazsa".
Şöyle bir değişken için varsayılan bir değer ayarlayabilirsiniz:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
Bunun nasıl çalıştığına dair bazı örnekler:
$ ./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
-
(Bu negated nedir?) Beni karıştı.
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
ile aynıdır ! -z
.
-n
ve ! -z
bu yüzden burada böyle olmadığını söyleyebilirim.
[ -n $1 ]
her zaman doğrudur . Eğer bash kullanırsanız, [[ -n $1 ]]
beklediğiniz gibi davranacaktır, aksi takdirde alıntı yapmalısınız[ -n "$1" ]
Unutmayın, eğer değişkeni $ 1 .. $ n ise ikameyi kullanmak için normal bir değişkene yazmanız gerekir
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
İsteğe bağlı çoklu argümanlar için, ls
bir veya daha fazla dosya alabilen komutla benzer şekilde veya varsayılan olarak geçerli dizindeki her şeyi listeler:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
Ne yazık ki yoldaki boşlukları olan dosyalar için düzgün çalışmıyor. Bunu nasıl çalıştıracağını henüz çözemedim.
Değişken ikamesi, sabit bir değeri veya date
bir argümanın komutunu (gibi ) değiştirmek için kullanılabilir. Şimdiye kadar cevaplar sabit değerlere odaklandı, ancak tarihi isteğe bağlı bir argüman yapmak için kullandığım şey bu:
~$ 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