如果传递参数,则从脚本外部强制变量值

Posted

技术标签:

【中文标题】如果传递参数,则从脚本外部强制变量值【英文标题】:Forcing Variable value from outside of the script if argument is passed 【发布时间】:2017-04-27 10:54:02 【问题描述】:

我在想从脚本外部强制变量值的最佳方法是什么。

现在我正在使用配置文件,但我被要求提供一种从外部强制参数的方法。


实际代码

source "$1.iconf"

// some code that uses variables declared and initialized in the configuration file

这是在该配置文件中以静态方式使用变量的标准情况。我只是运行传递配置文件名的脚本。

./myscript.sh configuration_file

现在在配置文件中定义了一些变量:

Var1 = some value
Var2 = 42
Var3 = "foo"

我应该能做什么:

./myscript.sh configuration_file --Var1="Value defined from outside"

source "$1.iconf"

//Check if some variables are passed from run string
if [ <Passed_From_Run_String_condition> ]; then
    //override variables value
    //maybe some kind of arguments parsing??
fi

//some code that uses variables declared and initialized in the configuration file (and maybe overridden by passed values)

【问题讨论】:

因此,您希望首先根据作为参数传入的变量覆盖脚本中的变量(第二优先顺序),然​​后您希望通过配置文件中存在的值覆盖变量(第一顺序)优先级)? 首先从配置文件中赋值,然后如果某些变量通过参数以不同方式传递,则覆盖该特定变量值 添加了一个新答案,应该足以让您入门。 【参考方案1】:

此脚本将首先将存储在配置文件中的变量作为第一个参数传递给脚本,然后将变量作为第二个参数,这些变量可用于覆盖配置文件中的值或创建新变量(如果它们没有) '以前不存在。

foo.sh

#!/bin/bash

source "$1"
eval "typeset $2"

echo $var1

配置

var1="foo"

运行脚本:

./foo.sh config var1=yup

输出:

yup

配置文件中的值“foo”被第二个参数“yup”传入的值替换。如果你想让一个变量只读,不能改变它的值,你可以使用 typeset -r 来定义一个变量。

【讨论】:

好的,它工作正常,谢谢! :) 但是这样有人可以编写一些不能执行的命令(例如 rm),你知道是否有办法防止这种情况发生吗? 当然,您可以执行类似 eval "typeset $2" 之类的操作,这将确保您声明一个变量而不是执行某种其他命令。 太棒了!似乎有效:D 我可以使用 export 来做同样的事情吗?有什么区别? 我做了一些测试,至少有两种执行命令的方式:1)./foo.sh config var1='rm *' ----- 2)./foo.sh config var1=$(rm *) 是的,如果用户拥有 rm 文件的权限,他们当然可以这样做,与脚本无关。

以上是关于如果传递参数,则从脚本外部强制变量值的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级程序设计(复制变量值传递参数)

将变量值从 JS 传递给 PHP

C++ 变量值未从标头传递到主

Node.js:如何将 JS 变量值从脚本传递到终端?

Dart是值传递还是引用传递

PHP基础:文件包含,参数和传递,匿名函数