我有以下脚本 sub.sh:
#!/bin/sh
. ./sub.conf
echo $topic
mosquitto_sub -u $user -P $password -h $server -t $topic
以及相关的设置文件sub.conf:
topic="#" #-t
user="mqtt" #-u
password="mqttpass" #-P
server="127.0.0.1" #-h
我想找到一种方法来调用我的脚本并覆盖 sub.conf 文件中使用的传入的任何值。例子:
./sub.sh -t foobar
将使用 .conf 文件中的所有值除了 $topic
将等于foobar
而不是#
.这需要以某种方式将命令行参数映射-t
到$topic
.我意识到写这个可能会很快变成比我想写的更多的代码。我认为有人写了类似的东西,而不是重新发明轮子。
答案1
我发现了一个非常好的脚本生成器网站,名为阿尔格巴什。您输入一个“模板”,它将为您构建一个骨架脚本。对于我的示例,~/sub.conf
使用您的默认值在您的用户主目录中创建一个文件:
topic="#"
user="mqtt"
password="mqttpass"
server="127.0.0.1"
接下来,转到argbash的模板创建页面并为其提供此模板:
#!/bin/bash
# version="0.1"
#
# This is an optional arguments-only example of Argbash potential
#
# ARG_OPTIONAL_SINGLE([user], [u], [optional argument help msg])
# ARG_OPTIONAL_SINGLE([Password], [P], [optional argument help msg])
# ARG_OPTIONAL_SINGLE([server], [s], [optional argument help msg])
# ARG_OPTIONAL_SINGLE([topic], [t], [optional argument help msg])
# ARG_HELP([The general script's help msg])
# ARGBASH_GO
# [ <-- needed because of Argbash
echo "Value of --user: $_arg_user"
echo "Value of --Password: $_arg_password"
echo "Value of --server: $_arg_server"
echo "Value of --topic: $_arg_topic"
# ] <-- needed because of Argbash
然后单击“立即生成脚本”按钮。它将为您生成一个脚本,然后您可以下载该脚本。在该脚本内部搜索:
# THE DEFAULTS INITIALIZATION - OPTIONALS
_arg_user=
_arg_password=
_arg_server=
_arg_topic=
只需将其更改为:
# THE DEFAULTS INITIALIZATION - OPTIONALS
. ~/.sub.conf
_arg_user=$user
_arg_password=$password
_arg_server=$server
_arg_topic=$topic
. ~/.sub.conf
会将配置文件中的值加载到该文件中指定的变量中。以下几行将填充您在模板中指定的每个命令行参数。传递到脚本中的任何值都将覆盖这些默认值。echo "Value of --user: $_arg_user
如果您愿意,可以删除这些语句。在脚本的最后,只需使用参数,例如:
mosquitto_sub -u $_arg_user -P $_arg_password -h $_arg_server -t $_arg_topic
答案2
有一个相当简单的方法,如果
- 您使用 bash、ksh 或类似的高级 shell
- 你稍微改变一下你想要的语法。
和;
#!/bin/bash
. ./sub.conf
[ -n "$1" ] && declare "$@" # use arguments to set variables
echo $topic
mosquitto_sub -u $user -P $password -h $server -t $topic
你可以做;
./sub.sh topic='#'
例子:
$ bash -c 'foo=1; declare "$@"; echo $baz $foo' _ foo=bar baz=fo
fo bar
答案3
没有一种现成的解决方案可以只用一个字符串来调用。但是您可以使用类似getopts
或相似的东西。
-t
这是获取和-u
选项的示例bash
:
#!/bin/bash
while getopts ":t:u:" OPTION; do
case "$OPTION" in
t) echo topic="$OPTARG" ;;
u) echo user="$OPTARG" ;;
esac
done
这是您至少必须添加到脚本中的。
您可能还想考虑像这样的库shflags,但这似乎并没有让事情变得简单。