Bashのスクリプトパラメータ

このような使い方をするシェルスクリプトを作ろうとしています。

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

このスクリプトは、画像ファイルをテキストファイルにOCR変換します。今のところ、以下のようになっています。

#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1

しかし、-from-toの値をどうやって取得したらいいのかわかりません。何か方法があれば教えてください。

ソリューション

bashスクリプトに与える引数は、変数$1$2$3に表示され、数字が引数を意味します。$0` はコマンドそのものです。

引数はスペースで区切られているので、コマンドに -from-to を指定すると、これらの変数にも格納されます。

./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

となります。

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

のように、-from-toを省略した方が簡単かもしれません。

ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt

すると、次のようになります。

$1    # /home/kristoffer/test.png
$2    # /home/kristoffer/test.txt

欠点は、正しい順序で供給しなければならないことです。コマンドラインの名前付き引数の解析を簡単にするライブラリもありますが、通常、単純なシェルスクリプトでは、問題がなければ簡単な方法を使うべきです。

では、次のようにします。

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

1」と「2」を二重引用符で囲むことは必ずしも必要ではありませんが、推奨します。なぜなら、二重引用符で囲まないと動作しない文字列があるからです。

解説 (0)

引数にアクセスするには、変数 "$1", "$2", "$3" などを使用します。すべての引数にアクセスするには "$@" を使用します。また、引数の数を得るには $# を使用します(引数が少なすぎたり多すぎたりしないかチェックするのに便利です)。

解説 (0)

bashでは、$1はスクリプトに渡される最初の引数、$2は2番目の引数、というようになります。

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

ですから、次のように使えます。

./your_script.sh some_source_file.png destination_file.txt

二重引用符について説明します。

は、3つのスクリプトを考えます。

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

では起動します。

$ bash foo.sh "a b"
1-a 2-b

$ bash foo2.sh "a b"
1-a b 2-

foo.sh "a b"とすると、bar.sh a b(2つの引数)を起動し、foo2.sh "a b"とすると、bar.sh "a b"`(1つの引数)を起動します。このように、bashではパラメータの受け渡しや展開の方法を常に念頭に置いておくと、頭の痛い問題を解決することができます。

解説 (1)