在bash中使用其他引号内的“$ @”

时间:2013-02-22 11:18:57

标签: bash command-line-arguments quotes

以下是我要执行的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 个答案:

答案 0 :(得分:3)

来自man bash

  

3.4.2特殊参数
  @
      从1开始扩展到位置参数。当扩展发生在双引号内时,每个参数都会扩展为单独的单词。也就是说," $ @"是等同于到" $ 1" " $ 2#34; ...

重要的部分是等效,它扩展为"$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

答案 1 :(得分: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'

答案 2 :(得分:1)

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

答案 3 :(得分:0)

尝试:

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

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