私のスクリプトがオプションの入力を受け取れるようにしたい
例えば現在私のスクリプトは
#!/bin/bash
somecommand foo
しかし、私はそれを言いたいのですが:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
デフォルト値の構文を使用できます。
somecommand ${1:-foo}
Bashリファレンスマニュアル - 3.5.3シェルパラメータの拡張 [強調]に記載されているように、上記は以下のようになります。
Parameterが設定されていない またはnull の場合、Wordの展開が代入されます。そうでなければ、parameterの値が代入されます。
パラメータが設定されていない場合にのみデフォルト値を代入する場合(ただし、空の文字列でない場合など、nullではない場合)は、代わりに次の構文を使用してください。
somecommand ${1-foo}
Bashリファレンスマニュアル - 3.5.3シェルパラメータの展開 :
コロンを省略すると、設定されていないパラメータに対してのみテストが行われます。言い換えれば、コロンが含まれている場合、オペレータは両方のパラメータの存在とその値がnullではないことをテストします。コロンを省略すると、演算子は存在するかどうかだけをテストします。
次のように変数にデフォルト値を設定できます。
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
これがどのように機能するかの例をいくつか示します。
$ ./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
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
引数の数は$#
で確認できます。
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
忘れないでください、その変数が$ 1 .. $ nであれば、置換を使うために通常の変数に書く必要があります。
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
オプションの multiple 引数については、1つ以上のファイルを取ることができるls
コマンドと同様に、またはデフォルトで現在のディレクトリ内のすべてのものをリストします。
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
残念ながら、パスにスペースがあるファイルに対しては正しく機能しません。まだその動作をさせる方法を考え出していません。
これにより、オプションの1番目の引数のデフォルト値が許可され、複数の引数が保持されます。
> cat mosh.sh
set -- ${1:-xyz} ${@:2:$#} ; echo $*
> mosh.sh
xyz
> mosh.sh 1 2 3
1 2 3
引数を固定値またはコマンド(date
など)に置き換えるために変数置換を使用することは可能です。これまでの回答は固定値に焦点を当てていましたが、これは私がdateをオプションの引数にするために使用したものです。
~$ 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