Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash字符串中存储文字通配符_Bash_Variables_Escaping_Quoting_Metacharacters - Fatal编程技术网

在bash字符串中存储文字通配符

在bash字符串中存储文字通配符,bash,variables,escaping,quoting,metacharacters,Bash,Variables,Escaping,Quoting,Metacharacters,假设我有一个函数 print_args () { for i in $@; do echo "$i" done } 当我这样做的时候 foo='\*' print_args $foo 我明白了 \* (带反斜杠)作为输出 如果我将foo的定义改为foo='*',则在运行print_args$foo时,我会获取当前目录中的所有文件 因此,我要么包含反斜杠,要么解释*,但我不知道如何从字面上理解* 无论我是否在$foo周围包含双引号,输出都是相同的。一般规则是引

假设我有一个函数

print_args () {
    for i in $@; do
        echo "$i"
    done
}
当我这样做的时候

foo='\*'
print_args $foo
我明白了

\*
(带反斜杠)作为输出

如果我将
foo
的定义改为
foo='*'
,则在运行
print_args$foo
时,我会获取当前目录中的所有文件

因此,我要么包含反斜杠,要么解释
*
,但我不知道如何从字面上理解
*


无论我是否在
$foo
周围包含双引号,输出都是相同的。

一般规则是引用所有变量。它可以防止外壳在空间上展开和拆分。因此,您的函数应该如下所示(引用
$@
,以及
${array[@]}
按参数拆分):

这样称呼它:

print_args "$foo"

引用扩展名
$foo
print_args“$foo”
@Etan抱歉,我在你完成评论之前编辑了。它是否具有相同的双引号。哦,您还需要在扩展名
$@
周围加引号<代码>用于“$@”中的i。一般规则:“总是引用变量展开式。”啊,就是这样。我认为
$@
在这方面很特别,但我想我是记错了。
print_args "$foo"