web-dev-qa-db-ja.com

オプションの入力引数をとるbashスクリプトを書く方法は?

私のスクリプトがオプションの入力を受け取れるようにしたい

例えば現在私のスクリプトは

#!/bin/bash
somecommand foo

しかし、私はそれを言いたいのですが:

#!/bin/bash
somecommand  [ if $1 exists, $1, else, foo ]
369
Abe

デフォルト値の構文を使用できます。

somecommand ${1:-foo}

Bashリファレンスマニュアル - 3.5.3シェルパラメータの拡張 [強調]に記載されているように、上記は以下のようになります。

Parameterが設定されていない またはnull の場合、Wordの展開が代入されます。そうでなければ、parameterの値が代入されます。

パラメータが設定されていない場合にのみデフォルト値を代入する場合(ただし、空の文字列でない場合など、nullではない場合)は、代わりに次の構文を使用してください。

somecommand ${1-foo}

Bashリファレンスマニュアル - 3.5.3シェルパラメータの展開

コロンを省略すると、設定されていないパラメータに対してのみテストが行​​われます。言い換えれば、コロンが含まれている場合、オペレータは両方のパラメータの存在とその値がnullではないことをテストします。コロンを省略すると、演算子は存在するかどうかだけをテストします。

567
Itay Perl

次のように変数にデフォルト値を設定できます。

somecommand.sh

#!/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
227
Brad Parks
if [ ! -z $1 ] 
then 
    : # $1 was given
else
    : # $1 was not given
fi
40
Irit Katriel

引数の数は$#で確認できます。

#!/bin/bash
if [ $# -ge 1 ]
then
    $1
else
    foo
fi
18
Dennis

忘れないでください、その変数が$ 1 .. $ nであれば、置換を使うために通常の変数に書く必要があります。

#!/bin/bash
NOW=$1
echo  ${NOW:-$(date +"%Y-%m-%d")}
7
hagen

オプションの multiple 引数については、1つ以上のファイルを取ることができるlsコマンドと同様に、またはデフォルトで現在のディレクトリ内のすべてのものをリストします。

if [ $# -ge 1 ]
then
    files="$@"
else
    files=*
fi
for f in $files
do
    echo "found $f"
done

残念ながら、パスにスペースがあるファイルに対しては正しく機能しません。まだその動作をさせる方法を考え出していません。

3
Jesse Glick

これにより、オプションの1番目の引数のデフォルト値が許可され、複数の引数が保持されます。

 > cat mosh.sh
   set -- ${1:-xyz} ${@:2:$#} ; echo $*    
 > mosh.sh
   xyz
 > mosh.sh  1 2 3
   1 2 3 
2
mosh

引数を固定値またはコマンド(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
1
Garren S