2013-02-22 31 views
3

这是我要执行的bash脚本的代码:打开一个新的控制台,并在其中clamscan与文件的列表

gnome-terminal -x sh -c "clamscan [email protected]" 

后扩大本地执行如果给脚本中的2个参数是
file1.txt file2.txt

gnome-terminal -x sh -c 'clamscan file1.txt' file2.txt 

正如你看到的只是clamscan file1.txt执行确实执行了什么。

如果我尝试另一种方式来写代码

gnome-terminal -x sh -c "clamscan \"[email protected]\"" 

这里展开结果

gnome-terminal -x sh -c 'clamscan "file1.txt' 'file2.txt"' 

它不工作得更好。
有谁知道如何正确整合"[email protected]"里面别人的引号?

编辑 我的目标是扩大东西等之后有

gnome-terminal -x sh -c 'clamscan "file1.txt" "file2.txt"' 
+0

单引号不扩大的变量,所以扩张的结果是'的gnome-terminal -x SH - c'echo $ @''和'$ @'不扩展,不显示任何内容。 – Nicolas 2013-02-22 11:30:40

+0

是的,但是当'sh'启动命令时,它会扩展给定的字符串。你尝试过吗? – Zulu 2013-02-22 11:32:07

+0

是的,我刚刚尝试过,没有显示任何内容。用简单的引号'$ @'不是第一次扩展,而是用'sh'扩展了第二次,但是作为未知变量处理。 – Nicolas 2013-02-22 11:33:49

回答

3

man bash

3.4.2特殊参数
@
扩展为位置参数,从1开始。当扩展出现在双引号内时,每个参数都会扩展为单独的单词。也就是说,“$ @”是相当于到“$ 1”“$ 2”...。

的重要组成部分,是相当于,它扩大到"$1" "$2",即用双引号。如果你需要,你有两个选择,你自己

for i in "[email protected]"; do 
    args="$args \"$i\"" 
done 

gnome-terminal -x clamscan $args 

准备的参数或将命令行的一部分在脚本

脚本。SH:

clamscan "[email protected]" 

并调用

gnome-terminal -x script.sh file1.txt file2.txt 
+0

非常好,你的陈述正是我一直在寻找的。 – Nicolas 2013-02-22 12:45:21

+0

如果任何参数包含引号会怎么样? – krlmlr 2013-04-20 21:27:54

+0

@krlmlr我不太了解这个问题。你为什么认为报价是特殊的?您可以使用'$ @“中的脚本'for f'轻松测试它。做回声“$ f”; done',用适当的参数'SH test.sh“一“”“”B” C'叫它 – 2013-04-20 21:35:22

0

尝试:

gnome-terminal -x sh -c `echo "[email protected]"` 

虽然我不知道我理解剧本最终试图做(看起来你想要执行一个或多个文件,这些文件的文件名中可能包含空格)。

+0

我的不好。我简化了这个例子,认为它会更清晰。这里是原代码'的gnome-terminal -x SH -c“clamscan -r $ @ |少”'我想给'clamscan'(或任何二进制)文件名列表,用引号包围每一个,因为他们可能包含空格。您的解决方案不适合我的需要。 – Nicolas 2013-02-22 12:04:52

2

试试这个

#!/bin/bash 

params=("[email protected]") 

for i in "${params[@]}" 
do 
    string="${string} \'$i\'" 
done; 

// subst with your full command, this is only for test purposes 
sh -c "echo ${string}" 

测试:

[[email protected] test]# sh ./script.sh aaaa "bbbb cccc" 
'aaaa' 'bbbb cccc' 
+0

有点复杂,但它的工作原理。谢谢 !!! – Nicolas 2013-02-22 12:42:16

+0

如果任何参数包含单引号会怎么样? – krlmlr 2013-04-20 21:28:48

1

您可以使用变量替换:${@/ /\\ }

+0

- 尼斯找到它的工作原理。使用'$ *'变量,你需要替换每一个空格:'$ {* ///\\}' – Nicolas 2013-03-03 08:57:39