本地变量
定义Shell变量,变量名不需要加美元符号 $
本地变量只在当前shell生存期中有效
变量定义
变量名要求:字母、数字、下划线组成,只能是字母或下划线开头,变量名严格区分大小写
取出变量值
特殊参数变量
shell的特殊变量,用在如脚本,函数传递参数使用,有如下特殊的,位置参数变量
$0 获取shell脚本文件名,以及脚本路径
$n 获取shell脚本的第n个参数,n在1~9之间,如$1,$2,$9,大于9则需要写${10},参数空格隔开
$# 获取执行的shell脚本后边的参数总个数
$* 获取shell脚本所有参数,不加引号等同于$@作用,加上引号"$*"作用是接收所有参数为单个字符串,"$1 $2.."
$@ 不加引号,效果同上,加引号是接收所有参数为独立字符串,如"$1" "$2" "$3" ...,空格保留
实践脚本
ubuntu@VM-12-16-ubuntu:~$ cat special_var.sh
#! /bin/bash
echo '特殊变量 $0 $1 $2 ..的实践'
echo '结果:' $0 $1 $2
echo '#########################'
echo '特殊变量$#获取参数总个数'
echo '结果:' $#
echo '#########################'
echo '特殊变量 $*的实践'
echo '结果:' $*
echo '#########################'
echo '特殊变量$@实践'
echo '结果:' $@
执行结果
ubuntu@VM-12-16-ubuntu:~$ bash special_var.sh god_frey 180 180 180 180
特殊变量 $0 $1 $2 ..的实践
结果: special_var.sh god_frey 180
#########################
特殊变量$#获取参数总个数
结果: 5
#########################
特殊变量 $*的实践
结果: god_frey 180 180 180 180
#########################
特殊变量$@实践
结果: god_frey 180 180 180 180
试题
$* 和 $@ 的区别是什么?
$* 和 $@ 都表示传递给函数或脚本的所有参数
当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,
彼此之间以空格来分隔。
但是当它们被双引号" "包含时,就会有区别了:
"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
“god_frey 180 180 180 180”
"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
“god_frey ”
“180”
“180”
“180”
“180”
比如传递了 5 个参数,那么对于"$*"来说,这 5 个参数会合并到一起形成一份数据,它们之间是无法分割的;
而对于"$@"来说,这 5 个参数是相互独立的,它们是 5 份数据。
如果使用 echo 直接输出"$*"和"$@"做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,
立即就能看出区别来。
shell for循环的知识
反斜杠 '\' ,是转义符号
ubuntu@VM-12-16-ubuntu:~$ cat different.sh
#!/bin/bash
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
执行结果
ubuntu@VM-12-16-ubuntu:~$ bash different.sh god-frey 180 180
print each param from "$*"
god-frey 180 180
print each param from "$@"
god-frey
180
180
特殊状态变量
$? 上一次命令执行状态返回值,0正确,非0失败
$$ 当前shell脚本的进程号
$! 上一次后台进程的PID
$_ 再次之前执行的命令,最后一个参数
查找方式 man bash
搜索 Special Parameters
脚本返回值指脚本执行完毕了,会返回一个数字id,称之为返回值
实践脚本
ubuntu@VM-12-16-ubuntu:~$ cat special_symbol.sh
#! /bin/bash
# $#获取参数个数 -ne 不等于的情况 &&并且
[ $# -ne 2 ] && {
echo "must be two args"
exit 119 #终止程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里 为return 119
}
echo ok
执行结果
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god frey 180
must be two args
ubuntu@VM-12-16-ubuntu:~$ echo $?
119
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god_frey 180
ok
ubuntu@VM-12-16-ubuntu:~$ echo $?
0
获取上一次后台执行的程序PID, $!获取
ubuntu@VM-12-16-ubuntu:~$ nohup ping baidu.com & 1> /dev/null
[3] 18551
ubuntu@VM-12-16-ubuntu:~$ nohup: ignoring input and appending output to 'nohup.out'
ubuntu@VM-12-16-ubuntu:~$ ps -ef | grep ping
ubuntu 18551 31188 0 23:23 pts/0 00:00:00 ping baidu.com
ubuntu 18614 31188 0 23:24 pts/0 00:00:00 grep --color=auto ping
ubuntu@VM-12-16-ubuntu:~$ echo $!
18551
获取当前
脚本的PID
ubuntu@VM-12-16-ubuntu:~$ cat special_symbol.sh
#! /bin/bash
# $#获取参数个数 -ne 不等于的情况 &&并且
[ $# -ne 2 ] && {
echo "must be two args"
exit 119 #终止程序运行,且返回119状态码,提供给当前shell的$?变量,若是在函数里 为return 119
}
echo ok
echo "当前的脚本pid是:$$"
执行结果
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god_frey 180
ok
当前的脚本pid是:19483
获取上次命令的最后一个参数
ubuntu@VM-12-16-ubuntu:~$ bash special_symbol.sh god_frey 180
ok
当前的脚本pid是:19483
ubuntu@VM-12-16-ubuntu:~$ echo $_
180
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。