bash 中的间接变量赋值

2024-03-27

似乎在 bash 中进行间接变量设置的推荐方法是使用eval:

var=x; val=foo
eval $var=$val
echo $x  # --> foo

问题是常见的eval:

var=x; val=1$'\n'pwd
eval $var=$val  # bad output here

(而且由于在很多地方都推荐它,我想知道有多少脚本因此而容易受到攻击......)

无论如何,使用(转义)引号的明显解决方案实际上不起作用:

var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\"  # fail with the above

问题是 bash 内置了间接变量引用(带有${!foo}),但我没有看到任何这样的方法来进行间接赋值——有没有任何明智的方法可以做到这一点?

根据记录,我确实找到了解决方案,但这不是我认为“理智”的事情......:

eval "$var='"${val//\'/\'\"\'\"\'}"'"

Bash 有一个扩展printf将其结果保存到变量中:

printf -v "${VARNAME}" '%s' "${VALUE}"

这可以防止所有可能的逃逸问题。

如果您使用无效的标识符$VARNAME,该命令将失败并返回状态码 2:

$ printf -v ';;;' '%s' foobar; echo $?
bash: printf: `;;;': not a valid identifier
2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash 中的间接变量赋值 的相关文章

  • 查找-exec选项

    比如说 我想找到一些文件并执行 chmod 并使用另一个命令对其执行某些操作 例如 find name txt exec chmod 666 cp dst it says find missing argument to exec 我该如何
  • 混淆 bash 中存储的密码

    我有一个 bash 脚本 我需要编写密码才能运行程序 其他人可以看到它 有没有办法把密码写得不太明显 即使他可以在 bash 中执行相同的命令并获取密码 他也无法读取文本形式的密码 今天我这样做 PASSWORD 1234567 progr
  • 如何将 Markdown 文档批量转换为 HTML?

    我正在用 Markdown 编写一些文档 并为文档的每个部分创建一个单独的文件 我希望能够一次性将所有文件转换为 HTML 但我找不到其他人尝试过同样的事情 我使用的是 Mac 所以我认为一个简单的 bash 脚本应该能够处理它 但我从未在
  • bash while 循环线程

    我有一个 while 循环读取来自 a 的行 hosts while read line do ip line check done lt hosts 我的问题是我可以使用某种方法来加快速度 或者一次在 10 个主机上运行检查 每个检查都在
  • 将 erlang shell 作为守护进程/服务运行

    显然 我有一个在 Erlang shell 中运行的 Erlang 程序 我想监视它 这就是我要的 当机器启动时 Erlang shell 应该随之启动 并且在 shell 中运行的程序也应该随之启动 如果 Erlang shell 由于某
  • Bash 脚本:语法错误:意外的文件结尾[重复]

    这个问题在这里已经有答案了 我有以下文件 并且该文件上有 chmod a x 当我尝试运行它时 出现第 75 行 语法错误 意外的文件结尾 我的脚本有什么错误 我需要做什么来修复它 bin sh log directory for ascp
  • 如何替换带引号的多单词字符串作为参数?

    我正在尝试替换包含多个带引号的单词的字符串变量作为命令的参数 因此 给出以下示例脚本 请注意 shebang 中的 x 这会导致输出被记录到 stderr bin bash x myArg hello world echo string i
  • 在docker镜像中运行多个脚本

    您好 我想知道是否可以在 docker 容器启动时自动同时运行两个脚本 第一个脚本必须运行客户端应用程序 第二个脚本必须运行服务器应用程序作为后台 You can use CMD在你的Dockerfile https docs docker
  • 尝试 SSH 时设备的 ioctl 不合适

    我正在尝试通过 SSH 连接几台服务器并尝试获取sudo l每个服务器的输出 下面是我正在执行的脚本 bin bash serverlist tmp servers while IFS read r server netgroup user
  • 如何使用 awk 或 sed 将“[1.0 - 4.0]”等字符串替换为数值?

    我有一个 CSV 文件 正在通过一组 awk sed 命令进行管道传输 CSV 文件中的某些行如下所示 10368 Verizon DSL DSL NY NORTHEAST 5 4 1 1 3 0 0 384 0 768 其中第 8 列和第
  • 如何摆脱每个新终端会话上运行的某些内容?

    我正在使用狮子 我在每个新的终端会话上都会输出一个错误 bash rvm add to path command not found 这是一个几乎全新的用户帐户 RVM 安装在计算机上的另一个帐户上 bashrc 和 bash profil
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • Bash - 如何将参数传递给通过标准输入读取的脚本

    我正在尝试从标准输入执行脚本并将参数传递给它 有办法做到吗 假设我有以下内容 cat script sh bash 我如何将参数传递给脚本 我不想这样做 bash script sh arguments 也不是这个 script sh ar
  • 将所有脚本参数复制到另一个变量

    我需要复制所有脚本参数并将它们传递给另一个脚本 我尝试这样做 args printargs sh args echo printargs sh args 但在这种情况下 如果我使用包含空格的参数调用我的父脚本 例如 script sh ar
  • 子 shell 何时继承其父 shell 环境?

    什么情况下将shell的环境传递给子shell 子 shell 始终从父 shell 获取所有变量 man bash将描述所有使用子shell的情况 主要是 command command command and command 所谓环境只
  • 具有非阻塞读取功能的 Bash 脚本

    我想使用命名管道将一些数据发送到根进程 这是脚本 效果很好 bin sh pipe tmp ntp if p pipe then mknod m 666 pipe p fi while true do if read line lt pip
  • <%# Eval("State") %> 或 <%# DataBinder.Eval(Container.DataItem, "state")%>

    拥有和拥有有什么区别 in your aspx页面 与具有 in your aspx page Eval State 是一个简化形式DataBinder Eval Container DataItem State 句法 它仅适用于数据绑定模
  • IFS 分隔一个字符串,如“Hello”,“World”,“this”,“is,一个无聊”,“line”

    我正在尝试解析 csv 文件 但 IFS 遇到一些问题 该文件包含如下行 Hello World this is a boring line 各列用逗号分隔 因此我尝试使用以下代码分解该行 IFS read r a tempArr lt l
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 从 bash 脚本运行节点

    很简单 我正在尝试使用 cron 自动运行 nodejs 脚本 但是脚本本身似乎无法运行该文件 我的脚本很简单 usr bin env node node var node assets js update js 但是 在运行此命令时 它返

随机推荐

  • 匹配集的数据结构

    我有一个应用程序 其中有很多组 一套可能是 4 7 12 18 唯一编号且全部小于 50 然后我有几个数据项 1 1 2 4 7 8 12 18 23 29 2 3 4 6 7 15 23 34 38 3 4 7 12 18 4 1 4 7
  • 二叉搜索树验证的空间复杂度

    验证二叉树是否为 BST 的最佳算法如下 IsValidBST root infinity infinity bool IsValidBST BinaryNode node int MIN int MAX if node null retu
  • 检查包含数十万张图像的目录中损坏的文件的速度逐渐变慢

    所以我有 600 000 多张图像 我估计其中大约 5 10 已损坏 我正在生成一个日志 准确记录与该图像相关的图像 使用Python 到目前为止我的方法是这样的 def img validator source files get pat
  • Android 4.1.2 对话框被调用两次

    当我调用显示对话框时 我的应用程序遇到了这个问题 不知何故它被调用了两次 这只发生在 android 4 1 及以上版本 较低版本工作正常 所以我不认为这是任何代码问题 您以前听说过 遇到过这个问题吗 这里是代码 Button edit B
  • 使用 AVAssetReader 读取视频文件时由于内存利用率高而导致应用程序崩溃

    我正在尝试使用此问题中接受的答案中的方法来读取视频帧 使用 AVPlayer 访问单个帧 https stackoverflow com questions 39570745 accesing individual frames using
  • 从 boost::shared_ptr 转换为 std::shared_ptr?

    我有一个内部使用 Boost 版本的库shared ptr并且只暴露那些 对于我的应用程序 我想使用std shared ptr只要有可能 遗憾的是 这两种类型之间没有直接转换 因为引用计数的内容取决于实现 有什么办法可以同时拥有boost
  • 我可以在 Rails 模型中定义方法吗?

    我的 Rails 模型的代码试图define method method name 模型内部 我不断得到 NoMethodError undefined method define method 我究竟做错了什么 我这样做是不是在错误的地方
  • 找不到 web api 路由属性

    我需要在我的 Web 服务中实现一个方法 该方法可通过定义的路线使用 所以我用了Route像这样的属性 Route api New public void CreateNew int id Do stuff 但是VS2013说找不到命名空间
  • Sidekiq 服务器未加载配置文件

    我正在尝试使用 sinatra 应用程序设置 sidekiq 并且我有 使用配置文件启动 sidekiq 工作程序以在守护程序模式下运行时遇到问题 我的项目具有以下结构 project config sidekiq yml Sidekiq
  • 如何在jquery中从右到左切换div

    我有这个小提琴 我试图创建一个浮动 div 它应该从右到左切换 我对 UI 很陌生 所以我的代码有点混乱 这是我的代码和FIddle https jsfiddle net KFmLv 6752 widget toggle btn click
  • Room :来自 Dao 的 LiveData 将在每次更新时触发 Observer.onChanged,即使 LiveData 值没有变化

    我发现只要数据库中的行被更新 Dao 返回的 LiveData 就会调用它的观察者 即使 LiveData 值显然没有改变 考虑如下例所示的情况 示例实体 Entity public class User public long id pu
  • 防止控件在禁用时变灰

    在 winforms net 控件中 如果我们将 Enabled 属性设置为 false 则控件将变灰 在这种情况下 许多颜色组合将变得不可读 因为我提供了在运行时为用户更改表单颜色的选项 我可以使用 ReadOnly 属性 但它仅适用于
  • 如何将覆盖视图放在操作栏 Sherlock 上

    我想在操作栏上设置一些视图来显示教程文本 例如单击此处并发送电子邮件 这可能吗 我问是因为我知道操作栏使用布局上的顶部空间 而片段或活动使用剩余空间 我的第二个问题是如何在操作栏上显示所有操作项 我使用 ActionBarSherlock
  • Word 2011 VBA 中的文件对话框

    我希望能进行一些健全性检查 我正在为 Mac 改编一个 Word 加载项 用 VBA 为 Word 2010 编写 具体来说 此时为 Word 2011 我知道其中的许多差异 但我无法找到其中的差异很多文档都明显缺乏 FileDialog
  • 正则表达式匹配最多 9 位的整数

    我想创建一个正则表达式 其中只允许数字 最大长度为 9 没有最小长度 我想出了 d 9 0 9 但它不起作用 你很接近了 尝试这个 d 0 9 和 分别匹配文本的开头和结尾 d 0 9 匹配字符串中的任何位置 所以d0000会通过 因为它会
  • Sql Query帮助从两个表中获取不匹配的记录

    我正在尝试从 2 个表中获取不匹配的记录 For ex TableA ID Account 1 Acc1 2 Acc2 3 Acc3 TableB Opp Accountid Opp1 1 Opp2 2 Opp3 4 我需要知道哪个 acc
  • Gradle 的 PMD 插件:什么是可接受的参数?

    Java 1 7 0 40 摇篮1 10 我从未使用过 Gradle 的 PMD 插件 并且在尝试将规则集添加到我的项目时遇到了麻烦build gradle The Pmd 文档 http www gradle org docs curre
  • 在 Git 中使用替代 diff 算法

    Because git是为源代码设计的 它的默认值diff算法将线视为不可分割的最小单位 我正在尝试编辑一些在第 80 列自动换行的 Markdown 文件 添加句子可能会导致段落的其余部分被标记为已更改 有没有办法让 Git 使用更适合文
  • 使用 ssh 的 TRAMP 不会获取 .bash_profile / .profile

    我正在使用 Aquamacs 适用于 OSX 的图形 emacs 使用 emacs 24 和 ranp 版本 2 2 3 来编辑远程服务器上的一些文件 TRAMP 设置使用ssh并且在编辑文件方面工作得很好 编译失败是因为编译器不在路径中
  • bash 中的间接变量赋值

    似乎在 bash 中进行间接变量设置的推荐方法是使用eval var x val foo eval var val echo x gt foo 问题是常见的eval var x val 1 n pwd eval var val bad ou