Shell特殊变量
Shell特殊变量
1、Shell特殊变量
1.1、Shell特殊变量表以及作用
变量名称 | 作用 |
---|---|
$0 | 当前脚本的文件名。 |
$n(n≥1 | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
1.2、给脚本文件传递参数
#!/bin/bash
echo "Process ID: $$"
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "All parameters 1: $@"
echo "All parameters 2: $*"
echo "Total: $#"
运行 test.sh,并附带参数:
1.3、给函数传递参数
#!/bin/bash
#定义函数
function func(){
echo "Language: $1"
echo "URL: $2"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "All parameters 1: $@"
echo "All parameters 2: $*"
echo "Total: $#"
}
#调用函数
func Java hello
2、浅谈 $ * 和$ @的区别
$*
和$@
是Shell的特殊变量,作用都是获取传递给脚本或函数的所有参数。在没有被双引号包围时,两者没有区别,都是将接受到的每个参数都是独立的,用空格分隔。也就是说下面两段代码是等效的。
#!/bin/sh
foo(){
echo $*
}
bar(){
echo $@
}
foo 1 2 3 4
bar 1 2 3 4
那么$*
和$@
的区别在哪里?,加双引号以后进行试验:”
#!/bin/bash
test_param() {
echo "Receive $# parameters"
echo Using '$*'
echo
for param in $*; do
printf '==>%s<==\n' "$param"
done;
echo
echo Using '"$*"'
for param in "$*"; do
printf '==>%s<==\n' "$param"
done;
echo
echo Using '$@'
for param in $@; do
printf '==>%s<==\n' "$param"
done;
echo
echo Using '"$@"';
for param in "$@"; do
printf '==>%s<==\n' "$param"
done
}
IFS="^${IFS}"
test_param 1 2 3 "a b c"
输出结果
"$*"
会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"$*"
为空,如果有两个位置参数并且IFS为空格时,"$*"
相当于"$1 $2"
"$@"
会把所有位置参数当成一个单独的字段,如果没有位置参数($#
为0),则"$@"
展开为空(不是空字符串,而是空列表),如果存在一个位置参数,则"$@"
相当于"$1"
,如果有两个参数,则"$@"
相当于"$1" "$2"
等等
3、$?获取函数返回值或者上一个命令的退出状态
$?
是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。
所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0
,失败返回 1
,这和C语言的 main() 函数是类似的。
3.1、$? 获取上一个命令的退出状态
#!/bin/bash
if [ "$1" == 100 ]
then
exit 0 #参数正确,退出状态为0
else
exit 1 #参数错误,退出状态1
fi
exit表示退出当前 Shell 进程,我们必须在新进程
中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态了。
3.2、$? 获取函数的返回值
#!/bin/bash
#得到两个数相加的和
function add(){
return `expr $1 + $2`
}
add 23 50 #调用函数
echo $? #获取函数返回值
参考
1、http://c.biancheng.net/view/806.html
2、https://www.cnblogs.com/Template/p/9182534.html