web-dev-qa-db-ja.com

Linuxでターミナルコマンドを使用してbashスクリプトにファイル引数を渡すにはどうすればよいですか?

だから私の質問は、Linuxでターミナルコマンドを使用してbashスクリプトにファイル引数を渡すにはどうすればよいですか?現時点では、ターミナルからファイル引数を取り、それをプログラムの変数として使用できるbashでプログラムを作成しようとしています。たとえば、myprogram --file=/path/to/fileターミナル。

私のプログラム

#!/bin/bash    
File=(the path from the argument)  
externalprogram $File (other parameters)

私のプログラムでこれをどのように達成できますか?

40
AZorin

単にスクリプトを

myprogram /path/to/file

次に、$1としてスクリプト内のパスにアクセスできます(引数#1の場合、同様に$2は引数#2などです)。

file="$1"
externalprogram "$file" [other parameters]

あるいは単に

externalprogram "$1" [otherparameters]

--file=/path/to/fileのようなものからパスを抽出する場合、通常はgetopts Shell関数を使用して行われます。しかし、それは単に$1を参照するよりも複雑です。さらに、--file=のようなスイッチはオプションであることが意図されています。私はあなたのスクリプトを推測しているrequires提供されるファイル名なので、optionで渡すのは意味がありません。

55
David Z

getoptを使用して、bashスクリプトのパラメーターを処理できます。 getoptについてはあまり説明がありません。以下に例を示します。

#!/bin/sh

OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "[email protected]")

if [ $? -ne 0 ]; then
  echo "getopt error"
  exit 1
fi

eval set -- $OPTIONS

while true; do
  case "$1" in
    -h|--help) HELP=1 ;;
    -f|--file) FILE="$2" ; shift ;;
    -g|--foo)  FOO=1 ;;
    -b|--bar)  BAR=1 ;;
    --)        shift ; break ;;
    *)         echo "unknown option: $1" ; exit 1 ;;
  esac
  shift
done

if [ $# -ne 0 ]; then
  echo "unknown option(s): [email protected]"
  exit 1
fi

echo "help: $HELP"
echo "file: $FILE"
echo "foo: $FOO"
echo "bar: $BAR"

こちらもご覧ください:

20
lesmana

Bashは、「位置パラメータ」と呼ばれる概念をサポートしています。これらの定位置パラメーターは、Bashスクリプトが呼び出されるときにコマンドラインで指定される引数を表します。

位置パラメータは、$0$1$2などの名前で参照されます。 $0はスクリプト自体の名前、$1はスクリプトの最初の引数、$2は2番目などです。$*は、 $0(つまり、$1で始まる)。

例:

#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
12
Dan Moulding

David Zaslavskyが示唆するように、最初の引数が単にis実行するプログラムであると仮定すると(オプション解析は不要)、引数2以降を渡す方法の問題に対処しています外部プログラム。便利な方法は次のとおりです。

#!/bin/bash
ext_program="$1"
shift
"$ext_program" "[email protected]"

shiftは最初の引数を削除し、残りの名前を変更します($2$1, and so on). $ @ `になり、引数を単語の配列として参照します(引用符で囲む必要があります!)。

--file構文が必要な場合(たとえば、実行するデフォルトのプログラムがあるため、ユーザーが必ずしも提供する必要がない場合)、ext_program="$1"を、必要な$1の解析に置き換えるだけで、おそらくgetoptまたはgetoptsを使用します。

特定の1つの場合にのみ、独自のロールを作成する場合は、次のようなことを行うことができます。

if [ "$#" -gt 0 -a "${1:0:6}" == "--file" ]; then
    ext_program="${1:7}"
else
    ext_program="default program"
fi
2
Cascabel