使用$@&引用;在bash中的其他内部引用

使用$@&引用;在bash中的其他内部引用,bash,command-line-arguments,quotes,Bash,Command Line Arguments,Quotes,下面是我想要执行的bash脚本的代码:打开一个新控制台并在其中执行clamscan,其中包含一个文件列表 gnome-terminal -x sh -c "clamscan $@" 在此展开后,如果脚本的两个参数为 file1.txt file2.txt gnome-terminal -x sh -c 'clamscan file1.txt' file2.txt 如您所见,仅执行了clamscan file1.txt 如果我尝试另一种方式来编写代码 gnome-terminal -x sh

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

gnome-terminal -x sh -c "clamscan $@"
在此展开后,如果脚本的两个参数为
file1.txt file2.txt

gnome-terminal -x sh -c 'clamscan file1.txt' file2.txt
如您所见,仅执行了
clamscan file1.txt

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

gnome-terminal -x sh -c "clamscan \"$@\""
这是扩展结果

gnome-terminal -x sh -c 'clamscan "file1.txt' 'file2.txt"'
没有比这更好的了。
有人知道如何在别人的引号中正确地集成
“$@”

编辑 我的目标是在扩张后

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

尽管我不确定自己是否理解脚本最终要执行的操作(似乎您想要执行一个或多个文件,这些文件的文件名中可能包含空格)。

试试这个

#!/bin/bash

params=("$@")

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

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

[root@myhost test]# sh ./script.sh aaaa "bbbb cccc"
'aaaa' 'bbbb cccc'

3.4.2特殊参数
@
展开到位置参数,从一开始。当展开发生在双引号内时,每个参数展开为一个单独的字。也就是说,“$@”相当于“$1”$2”

重要部分是等效的,它没有扩展到
“$1”“$2”
,即使用双引号。如果需要,您有两个选择,自己准备参数

for i in "$@"; do
    args="$args \"$i\""
done

gnome-terminal -x clamscan $args
或者将部分命令行放入脚本中

script.sh:

clamscan "$@"
就这么说吧

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

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

单引号不展开变量,因此展开结果是
gnome terminal-x sh-c'echo$@'
$@
未展开,不显示任何内容。是的,但当
sh
启动命令时,它将展开给定的字符串。你试过了吗?是的,我刚试过,什么也没显示。使用简单引号时,
$@
不会在第一次展开,而是在第二次展开时使用
sh
进行展开,而是将其视为未知变量。没有任何sh使用或不使用该变量进行展开。您是否尝试过:gnome terminal-xsh-c“echo\$@”,为什么不使用
$*
而不是
$@
$@
相当于
“$1”“$2”
$*
“$1$2”
我的坏。我简化了示例,认为它会更清晰。这是原始代码
gnome terminal-x sh-c“clamscan-r$@| less”
我想给
clamscan
(或任何二进制文件)一个文件名列表,每个文件名都用引号括起来,因为它们可能包含空格。你的解决方案不符合我的需要。太好了,你的for语句正是我想要的。如果任何参数包含引号呢?@krlmlr我真的不明白这个问题。你为什么认为引号很特别?您可以使用“$@”中f的脚本
轻松测试这一点;做回显“$f”;完成
并使用适当的参数调用它。sh'a““'b”c@OlafDietsche:我认为他们可能会混淆一些东西,但显然它只是工作:-)很好的发现。它与
$*
变量一起工作,需要替换所有出现的空格:
${*/\}
如果任何参数包含一个单引号怎么办?
gnome-terminal -x script.sh file1.txt file2.txt