shell脚本变量
既然是变量,自然分变量名和变量值,在使用的时候一定要注意哪些地方需要用变量名,哪些地方需要用变量的值。
自定义变量
shell变量不需要声明,随用随定义,给变量赋值的时候要注意
- shell是空格敏感的
- 使用
{}
确定变量的范围是个好习惯
$NEWENV =123 #等号前面有空格,不行
NEWENV: command not found
$NEWENV= 123 #等号后面有空格,不行
123: command not found
$NEWENV=123 #RIGHT
$BRACE=123
$echo $BRACEEEE
$echo ${BRACE}EEE
123EEE
位置变量
指shell脚本的命令参数,shell script将执行的命令放在存储在0
,命令之后的参数依次存储在1
,2
...,可以通过取值(eg$0
)利用这些变量,就可以编写带参数的脚本,当参数值大于9时,需要使用{}括起来,否则$10
就相当于在$1
之后加了字符0
。注意,定义函数的参数列表也使用$1
, $2
etc,注意与命令行的参数相区分,函数内的$1
etc是用来传参的,但$0
还是保持原来的含义
$cat ./shell.sh
#!/bin/bash
echo "$10"
echo "${10}"
$./*.sh 11 22 33 44 55 66 77 88 99 00
110
00
内嵌变量
#
目前进程的参数个数,可以通过$#
获得其值,多用在循环中
while [ $# != 0 ]
do
case $1 in
...
esac
shift
done
@
传递给当前进程的命令行参数,如果置于双引号内,会展开为个别的参数, $@
代表命令后接的每一个参数字符串,类似"$1
", "$2
", "$3
". 否则和$*
都是一样的。
*
当前进程的命令行参数,$*
代表命令后接的参数的集合字符串,类似"$1c$2c$3
", c为分隔符,默认为空格键,加上" "
表示一个字符串,不加和$@
一样, 这两个参数可以用来将参数传递给其他脚本或函数
$cat ./shell.sh
#!/bin/bash
my(){
echo $#
}
echo "$(my $@)"
echo "$(my "$@")"
echo "$(my $*)"
echo "$(my "$*")"
$./*.sh 11 "22 33" 44
4
3
4
1
-
在引用时给予shell的选项
?
- 前一个命令的退出状态,
$?
IMPORTANT,只和上一条命令有关 - 如果上一条命令的执行成功,里面的值是0,否则里面的值是一个正数
- 上一条test语句的返回结果,如果test结果为真,则为0,如果test结果为假,则为1
- shell的函数的返回值只能使用
$?
接收
$
shell的进程编号(PID),可以通过$$
获得其值
$echo $$
3730
!
最近一个后台命令的进程编号,以此方式存储进程编号,即在终端中的histroy命令,可通过wait供之后使用
环境变量
我们所执行的任何一个程序,都是由父进程fork出来的一个子进程,子进程结束之后,将返回发哦父进程中去,当子进程被产生的时候,将会从父进程那里获得一定的资源分配,以及(更重要的是)继承父进程的环境。环境变量就是传递给子进程的变量,"遗传性"是区分本地变量和环境变量的决定性指针,环境变量只能从父进程到子进程单向继承,换句话说,在子进程中的环境如何变更,均不会影响父进程的环境。下面是几个比较常用的缺省继承环境变量的值,当前终端下更多环境变量的值可以使用export -p
查看
ENV
一般引用则仅用于交互式shell中,展开为读取和启动时要执行的第一个文件的完整路径名称
HOME
表示家目录
IPS
分隔符,默认为空格,tab和换行
LINENO
刚执行过的行在脚本或函数的行编号
PPID
父进程的PID
PS1
主要的命令提示符,默认是$
PS2
行继续的命令提示符,默认是>
PS4
set +x 设置的执行跟踪的提示字符串,默认是+
PWD
当前的工作目录
$echo $LANG
en_AU.UTF-8
$echo "$LINENO"
8
$echo "$PATH"
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/linux/toolchain/gcc-4.6.4/bin:.
$echo "$PPID"
2647
$ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
linux 2647 0.0 2.2 110152 11540 ? Rl 07:51 0:01 gnome-terminal
$echo "$PWD"
/home/linux
数组
shell使用形如arr=(var1 var2...)
的形式定义,即元素使用空格分开,使用${arr[n]}
访问数组编号为n的元素
$arr=(0 1 2 var)
$echo "${arr[0]}"
0
$echo "${arr[3]}"
var
我们也可以对元素进行单独赋值
$arr[3]=qq
$echo "${arr[3]}"
qq
显示数组的所有元素
$echo "${arr[@]}"
0 1 2 qq
$echo "${arr[*]}"
0 1 2 qq
显示数组中元素的个数
$echo "${#arr[@]}"
4
$echo "${#arr[*]}"
4