是否有任何“帮助程序”脚本来协助加载/覆盖命令参数?

是否有任何“帮助程序”脚本来协助加载/覆盖命令参数?

我有以下脚本 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

有一个相当简单的方法,如果

  1. 您使用 bash、ksh 或类似的高级 shell
  2. 你稍微改变一下你想要的语法。

和;

#!/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,但这似乎并没有让事情变得简单。

相关内容