以下是我要执行的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"'
答案 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 "$@"`
虽然我不确定我是否理解脚本最终会尝试做什么(看起来你想要执行一个或多个文件中可能包含空格的文件)。