다른 파일의 데이터를 사용하는 Bash 스크립트

다른 파일의 데이터를 사용하는 Bash 스크립트

나는 여러 개의 Postfix와 몇 가지 다른 것들을 쉽게 추가하는 데 사용하고 싶은 다음 스크립트를 작성했습니다.

아래는 작은 샘플입니다

postmulti -e init
postmulti -I postfix-$new -e create
cd /etc/postfix-$new
rm -rf main.cf
wget http://www.********.com/*******/main.zip
unzip main.zip
mv main main.cf
echo -e "queue_directory = /var/spool/postfix-$new" >> /etc/postfix-$new/main.cf
echo -e "data_directory = /var/lib/postfix-$new" >> /etc/postfix-$new/main.cf
echo -e "multi_instance_name = postfix-$new" >> /etc/postfix-$new/main.cf
echo -e "mydomain = $domain" >> /etc/postfix-$new/main.cf
echo -e "myhostname = host1.$domain" >> /etc/postfix-$new/main.cf
echo -e "smtp_bind_address = $ip" >> /etc/postfix-$new/main.cf
sed -i "s/oldip/$ip/g" /etc/postfix-$new/main.cf

mv /etc/opendkim/keys/$domain/default.private /etc/opendkim/keys/$domain/default
echo -e "/ndefault._domainkey.$domain $domain:default:/etc/opendkim/keys/$domain/default" >> /etc/opendkim/KeyTable
echo -e "/n*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
sed -i "s/cyberciti.com/$domain/g" /etc/postfix-$new/main.cf

이 스크립트에는 세 가지 요구 사항이 있으며 $new $ip $domain이를 파일에 한 줄씩 추가한 다음 이 스크립트를 bash하는 방법을 알고 싶습니다. 한 줄 = 스크립트 전체 실행 1회.

예를 start들어

new1, 1.1.1.1, myweb.com
new2, 2.2.2.2, myweb2.com

첫 번째 줄은 다음을 실행해야 합니다

postmulti -e init
 postmulti -I postfix-new1 -e create
 cd /etc/postfix-new1
 rm -rf main.cf
 wget http://www.********.com/*******/main.zip
 unzip main.zip
 mv main main.cf
 echo -e "queue_directory = /var/spool/postfix-new1" >> /etc/postfix-new1/main.cf
 echo -e "data_directory = /var/lib/postfix-new1" >> /etc/postfix-new1/main.cf
 echo -e "multi_instance_name = postfix-new1" >> /etc/postfix-new1/main.cf
 echo -e "mydomain = myweb.com" >> /etc/postfix-new1/main.cf
 echo -e "myhostname = host1.myweb.com" >> /etc/postfix-new1/main.cf
 echo -e "smtp_bind_address = 1.1.1.1" >> /etc/postfix-new1/main.cf
 sed -i "s/oldip/1.1.1.1/g" /etc/postfix-new1/main.cf

 mv /etc/opendkim/keys/myweb.com/default.private /etc/opendkim/keys/myweb.com/default
 echo -e "/ndefault._domainkey.myweb.com myweb.com:default:/etc/opendkim/keys/myweb.com/default" >> /etc/opendkim/KeyTable
 echo -e "/n*@myweb.com default._domainkey.myweb.com" >> /etc/opendkim/SigningTable
sed -i "s/cyberciti.com/$myweb.com/g" /etc/postfix-new1/main.cf

start파일의 모든 줄이 완료될 때까지 계속됩니다.

답변1

귀하의 스크립트를 다음으로 대체할 스크립트는 다음과 같습니다.

#!/bin/bash
while read new ip domain
do
  postmulti -e init
  postmulti -I postfix-$new -e create
  cd /etc/postfix-$new
  rm -rf main.cf
  wget http://www.********.com/*******/main.zip
  unzip main.zip
  mv main main.cf
  echo -e "queue_directory = /var/spool/postfix-$new" >> /etc/postfix-$new/main.cf
  echo -e "data_directory = /var/lib/postfix-$new" >> /etc/postfix-$new/main.cf
  echo -e "multi_instance_name = postfix-$new" >> /etc/postfix-$new/main.cf
  echo -e "mydomain = $domain" >> /etc/postfix-$new/main.cf
  echo -e "myhostname = host1.$domain" >> /etc/postfix-$new/main.cf
  echo -e "smtp_bind_address = $ip" >> /etc/postfix-$new/main.cf
  sed -i "s/oldip/$ip/g" /etc/postfix-$new/main.cf

  mv /etc/opendkim/keys/$domain/default.private /etc/opendkim/keys/$domain/default
  echo -e "/ndefault._domainkey.$domain $domain:default:/etc/opendkim/keys/$domain/default" >> /etc/opendkim/KeyTable
  echo -e "/n*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
  sed -i "s/cyberciti.com/$domain/g" /etc/postfix-$new/main.cf

done < start.txt

...내가 하는 일은 while기존 코드를 루프로 둘러싸는 것입니다.

echo또 다른 작은 변경 사항을 제안할 수 있다면 다음과 같이 모든 선언을 하나의 "여기" 문서로 병합하는 것입니다 .

cat >> /etc/postfix-$new/main.cf << EOF
queue_directory = /var/spool/postfix-$new
data_directory = /var/lib/postfix-$new
...
EOF

성능상의 이유(아마도 신경쓰지 않을 수도 있지만)가 아니라 읽기가 더 쉽기 때문입니다.

답변2

다음을 수행할 수 있습니다.

while read line;
do
new1=$(echo $line | cut -d"," -f1)
ip=$(echo $line | cut -d"," -f2)
domain=$(echo $line | cut -d"," -f3)
<Your bash script here with above three variables>
done < file.txt

관련 정보