次のようにbashスクリプトを制御したいと思います。
#!/bin/sh
USER1=_parsefromfile_
Host1=_parsefromfile_
PW1=_parsefromfile_
USER2=_parsefromfile_
Host2=_parsefromfile_
PW2=_parsefromfile_
imapsync \
--buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --IgnoreSizeErrors \
--Host1 $Host1 --user1 $USER1 --password1 $PW1 --ssl1 --port1 993 --noauthmd5 \
--Host2 $Host2 --user2 $USER2 --password2 $PW2 --ssl2 --port2 993 --noauthmd5 --allowsizemismatch
次のような制御ファイルのパラメータを使用します。
Host1 user1 password1 Host2 user2 password2
anotherhost1 anotheruser1 anotherpassword1 anotherhost2 anotheruser2 anotherpassword2
ここで、各行はスクリプトの1回の実行を表し、パラメータが抽出されて変数になっています。
これを行う最もエレガントな方法は何でしょうか?
パット
シェルスクリプトでは、これは通常、source
関数を使用して実行されます。この関数は、実行中のスクリプトにインライン化されたかのようにファイルをシェルスクリプトとして実行します。つまり、ファイルに設定した変数スクリプトにエクスポートされます。
欠点は、(a)構成ファイルが実行されるため、特権のないユーザーが特権のある構成ファイルを編集できる場合、セキュリティ上のリスクがあります。 (b)設定ファイルの構文が有効なbash構文に制限されている。それでも、それは本当に便利です。
config.conf
USER=joe
PASS=hello
SERVER=127.0.0.2
script.sh
#!/bin/bash
# Set defaults
USER=`whoami`
# Load config values
source config.conf
foobar2000 --user=$USER --pass=$PASS --Host=$Host
source
は、単一の.
-したがって、次の2つは同等です。
source file.sh
. file.sh
このようなもの。重要なビットは、行を配列として取得するために read を使用することです。
#!/bin/bash
configfile=/pathtocontrolfile
cat $configfile | while read -a HR ; do
[[ -z ${HR[0]} ]] && continue # skip empty lines
USER1=${HR[0]}
Host1=${HR[1]}
PW1=${HR[2]}
USER2=${HR[3]}
Host2=${HR[4]}
PW2=${HR[5]}
imapsync \
--buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --IgnoreSizeErrors \
--Host1 $Host1 --user1 $USER1 --password1 $PW1 --ssl1 --port1 993 --noauthmd5 \
--Host2 $Host2 --user2 $USER2 --password2 $PW2 --ssl2 --port2 993 --noauthmd5 --allowsizemismatch
done
私はここで実用的な解決策を見つけました: https://af-design.com/2009/07/07/loading-data-into-bash-variables/
if [ -f "$SETTINGS_FILE" ];then
. "$SETTINGS_FILE"
fi
数値ベースで引数を読み取ろうとするのではなく、スクリプトをインテリジェントにしたい場合は、getoptsなどを使用する必要があると思います。
このようなもの。
#!/bin/bash
while getopts ":a" opt; do
case $opt in
a)
echo "-a was triggered!" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
$ ./go_test.sh -a
-a was triggered!
$
引数を解析することもできます。 こちら でチュートリアルの詳細を読むことができます。