1

我一直在尝试将以下内容放入 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"

......会工作,但它没有。有什么建议,在我变灰秃之前?谢谢

我不会用我尝试过的所有变体来浪费空间,但我会说我已经尝试过逃避几乎所有的东西,基本上什么都没有,中间还有很多都没有成功。当我收到“没有这样的文件或目录”时,我显然会逃避,直到文件实际解析,但即使我没有收到路径错误,命令也没有成功完成。

我确实理解这是一个非常具体的案例,但我想它会在未来对其他人有所帮助:在 bash 脚本中转义空格,使用嵌入式expect(我已经使用#!/bin/bashshebang 和嵌入式进行了测试,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
4

2 回答 2

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)
于 2013-03-12T02:03:49.347 回答
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电话给你带来了最大的问题,再次,间接节省你做奇怪的 escape-char-yoga,只需将结果放入一个 var 并使用它。

fw_date=$(date +%F)
firewall_config="${SPICEWORKS_CONFIGS}/LA_${fw_date}-firewall-5520"
于 2013-03-12T02:09:29.263 回答