Linux Shell 脚本编程(2)—变量(本地变量&环境变量)和运算符
2017-10-07 19:24
357 查看
Shell变量及运算符
一 Shell变量
Shell变量最基本规则:变量只有 字符串 和 整数 两种类型; 在shell运算中都是整数运算 或者 字符串操作运算。
shell变量原由
为使用shell编程更加有效,系统提供了一些shell变量。shell变量可以保存注诸如路径名、文件名、或者数字这样的变量。从这一点上看,shell编程中,变量至关重要。
1. 本地变量
本地变量在用户现有的shell生命期的脚本中使用。本地变量随着当前终端的关闭而消失。命名推荐写法:MY_开头, eg: MY_VAR ,以与环境变量相区别,且便于刷选。
变量定义规则: variablename=value
——-定义本地变量:
MY_VAR=”test” #注意=左右不要有空格
————–使用本地变量
$MYVAR echo $MYVAR or echo ${MYVAR} eg:echo $myVar1 <-等价-> echo ${myVar1} (推荐写法)
-eg: echo myVar1<−等价−>echo{myVar1} (推荐写法)
set 显示本地所有的变量
set | grep MY_* #查看(筛选)所有以MY_开头的本地变量。
readonly variablename 只读变量
readonly myvar1=”test2” myvar1=”test2”; #bash会报错
实验思考
1-
[wbm@wmblinux64 myshell]$ set |grep "MY_*"查看刚才定义的本地变量
2-退出终端,重新登录,刚才登录的本地变量就不复存在了。
3-本地变量背后的含义!
echo $MYV 每登录一个终端,都会运行一个shell程序,这个本地变量,就保存在这个shell程序中;如果再新登录,将启动新的shell程序,与原来的shell不同。建立起概念。
2. 环境变量
环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。shell中执行的用户进程均成为子进程。不像本地变量(只用于现在的shell),环境变量可用于所有子进程,这包括编辑器、脚本和应用程序。
-!注意常用的环境变量名称全部为大写,PATH、HOME(注意随登录用户改变)
如果不去改变环境变量,那么环境变量一直是默认值。如果改变了环境变量,当前终端结束后,再重新开启一个终端,会恢复成为原来(之前)的样子。
延伸:环境变量在shell嵌套调用时的变化
Created with Raphaël 2.1.0shell1shell1shell2shell2shll3shll3调用调用
———— 若shell2修改了环境变量,shell3中同步更新(改变后的值);当shell2关闭时,回到shell1, shell1中环境变量恢复为原来的值。
显示所有环境变量
eg: echo &{PATH} #输出结果如下: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 注意:路径之间用:隔开!
export 声明环境变量
export myvar="/bin/path
查看环境变量: echo $myvar
env 查看shell中所有的环境变量
给PATH变量追加环境变量
export PATH=$PATH:newaddPath
所在的目录:$HOME/.bash_profile (/etc/profile,所有用户都使用的profile)
变量替换(显示变量)
用变量的值替换它的名字
echo ${MYVAR} 或者echo $MYVAR
${ variablename } 显示实际值 ${variablename:+value} 若设置了variablename,则显示;否则空 ${variablename:?value} 若未设置variablename,则显示用户自定义信息valude ${variablename:-value} 若未设置variablename,则显示其值 ${variablename:=value} 若未设置了variablename,则设置其值,并显示 #实例======= jianliu@ubuntu:~$ MY_VAR=123 jianliu@ubuntu:~$ echo ${MY_VAR:+234} 234 jianliu@ubuntu:~$ echo ${MY_VAR:?345} 123 jianliu==@ubuntu:~$ echo ${MY_VAR2:?345} bash: MY_VAR2: 345 jianliu@ubuntu:~$ echo ${MY_VAR3:-567} 567 jianliu@ubuntu:~$ echo ${MY_VAR4:=789} 789 jianliu@ubuntu:~$ echo ${MY_VAR4} 789 jianliu@ubuntu:~$ VAR1="wang > echo ${VAR1:+"bbb"} >" jianliu@ubuntu:~$ echo ${VAR1} wang echo
unset 清除变量
将全局变量变成局部变量,限定其作用域;解决后续脚本文件的变量定义的冲突问题。
eg: VAR 变量的使用 unset VAR #退出作用域 unset VAR1 echo $VAR1 #输出为空!!
············· readonly的变量,不能被清除
位置变量 ————-目的:传参数
位置变量表示 $0 $1 $2 $3 …$9 -**注意:**--------------- $0 代表bash文件名称,不会(不可)修改; 其他就是命令行参数($1-$9) ---实例-- ./02param a b c #运行脚本02param, a、b、c为参数。 02param.sh 脚本文件如下: #!/bin/bash #param echo "脚本的名字 $0" #输出 脚本的名字 02param echo "parm 1: $1” #输出parm 1: a echo "parm 2: $2" #输出parm 2: b echo "parm 3: $3" #输出parm 3: c echo "parm 4: $4" #输出parm 4: echo "parm 5: $5"
-1—— 在脚本中使用位置参数
#!/bin/bash #param.sh find /usr/lib/ -name $1 –print #查找目录下文件名是第一个参数的文件
-2—— 向系统命令传递参数
标准变量
—-(属于shell的环境变量,并不是操作系统的)
bash
默认建立了一些标准环境变量,可在/etc/profile中定义
EXINIT
定义一些vim的初始化参数
HOME 用户目录
jianliu@ubuntu:/usr$ echo $HOME /home/jianliu
LOGNAME #当前登录用户:jianliu
MAILCHECK
MAILPATH
TERM 登录服务器,终端类型vt100
PATH标准变量
—-可以使用set |grep “PATH”来查看PATH配置路径
—–当我们在shell运行一个程序时,shell会从PATH路径中查找程序。
TZ 时区
PS1 提示符
echo $PS1 PS1=’[\u@\h \w] \$’ #u代表用户名 h主机名 w代表当前目录 #可以自己更改PS1 比如: PS1=”wangbaoming”
PWD 当前路径
———-写脚本时,尽量用环境变量,而不用命令。
jianliu@ubuntu:~$ echo $PWD #等价于 pwd 命令 /home/jianliu
SHELL 我当前运行的shell时那个shell解析器
MANPATH
TERMINFO
特殊变量
$#传递到脚本的参数个数
$0始终存在,且不计入参数个数的数量之内。
eg: ./02param a b c echo $# #输出结果为3 ; ./02param #结果为0
$*以一个单字串显示所有向脚步传递的参数,
与位置变量不同,次选项参数可以超过9个。
$0不计入
$*的结果。管辖范围是
$1~$9(重要)
eg: ./02param a b c echo $* #输出为a b c
$$脚步运行的当前进程ID号
$!后台运行的最后一个进程的进程ID
jianliu@ubuntu:~$ ./app & #后台进程1 jianliu@ubuntu:~$ ./app2 & #后台进程2 jianliu@ubuntu:~$ jobs [1]- Running ./app & [2]+ Running ./app2 & jianliu@ubuntu:~$ ps PID TTY TIME CMD 3615 pts/0 00:00:00 bash 3666 pts/0 00:02:42 app 3677 pts/0 00:01:05 app2 3678 pts/0 00:00:00 ps jianliu@ubuntu:~$ echo $! 3677 #指向后台进程2
$@与
$#相同,但是使用时加引号,并在引号中返回每个参数
$-显示shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态(返回值)。
0表示没有错误,其他任何值表明有错误
eg:实例
#!/bin/bash #param echo "脚本的名字 $0" echo "parm 1: $1" echo "parm 2: $2" echo "parm 3: $3" echo "parm 4: $4" echo "parm 5: $5" echo "显示参数的个数:$#" echo "显示脚本全部参数:$*" echo "显示前一命令运行后状态:$?"
修改变量的命令
(1) declare [参数]
设置或显示变量
[参数]: 空 显示所有变量 -f 只显示函数名 -r 创建只读变量(declare和typeset) -x 创建转出变量 -I 创建整数变量 使用+代替-,可以颠倒选项的含义(只读变量除外)
[wbm@wmblinux64 ~]$ readonly declare -r BASHOPTS="checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath" declare -ir BASHPID="" declare -ar BASH_VERSINFO='([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")' declare -ir EUID="500" declare -r MYYY="test2" declare -ir PPID="7140" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -ir UID="500"
(2) export
用户创建传给shell的变量,即:创建环境变量
-- 表明选项结束,所有后续参数都是实参 export MY_LS=”ls -- -l” ; $MY_LS 列出所有目录信息 -f 表明在“名-值”对中的名字是函数名。 -n 把全局变量转换成局部变量。换句话说,命令的变量不再传给shell -p 显示全局变量列表
**Eg:** Shell1 ---(调用)---> shell2 ---(调用)---> shell3 PATH export –n PATH=$PATH:/etc $PATH #若shell2修改了环境变量,只在shell2中起作用(局部变量); shell3中的环境变量与shell1中的一样,未发生变化。
(3) readonly
用于显示或者设置只读变量 相当于declare –r
-- 表明选项结束 -f 创建只读变量
(4)set
使用set命令显示所有本地定义的shell变量。
设置或者重设各种shell set -a
(4)env 查看所有环境变量
(5)shift n
用于移动位置变量,调整位置变量; 对
$0不生效!
eg: shift 2 ; 将$4的值赋予$2,$3的值赋予$1,$0值不变。 #脚本文件 js.sh #!/bin/bash #param echo "脚本的名字 $0" echo "parm 1: $1" echo "parm 2: $2" echo "parm 3: $3" echo "parm 4: $4" echo "parm 5: $5" echo "开始shift 2" shift 2 echo "parm 1: $1" echo "parm 2: $2" #运行脚本文件 jianliu@ubuntu:~$ ./shell01.sh aa bb cc dd ee 脚本的名字 ./shell01.sh parm 1: aa parm 2: bb parm 3: cc parm 4: dd parm 5: ee 开始shift 2 parm 1: cc parm 2: dd
(6)typdeset
——用于显示或设置变量—-是declare的同义词
(7)unset
—–用于取消变量的定义
-- #表明选项结束 -f #删除只读变量,但不能取消从shell环境中删除指定的变量和函数。 #如:PATH,PS1,PS2,PPID,UID,EUID等的设置。 #实例: unset VAR1 echo $VAR1 #输出为空!!
2. 引号
简介:引号的必要性、双引号、单引号、反引号、反斜杠 —-推荐使用 引号的必要性
——–变量和替换操作,在脚本中执行变量替换时,最容易犯的一个错误就是引号的错误。
———-例如:echo aa.tar.gz * ; echo “aa.tar.gz *” 效果大不一样
touch aa bb cc #将创建三个文件夹,分别为aa,bb,cc touch "aa bb cc" #将创建一个文件夹,名称为(aa bb cc).
【1】— 双引号 ” “ ====>当作变量
———使用双引号可以引用除字符$,`反引号,\反斜杠外的任意字符或者字符串。
ubuntu:~$ myvar=123 ubuntu:~$ echo -e "hello world,$SHELL '\n* wangbaoqiang' echo $myvar'" hello world,/bin/bash ' * wangbaoqiang' echo 123' ubuntu:~echo “ls -l” #输出:ls -l
【2】— 单引号 ’ ‘ ====>当作字符串
———单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,包括引号都作为一个字符。
—- 结论:单引号让特殊字符失去意义
jianliu@ubuntu:~$ echo -e 'hello word, $SHELL '\n* wangbaoqiang'' hello word, $SHELL n* wangbaoqiang echo 'ls -l' #输出:ls -l
【3】— 反引号 =====》当作命令
————–反引号用于设置系统命令的输出到变量。s**hell将反引号中的内容作为一个系统命令,并执行其内容。**
—–!!–反引号与键盘位置:TAB键的上方。
eg:echo "* wangbaoming`echo $PATH`" *wangbaoqiang/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games echo `ls –l` #输出:所有目录列表信息
【4】— 反斜杠 \
如果一个字符有特殊含义,反斜杠防止shell误解其含义,即:**屏蔽其特殊含义。** 下属字符含有特殊含义:$ * + ^ ` ‘’ | ? eg: echo * echo \* #输出 *echo*
3. 运算符
运算符类型介绍:运算符是对计算机发的指令 运算符对象 数字、字符(子面值) 变量 表达式 表达式 运算符和运输对象的组合体。
表达式类型
【1】—-按位运算符
~op1 反运算 $[~1] 结果为-2 补码:0000 0001 --取反--> 1111 1110 -> -2 op1<<op2 左移运算符 op1>>op2 右移运算符 op1 & op2 与比较运算符 op1 ^ op2 异或运算符 op1 | op2 或运算符 eg: echo $[2<<4] echo $[2^4]
【2】—
$[]
———–表示形式告诉shell对方括号中的表达式求值
eg: echo $[3+9] #输出12
【3】—逻辑运算符
&& 逻辑与运算 || 逻辑或运算符 echo $[1||1]
【4】—赋值运算符
种类:=,+=,-=,*=,/=,%=,&=,^=、|=,<<=,>>= let count = $count + $change [wbm@wmblinux64 myshell]$ var=10 [wbm@wmblinux64 myshell]$ let var+=5 [wbm@wmblinux64 myshell]$ echo $var 15
表达式替换
$[] 和 $(( )) 习惯使用$[],所有shell的求值都是用整数完成 $[] 可以接受不同基数的数字 [base#n] n表示基数从2到36任意基数 [wbm@wmblinux64 myshell]$ echo $[10#8+191] 199 #运算符的优先级(不确定的地方,多加括号)
相关文章推荐
- linux环境变量、本地变量、source、"."、export
- Android环境变量的设置&模拟器设置网络代理
- linux shell编程1 - 环境与变量
- Java环境变量配置&解决版本不一致问题详解
- Linux shell中将多行内容赋值给一个变量 && 常用的转移字符
- Linux Shell环境变量
- linux基本变量学习:位置变量$0 、$1 shift轮替、本地变量、环境变量、特殊变量
- java基础--JDK安装、环境变量配置、工具开发第一个程序、数据类型、运算符
- Win10操作系统下,Java环境变量的配置&&Java入门小程序“hello,world”的编译
- Linux :环境变量设置和本地变量加载
- 本地开发环境-不加端口号访问&不加项目名访问&输入域名访问
- [Shell]Bash变量:自定义变量 & 环境变量 & 位置参数变量 & 预定义变量
- windows系统下JDK1.6环境变量配置&…
- Java学习第一课--环境变量的配置、变量、数据类型和运算符
- 自学Linux Shell6.2-用户自定义环境变量
- Linux Shell脚本在service模式下的环境变量
- Java环境变量配置&解决版本不一致问题
- linux shell编程之利用环境变量IFS自定义分隔符
- bash 脚本编程十二 环境变量的设置
- eclpise的Navigator和Package的区别 &tomcat、java环境变量详解