本地变量
定义shell变量,变量名不需要加美元符$。
本地变量只在用户当前的shell生存周期中有效,如:
xiao123@xiao123:~/Downloads$ story_one="大师兄,师傅被妖怪抓走了"
xiao123@xiao123:~/Downloads$ echo ${story_one}
大师兄,师傅被妖怪抓走了
xiao123@xiao123:~/Downloads$ bash #开启子shell
xiao123@xiao123:~/Downloads$ echo ${story_one}
xiao123@xiao123:~/Downloads$
变量定义
变量名要求:字母,数字,下划线组成,可以是字母
或是下划线
开头,如:
- chaoge
- chao_ge123
- _chao_get123
变量名严格区分大小写
- Chao_ge
- chao_ge
赋值
1. 赋值不加引号
story_one=大师兄,师傅被妖怪抓走了
2. 赋值单引号
story_one='大师兄,师傅被妖怪抓走了'
3. 赋值双引号
story_one="大师兄,师傅被妖怪抓走了"
取出变量值
- 单引号,所见所得,强引用
- 双引号,输出引号里所有内容,识别特殊符号,弱引用
- 无引号,连续的符号可以不加引号,有空格则有歧义,最好使用双引号
- 反引号,引用命令执行结果,等于${}用法
特殊变量
shell的特殊变量,用在如脚本,函数传递参数使用,有如下特殊的,位置参数变量
$0 获取shell脚本文件名,以及脚本路径
$n 获取shell的第n个参数,n在1-9之间,如$1, $2, $9, 大于9则需要写${10},参数以空格隔开
$# 获取执行shell脚本后面的参数个数
$* 获取shell脚本所有参数,不加引号等于$@作用,加上引号"$*"作用是接收所有参数为单个字符串,"$1 $2.." 空格保留
$@ 不加引号效果同上,加引号,是接收所有参数为独立字符串"$1" "$2" "$3"...空格保留
特殊变量实践
xiao123@xiao123:~/Downloads$ cat ./special_test.sh
echo '验证 ${0} ${1} ${2}'
echo "输入 ${0} ${1} ${2}"
echo '验证 $#'
echo "输入参数个数 $#"
echo '验证 $*'
echo "输出参数 $*"
echo '验证 $@'
echo "输出参数 $@"
xiao123@xiao123:~/Downloads$
运行结果:
xiao123@xiao123:~/Downloads$ bash ./special_test.sh 11 22 33
验证 ${0} ${1} ${2}
输入 ./special_test.sh 11 22
验证 $#
输入参数个数 3
验证 $*
输出参数 11 22 33
验证 $@
输出参数 11 22 33
xiao123@xiao123:~/Downloads$
面试题分享
$*和$@的区别你了解吗?
$* 和 $@ 都表示传递给函数或者是脚本的所有参数
当$*和$@不被双引号包围时,他们之间没有任何区别,都是将接收到的每一个参数看作一份数据,彼此之间可以用空格来分隔。
但是当他们被双引号""包含时,就会有区别了:
"$*"会将所有的参数从整体上看作是一份数据,而不是把每个参数都看做一份数据。
"$@"任然将每个参数都看作一份数据,彼此之间是独立的。
比如传递了5个参数,那么对于"$*"来说,这5个参数会合并到一起形成以份数据,他们之间是无法分割的;而对于“$@”来说,这5个参数是相互独立的,他们是5份数据。
如果使用echo直接输出"$*"和"$@"做对比,是看不出区别的;但如果使用for循环来逐个输出数据,立即就能看出区别来。
实践
xiao123@xiao123:~/Downloads$ chmod +x different.sh
xiao123@xiao123:~/Downloads$ 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
xiao123@xiao123:~/Downloads$
运行结果
xiao123@xiao123:~/Downloads$ bash different.sh 11 22 33 44
print each param from "$*"
11 22 33 44
print each param from "$@"
11
22
33
44
xiao123@xiao123:~/Downloads$