使用外部文件中的变量控制 bash 脚本

使用外部文件中的变量控制 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

对于 shell 脚本,这通常是使用source函数来实现的,该函数将文件作为 shell 脚本执行,就好像它被内联到您正在运行的脚本中一样 - 这意味着您在文件中设置的任何变量都将导出到您的脚本中。

缺点是 (a) 您的配置文件会被执行,因此如果非特权用户可以编辑特权配置文件,则存在安全风险。并且 (b) 您的配置文件语法仅限于有效的 bash 语法。不过,它确实很方便。

配置配置文件

USER=joe
PASS=hello
SERVER=127.0.0.2

脚本

#!/bin/bash

# Set defaults   
USER=`whoami`

# Load config values
source config.conf

foobar2000 --user=$USER --pass=$PASS --HOST=$HOST

source可以用单个.-- 缩写,因此以下两个是等效的:

 source file.sh
 . file.sh

答案2

就像这样。重要的是使用抓取一行作为数组。

#!/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

我在这里找到了可行的解决方案: https://af-design.com/2009/07/07/loading-data-into-bash-variables/

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

答案4

我认为如果您想让您的脚本变得智能,您应该使用像 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!
$ 

您还可以解析参数。您可以阅读有关本教程的更多详细信息这里

相关内容