我想控制这样的 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!
$
您还可以解析参数。您可以阅读有关本教程的更多详细信息这里。