“逃离”噩梦

时间:2013-03-12 01:47:39

标签: bash escaping special-characters expect

我一直试图将以下内容放入bash脚本中:

scp /cygdrive/c/Program\ Files\ \(x86\)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520 "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08\ -\ Security/Firewalls"

...通过命令行按预期工作。

当我尝试将它放在脚本中时,我显然必须双倍逃避空间,还有其他什么?我无法通过我尝试过的众多变化获得成功。

我想:

scp /cygdrive/c/Program\\ Files\\ \(x86\)/Spiceworks/data/configurations/LA_\$(date\ +%F)-firewall-5520 "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08\\ \\-\\ Security/Firewalls"

......会起作用,但事实并非如此。在我变灰和秃头之前有什么建议吗?感谢

我不会浪费我所尝试的所有变化的空间,但我会说我已经尝试逃避几乎所有的事情,基本上什么都没有,很多在两者之间没有成功。当我收到“没有这样的文件或目录”时,我明显逃脱,直到文件实际解析,但即使我没有得到路径错误,该命令也没有成功完成。

我确实理解这是一个非常具体的案例,但我想它将来会帮助其他人:使用嵌入式expect在bash脚本中转义空格(我已使用#!/bin/bash进行了测试shebang和嵌入式expect using expect -c ' .... '以及#!/usr/bin/expect使用简单的spawn scp命令而无需更改。

编辑(根据回复):

我应该提到我试过引用它......

引用第一个(主机)部分给出错误

  

无法读取“(日期+%F)”:没有这样的变量       执行时

"spawn scp "/cygdrive/c/Program Files (x86)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520" "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_..."

...它不是一个变量,它是一个函数,以year-month-day

格式给我当前日期

在不转义任何内容的情况下引用目标部分会给出错误

scp: ambiguous target

2 个答案:

答案 0 :(得分:3)

在bash shell中使用的相同命令在bash脚本中的工作方式应该相同。你不应该也不能逃避它两次。

如果它不起作用,请确保您从同一终端测试脚本,确保脚本内容和命令相同,然后在执行时粘贴终端的输出:

$ scp /cygdrive/c/Program\ Files\ \(x86\)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520 "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08\ -\ Security/Firewalls"
(successful scp output here)
$ cat testscript
(testscript contents here, should be identical to above scp command)
$ bash testscript
(unsuccessful script/scp output here)

答案 1 :(得分:2)

只要把它贴在引号上并停止打自己,就像@that_other_guy所说,你不能,也不应该试图逃避两次,无论你有什么想法,都不要把它当作信息来源。 (我的猜测是来自“稀薄的空气”

scp "/cygdrive/c/Program Files (x86)/Spiceworks/data/configurations/LA_$(date +%F)-firewall-5520" "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08 - Security/Firewalls"

你甚至可以给自己一些帮助:

export PROGFILESx86="/cygdrive/c/Program Files (x86)"
export SPICEWORKS_CONFIGS="${PROGFILESx86}/Spiceworks/data/configurations"

(将它们添加到.bashrc,执行它。)然后执行:

scp "${SPICEWORKS_CONFIGS}/LA_$(date +%F)-firewall-5520" "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08 - Security/Firewalls"

我还要关注你试图scp实际存在的文件,将其包装在一个条件中以验证它们是否存在,只有在你自动生成文件名时才有意义

firewall_config="${SPICEWORKS_CONFIGS}/LA_$(date +%F)-firewall-5520"

if [ -e "${firewall_config}" ]
    then
        scp "${firewall_config}" "sf-mlawler@10.21.1.212:/home/sf-mlawler/SBOX_Automation/SBOX_Dumps/08 - Security/Firewalls"
    else         
        echo "File doesn't exist: ${firewall_config}"
fi

更新

由于你已经更新了你的问题,显然date调用会给你带来最大的问题,再次,间接可以让你做出奇怪的逃避 - char-yoga,只需将结果输入var并使用它

fw_date=$(date +%F)
firewall_config="${SPICEWORKS_CONFIGS}/LA_${fw_date}-firewall-5520"