shell中$*与$@的区别

来源:互联网 发布:万企网络是干嘛的 编辑:程序博客网 时间:2024/04/28 13:24
$*

所有的位置参数,被作为一个单词.
注意:"$*"必须被""引用.
$@
与$*同义,但是每个参数都是一个独立的""引用字串,这就意味着参数被完整地传递,
并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的
单词.
注意:"$@"必须被引用.

$@ $* 只在被双引号包起来的时候才会有差异
双引号括起来的情况:
$*将所有的参数认为是一个字段
$@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。采用LS的脚本运行./test 1 "2 3" 4   来发现差异

没有括起来的情况是$@和$*一样的,见到IFS就划分字段。还是采用LS的脚本运行./test 1 "2 3" 4   来发现差异

一个小例子 ,仅供参考

CODE:#!/bin/bash
echo

index=1

echo "Listing args with\"\$*\":"
for arg in "$*"

do
   echo "Arg #$index=$arg"
   let "index+=1"

done

echo "所有的参数被认为是一个单词"

echo

index=1

echo "Listing args with \"\$@\":"
for arg in "$@"
do
echo "Arg #$index=$arg"
let "index+=1"
done

echo "所有的参数被认为是各个独立的单词"

echo

index=1

echo "Listing args with \$* (未被引用):"
for arg in $*
do
echo "Arg #$index=$arg"
let "index+=1"
done
echo "所有的参数被认为是各个独立的单词"

exit 0
运行后输出为

CODE:[root@localhost ABS]# ./test 1 2 3 4

Listing args with"$*":
Arg #1=1 2 3 4
所有的参数被认为是一个单词

Listing args with "$@":
Arg #1=1
Arg #2=2
Arg #3=3
Arg #4=4
所有的参数被认为是各个独立的单词

Listing args with $* (未被引用):
Arg #1=1
Arg #2=2
Arg #3=3
Arg #4=4
所有的参数被认为是各个独立的单词

再补充一下
总结了makefile里面的常用变量:$* 不包含扩展名的目标文件名称。$+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。$< 第一个依赖文件的名称。$? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。$@ 目标的完整名称。$^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。$% 如果目标是归档成员,则该变量表示目标的归档成员名称。例如,如果目标名称为 搜索mytarget.so(image.o),则 $@ 为 mytarget.so,而 $% 为 image.o。

0 0