如何在传递给命令行参数时转义 Bash 中的变量

2024-04-21

我有一个 Bash 脚本 (Cygwin),它使用一些带有空格的 Windows 路径。因此,我逃离了这个空间\在我的变量定义中。

脚本中的所有内容都运行良好。但是,我需要将此变量作为参数传递给命令行可执行文件。当我这样做时,我的逃跑就会变得一团糟。

非功能性脚本示例:

#!/bin/sh

# File paths
destinationPath="/cygdrive/c/Documents and Settings/Eric/My Documents/"
attachments="\n2013-12-12.pdf"
body="Test Body"
recipient="[email protected] /cdn-cgi/l/email-protection"


# Prepare attachments
args=""
for file in $attachments ; do
    file=${file//[ \\n]/}
    touch $file
    mv $file "$destinationPath/$file"
    args="$args -a $destinationPath/$file"
done


# Send email
echo -e $body | email --from-addr [email protected] /cdn-cgi/l/email-protection --from-name "Automated CSS Downloader" --subject "Downloaded new file(s) \
  from CSS" $args [email protected] /cdn-cgi/l/email-protection

脚本的输出:

$ bash -x test.sh
+ destinationPath='/cygdrive/c/Documents and Settings/Eric/My Documents/'
+ attachments='\n2013-12-12.pdf'
+ body='Test Body'
+ [email protected] /cdn-cgi/l/email-protection
+ args=
+ for file in '$attachments'
+ file=2013-12-12.pdf
+ touch 2013-12-12.pdf
+ mv 2013-12-12.pdf '/cygdrive/c/Documents and Settings/Eric/My Documents//2013-12-12.pdf'
mv: listing attributes of `2013-12-12.pdf': Invalid argument
+ args=' -a /cygdrive/c/Documents and Settings/Eric/My Documents//2013-12-12.pdf'
+ echo -e Test Body
+ email --from-addr [email protected] /cdn-cgi/l/email-protection --from-name 'Automated CSS Downloader' --subject 'Downloaded new file(s) from CSS' -a /cygdrive/c/Documents and Settings/Eric/My Documents//2013-12-12.pdf [email protected] /cdn-cgi/l/email-protection
email: WARNING: Email address 'and' is invalid. Skipping...
email: FATAL: Could not open attachment: /cygdrive/c/Documents: No such file or directory

因此,如您所见,路径中的转义空间不会导出到 $args 变量中。我假设错误出现在“args=...”行上。但我不确定如何转义 $destinationPath 以确保保留转义的字符。

我尝试在destinationPath中使用双引号(没有转义空格),但无济于事。如果我尝试在 args= 行中双引号 $destinationPath,那么输出也会因一堆额外的引用而变得混乱。

我怎样才能让它发挥作用?我尝试过使用 $IFS 变量,但我真的不知道我在用它做什么,而且似乎也无法让它与它一起工作,尽管我怀疑该解决方案与 $ 有关国际金融服务协会。


如果没有数组,就没有好的方法来做到这一点。 (有一个不好的方法,使用eval,但数组更简单。)

问题是您希望每个文件最终作为一个参数email,但您希望将所有这些参数累积到一个 Bash 变量中。没有办法做到这一点:您可以将 Bash 变量作为单个参数插入("$arg") 或者您可以将其插入为任意数量的单词 ($arg),但你不能根据变量创建时是否转义空格来分割它,因为 Bash 只记住分配给变量的字符串,而不记住转义标记。

但是,您可以使用数组来完成此操作,因为您可以使每个文件名恰好成为一个数组元素,并且您可以让 Bash 插入一个数组作为每个元素的一个参数。

就是这样:

# File paths                                                                                                                              
destinationPath="/cygdrive/c/Documents and Settings/Eric/My Documents/"
attachments="\n2013-12-12.pdf"
body="Test Body"
recipient="[email protected] /cdn-cgi/l/email-protection"


# Prepare attachments                                                                                                             
args=()
for file in $attachments ; do
    file=${file//[ \\n]/}
    touch $file
    mv $file "$destinationPath/$file"
    args+=(-a "$destinationPath/$file")
done

# Send email                                                                                                                      
echo -e $body |
  email --from-addr [email protected] /cdn-cgi/l/email-protection \
        --from-name "Automated CSS Downloader" \
        --subject "Downloaded new file(s) from CSS" \
        "${args[@]}" [email protected] /cdn-cgi/l/email-protection

您可能还想做attachments变量存入数组;从换行符的存在来看,我假设您实际上是以某种更复杂的方式设置它,所以我没有更改代码。但是如果附件名称中有空格,您当前的代码将无法工作(并且我非常确定换行符将被中的参数扩展消除)for形式,除非您更改了值$IFS, so file=${file//[ \\n]/}应该没有必要。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在传递给命令行参数时转义 Bash 中的变量 的相关文章

  • 使用 mysql 变量保存用于 where in 子句的逗号分隔值

    我必须运行这样的查询 查询 1 select something from sometable where someId in 1 2 3 我想为 ID 部分保留一个变量 如下所示 查询 2 set myIds 1 2 3 select s
  • 远程 ssh 命令:第一个回显输出丢失

    我试图通过 ssh 1 liner 调用在远程机器上运行多个命令 方法是将它们指定为传递给 bash c 的分号分隔字符串 它适用于某些情况 但不适用于其他情况 看一下这个 Note the echo 1 output is lost ba
  • 想要运行命令列表,但能够在运行时编辑该列表

    我有一个要运行的 bash 命令列表
  • Unix cURL POST 使用文件中的内容到特定变量

    我已经搜索过这个答案 但没有找到任何有效或完全符合我的问题的答案 使用 Unix cURL 我需要将键 值对发布到服务器 密钥将是 MACs 换行符分隔的 MAC 地址文件的内容将是此 POST 的 VALUE 我试过了 curl d fi
  • 在 bash 函数中生成后台进程

    我正在编写一个 Bash 函数来启动需要从某个文件夹启动的服务器 但我不希望启动该服务器影响我当前的工作 我写了以下内容 function startsrv pushd cd TRUNK SERVERCOMMAND popd 我的变量都已设
  • bash 别名中允许使用哪些字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我最近添加了 alias cd alias cd alias cd 到我的 bash aliases 文件 玩弄这个 我注意到在别名时 被
  • 通过 Assets Pipeline 携带 Sass 变量,Rails 3.1 rc1

    我最近将我的 Rails 3 0 项目之一与 3 1 rc1 进行了分支 以尝试新的资产管道 在使用 3 1 之前 我一直在项目中使用 Sass 因此我在单独的配置文件中设置了一些变量和函数 并让所有其他 sass 文件在第一行导入该文件
  • 在 makefile 中,当我在 bash 函数内部使用 if 语句时,它会抛出错误

    在 makefile 中 当我在 bash 函数内部使用 if 语句时 它会抛出错误 test foo if a a then echo 1 fi foo hello ERROR bin sh 1 未找到 或与一个 test foo if
  • 如何替换每行中出现的所有字符串?

    我想在以下脚本中将所有出现的 用户名 替换为 但它仅替换第一次出现的情况 ls al sed s username 这就是 sed 默认情况下的工作方式吗 提前致谢 你需要g 全局 修饰符 sed s username g
  • envsubst 不能进行就地替换吗?

    我有一个配置文件 其中包含一些 ENV VARIABLE 样式的变量 This is my file It might contain EXAMPLES of text 现在我希望将该变量替换为保存在实际环境变量中的值 所以我正在尝试这个
  • -bash: gulp: 在 Mac 中找不到命令

    我尝试在 mac 中安装 gulp 如下所示 Is iMac itop npm root Users itop node modules Is iMac itop npm config set prefix usr local Is iMa
  • 我们可以使用 python 变量来保存整个文件吗?

    假设我们知道所有文件都将被加载到内存中并且我们负担得起 在 python 变量中加载整个文件 可能是二进制文件 有哪些缺点 如果有 或限制 如果有 如果这在技术上是可行的 是否应该避免这种情况 为什么 关于文件大小问题 该解决方案的最大大小
  • Jenkins 中的 Powershell 转义路径字符

    我有一个声明性管道 应该执行 powershell 步骤来安装路径 路径作为参数提供 parameters string name UNC defaultValue server01 lab local shared data descri
  • C语言中变量名是如何存储在内存中的?

    在 C 中 假设你有一个名为variable name 假设它位于0xaaaaaaaa 在该内存地址处 您有整数 123 换句话说 variable name包含 123 个 我正在寻找有关措辞的澄清 variable name位于0xaa
  • 添加反斜杠而不转义[重复]

    这个问题在这里已经有答案了 我需要逃离 字符串中的 字符 问题是每当我string string replace 结果是 添加额外的反斜杠来转义原始反斜杠 如何删除这个多余的反斜杠 结果 仅显示 实际上字符串是 gt gt gt str g
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 按行号和列号对文件进行子集化

    我们想要按行和列对文本文件进行子集化 其中行数和列数是从文件中读取的 不包括标题 第 1 行 和行名称 第 1 列 输入文件 txt制表符分隔的文本文件 header 62 9 3 54 6 1 25 1 2 3 4 5 6 96 1 1
  • PHP 静态变量用双引号引起来

    如何让 PHP 计算双引号中的静态变量 我想做这样的事情 log self CLASS METHOD entering 我尝试过各种 组合来获取变量值self CLASS 但没有任何效果 我目前已经解决了字符串连接问题 但输入起来很痛苦 l
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • python 中未定义变量

    你好 我对 python 编程很陌生 我正在开始我的第一个程序 但我遇到了一些麻烦 有没有更好的方法来执行下面的代码片段 当我运行该程序时 我得到 yes no 未定义 def main print n Welcome to registr

随机推荐