だから私の質問は、Linuxでターミナルコマンドを使用してbashスクリプトにファイル引数を渡すにはどうすればよいですか?現時点では、ターミナルからファイル引数を取り、それをプログラムの変数として使用できるbashでプログラムを作成しようとしています。たとえば、myprogram --file=/path/to/file
ターミナル。
#!/bin/bash
File=(the path from the argument)
externalprogram $File (other parameters)
私のプログラムでこれをどのように達成できますか?
単にスクリプトを
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で渡すのは意味がありません。
getoptを使用して、bashスクリプトのパラメーターを処理できます。 getoptについてはあまり説明がありません。以下に例を示します。
#!/bin/sh
OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "$@")
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): $@"
exit 1
fi
echo "help: $HELP"
echo "file: $FILE"
echo "foo: $FOO"
echo "bar: $BAR"
こちらもご覧ください:
Bashは、「位置パラメータ」と呼ばれる概念をサポートしています。これらの定位置パラメーターは、Bashスクリプトが呼び出されるときにコマンドラインで指定される引数を表します。
位置パラメータは、$0
、$1
、$2
などの名前で参照されます。 $0
はスクリプト自体の名前、$1
はスクリプトの最初の引数、$2
は2番目などです。$*
は、 $0
(つまり、$1
で始まる)。
例:
#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
David Zaslavskyが示唆するように、最初の引数が単にis実行するプログラムであると仮定すると(オプション解析は不要)、引数2以降を渡す方法の問題に対処しています外部プログラム。便利な方法は次のとおりです。
#!/bin/bash
ext_program="$1"
shift
"$ext_program" "$@"
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