web-dev-qa-db-ja.com

外部ファイルの変数でbashスクリプトを制御する

次のように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回の実行を表し、パラメータが抽出されて変数になっています。

これを行う最もエレガントな方法は何でしょうか?

パット

7
perler

シェルスクリプトでは、これは通常、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
8
tylerl

このようなもの。重要なビットは、行を配列として取得するために 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
3
Zoredache

私はここで実用的な解決策を見つけました: https://af-design.com/2009/07/07/loading-data-into-bash-variables/

if [ -f "$SETTINGS_FILE" ];then
    . "$SETTINGS_FILE"
fi
0
Lukasz

数値ベースで引数を読み取ろうとするのではなく、スクリプトをインテリジェントにしたい場合は、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!
$ 

引数を解析することもできます。 こちら でチュートリアルの詳細を読むことができます。

0
Napster_X