bash 脚本中变量的转义

2024-03-24

我的 bash 脚本使用 printf 编写了另一个 bash 脚本。

printf "#!/bin/bash
HOME=${server}
file=gromacs*
file_name=\$(basename "\${file}")
date=\$(date +"\%m_\%d_\%Y")


for sim in \${HOME}/* ; do
 if [[ -d \$sim ]]; then
  simulation=$(basename "\$sim")
  pushd \${sim}
  cp \$file \${server}/\${results}/\${file_name}.\${simulation}.\${date}
  echo "\${file_name}\ from\ \${simulation}\ has\ been\ collected!"
  popd
 fi
done" > ${output}/collecter.sh

这里存在日期变量中元素转义的问题

date=\$(date +"\%m_\%d_\%Y")

以下部分无法正常工作的地方

"\%m_\%d_\%Y"

它会导致 printf 生成的新 bash 脚本不完整。

应该如何修复呢?

Thanks!


使用引用的heredoc。

{
  ## print the header, and substitute our own value for HOME
  printf '#!/bin/bash\nHOME=%q\n' "$server"
  ## EVERYTHING BELOW HERE UNTIL THE EOF IS LITERAL
  cat <<'EOF'
file=( gromacs* )
(( ${#file[@]} == 1 )) && [[ -e $file ]] || {
  echo "ERROR: Exactly one file starting with 'gromacs' should exist" >&2
  exit 1
}
file_name=$(basename "${file}")
date=$(date +"%m_%d_%Y")

for sim in "$HOME"/* ; do
 if [[ -d $sim ]]; then
  simulation=$(basename "$sim")
  (cd "${sim}" && exec cp "$file" "${server}/${results}/${file_name}.${simulation}.${date}")
  echo "${file_name} from ${simulation} has been collected!"
 fi
done
EOF
} >"${output}/collecter.sh"

Note:

  • 在引用的heredoc中(cat <<'EOF'), 不执行替换,因此不需要转义。因此,我们能够完全按照我们希望生成的文件中存在的方式编写代码。
  • 生成代码时,使用printf %q以求值返回其原始值的方式转义值。否则,一个变量包含$(rm -rf ~)可能会导致运行给定的命令(如果将其替换为文字单引号,则内容$(rm -rf ~)'$(rm -rf ~)'会逃脱他们)。
  • 全局扩展返回结果列表;存储结果的正确数据类型是数组,而不是字符串。 Thus, file=( gromacs* )使结果在数组中的存储显式化,并且以下代码检查我们有多个结果的情况以及我们的结果是原始 glob 表达式的情况(意味着不存在匹配项)。
  • 所有扩展都需要加引号以防止字符串分割。这意味着"$HOME"/*, not $HOME/*-- 否则,只要用户的主目录包含空格,您就会遇到问题(是的,这种情况确实会发生 -- 考虑 Windows 派生平台,其中您有/Users/Firstname Lastname,或您已安装主目录卷的站点)。
  • pushd and popd是一个交互式扩展,而不是用于编写脚本的工具。由于产生了外部程序(例如cp)涉及 fork() 操作,并且子 shell 内的任何目录更改都会在该子 shell 执行时终止,您可以通过生成子 shell 来避免对它们的任何需要,cd' 在该子 shell 中,然后使用exec内置的子 shell 的 PID 替换为cp,从而防止fork否则的话就会发生cp在与作为其父级的 shell 分开的进程中启动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bash 脚本中变量的转义 的相关文章

  • 在 Swift 中将动态 Int 变量从一个类传递到另一个类

    我是 swift 2 的新手 我陷入了将变量从一个类传递到另一个类的过程中 我有一个类 GameScene 我有一个公共变量score并且在更新功能中不断更新 我想发送score两个节点相互碰撞时的值 一旦它发生碰撞 我就会使用 mainv
  • 如何在 sed 中转义方括号[重复]

    这个问题在这里已经有答案了 我正在使用 grep 和 sed 解析遗留的 C 代码 当尝试替换方括号时 发生了一些奇怪的事情 以下代码替换方括号效果很好 echo xyx xzx xyx sed s g 结果是 xyx xzx xyx 当我
  • 为什么我不能将 sed 的输出重定向到文件

    我正在尝试运行以下命令 someprogram tee dev tty sed s 2 gt output file 但当我去查看时 该文件始终是空白的 如果我删除 gt output file从命令末尾 我可以看到 sed 的输出 没有任
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 在 bash 中使用单个命令为 shell 变量分配默认值

    我对 bash 3 00 shell 脚本中的变量进行了大量测试 如果未设置变量 则它会分配默认值 例如 if z VARIABLE then FOO default else FOO VARIABLE fi 我似乎记得有一些语法可以在一行
  • 语法错误:for 循环变量不正确

    我正在尝试编写一个可以在后台调高收音机音量的脚本 bin sh for i 80 i lt 101 i do amixer cset numid 1 i sleep 60 done 但我有问题 alarmclock vol sh 3 ala
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • jq:将对象数组转换为对象

    我收到了来自curl的回复 格式如下 list value 1 id 12 value 15 id 13 value 4 id 14 给定 id 之间的映射 如下所示 12 newId1 13 newId2 14 newId3 我想做这个
  • 如何使用shell脚本从json字符串中grep特定字段值[重复]

    这个问题在这里已经有答案了 下面是文件中可用的 JSON 字符串 我需要从中提取值status在 shell 脚本中 预期输出 status success 响应 json eventDate null dateProccessed nul
  • OSX bash 最小化窗口

    在 Mac 中并使用 bash shell 我想执行一个包含单个命令 启动 Jupyter Lab 的文件并立即最小化终端窗口 有没有办法在不安装第三方软件的情况下做到这一点 是的 只需使用osascript https ss64 com
  • printf() 格式化十六进制

    为什么当将十六进制数字打印为带前导零的 8 位数字时 08X not显示相同的结果0x 08X 当我尝试使用前者时 08格式化标志已被删除 并且它不适用于仅8 The 部分给你一个0x在输出字符串中 这0和x计算您在列表中列出的 8 个字符
  • 获取变量的名称作为输入并使用该名称更改变量

    我从脚本用户那里获取变量的名称作为第一个参数 并将该变量的值回显到控制台 bin bash variablename 1 echo The value of variablename is variablename 这太棒了 我无法开始工作
  • php如何生成动态list()?

    根据我的理解 这就是 list 的工作原理 list A1 A2 A3 array B1 B2 B3 所以在帮助下list 我们可以相应地从数组中分配值 这是我的问题 如何生成动态list 1 基于数据库返回结果 我不确定有多少 但我将其全
  • 如何通过保持目录结构完整来同步路径中匹配模式的文件?

    我想将所有文件从服务器 A 复制到服务器 B 这些文件在不同级别的文件系统层次结构中具有相同的父目录名称 例如 var lib data sub1 sub2 commonname filetobecopied foo var lib dat
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh
  • 在bash脚本中分割字符串[重复]

    这个问题在这里已经有答案了 我想分割一个字符串并需要其中的一些参数 USER dn uid dfl3030 cn users cn accounts dc tenant dc ycs dc io cn Reb Lena Schmidt kr
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su

随机推荐

  • Fluent NHibernate 主键约束命名约定

    有没有办法在 Fluent NHibernate 中为我的主键约束创建命名约定 我知道您可以命名外键约束 但似乎不可能命名主键约束 FNH 的 James Gregory 说 不 NHibernate 不支持这一点 因此我们也无法支持它 h
  • 有没有办法将自定义颜色存储在文件中并从 iOS 中的代码访问它们?

    我是一个 iOS 新手 但我有一些 Android 编程经验 我记得在 Android 中你可以在一个文件中定义一组自定义颜色颜色 xml您可以在代码中使用该文件 因此 每次必须在某处应用新颜色时 无需以编程方式定义新颜色 我的问题是 iO
  • 如何序列化List

    我有A班 B班和C班是A班的一部分 Class A Few Properties of Class A List
  • OpenGL4.5 - 绑定多个纹理和采样器

    我试图了解 OpenGL 4 5 中的纹理 纹理单元和采样器 我附上一张我想弄清楚的图片 我认为在我的示例中一切都是正确的 但我不太确定右侧带有问号的 1D 采样器 所以 我知道 OpenGL 提供了许多纹理单元 绑定点 可以在其中绑定纹理
  • 模型驱动架构值得吗?工具的最新技术水平如何?

    我们的商店经常遇到一个问题 即同一类别 实体有 3 或 4 种不同的表示形式 java 版本 xml 版本 hibernate 版本 json 版本 您明白了 显然这会产生维护问题 模型驱动架构可能不止于此 但我真正想要的是一个系统 它允许
  • 如何让 Resharper 转换回 foreach 循环

    Resharper 5 可以转换我的foreach循环到 Linq 查询 我喜欢哪个 但是 linq 比foreachloop 当我转换我的foreach语句到 linq 查询 我没有看到任何以其他方式返回的选项 有谁知道如何做到这一点 有
  • 如何忽略目录中除一个文件之外的所有内容

    回购结构 gitignore file1 file2 dir file3
  • 召唤辅助以获得更高种类的类型,而不参考原始类型

    我正在尝试将 Aux 模式与更高种类的类型一起使用 并且直到之后才必须指定更高种类类型的参数 这类似于所描述的SO问题here https stackoverflow com questions 52581986 aux pattern f
  • 如何从不同(子)目录中打包 java 源文件?

    考虑以下目录结构 source com mypackage A java extensions extension1 source com mypackage T java extensions extension2 source com
  • ActiveRecord:find_in_batches 的替代方案?

    我有一个加载数千个对象的查询 我想通过使用来驯服它find in batches Car includes member where engine gt 123 find in batches batch size 500 根据文档 我不能
  • Babel + Mocha 堆栈跟踪报告错误的行号

    使用 Babel 6 和 Mocha 时 堆栈跟踪报告错误的行号 我很确定这是因为转译添加了额外的代码 对我来说 这是 Babel 6 与 Babel 5 x 中的新行为 有人有关于如何在使用 Mocha 进行单元测试时解决此问题的解决方案
  • 向量化 R 的 dplyr 中每行的“日期范围的扩展”

    我在 R 中的 tibble 中有一个数据集 如下所示 A tibble 50 045 x 5 ref key start date end date
  • 如何使用 Robo 3T 从 MongoDB 导出 JSON

    我正在使用 Robo 3T 以前称为 RoboMongo 我将其连接到 MongoDB 我需要做的是 MongoDB 中有一个集合 我想从该集合中导出数据 以便将其保存到文件中 I used the interface to open th
  • 打印 rdlc 报告而不查看打印对话框

    我正在编写一个 POS 应用程序 需要经常打印发票 我需要将其直接发送到打印机 而不是查看打印对话框 使用 Reportviewer renderingcomplete 我可以避免看到报告 但我不知道如何避免看到打印对话框并在没有用户干预的
  • 如何在异步加载的 HTML 元素之间创建信号量

    我在 HTML 页面中有一个出现多次的元素 并且运行相同的 JS 问题是 我希望它只有在第一个运行它时才执行特定功能 他的兄弟姐妹从未运行过它 我需要信号量在它们之间同步 我无法知道如何在 JS 中声明变量并以这种方式执行信号量 有很多方法
  • Glassfish 中的 JNDI 配置/查找

    我在 Glassfish 中获取一些基本的 JNDI 配置时遇到问题 我认为应该是一个简单的任务 在运行时确定特定属性是否设置为 true 我认为这是 JNDI 的一个很好的应用程序 但似乎无法在应用程序服务器和我的 servlet 代码之
  • 为什么自定义的基于 nib 的表格单元格的 init 方法没有被调用

    我有一个在界面生成器中创建的基于笔尖的表格视图单元 我将表视图单元格的类设置为FooTableViewCell它延伸自UITableViewCell In FooTableViewCell我像这样重写 init 方法 id init if
  • UITableViewRowAction 标题图像

    我做了一个自定义的 UITableViewRowAction 现在我想添加图像而不是文本 我知道这是可能的 但不知道该怎么做 你们中有人知道如何在 Swift 中执行此操作并愿意帮助我吗 感谢您的回答 iOS 11 0 Swift Appl
  • 解释一下c中qsort()函数的类型转换? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 1 在这段代码中pLhs and pRhs指向某个随机内存位置 那么如何将该随机内存位置的内容复制到 LHS 指向的位置 2 解释使用的比较
  • bash 脚本中变量的转义

    我的 bash 脚本使用 printf 编写了另一个 bash 脚本 printf bin bash HOME server file gromacs file name basename file date date m d Y for