3

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

gnome-terminal -x sh -c "clamscan $@"

在这里展开之后,如果给脚本的 2 个参数是真正执行的内容
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"'
4

4 回答 4

3

man bash

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

重要的部分是等价的,它不会扩展"$1" "$2",即双引号。如果你需要,你有两个选择,自己准备参数

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

gnome-terminal -x clamscan $args

或将部分命令行放入脚本中

脚本.sh:

clamscan "$@"

并称之为

gnome-terminal -x script.sh file1.txt file2.txt
于 2013-02-22T12:40:11.133 回答
2

试试这个

#!/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'
于 2013-02-22T12:35:57.143 回答
1

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

于 2013-02-22T19:04:11.080 回答
0

尝试:

gnome-terminal -x sh -c `echo "$@"`

虽然我不确定我是否理解脚本最终试图做什么(看起来你想要执行一个或多个文件名中可能包含空格的文件)。

于 2013-02-22T12:00:43.913 回答