Linux Shell 脚本编程(2)—变量(本地变量&环境变量)和运算符

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.0 shell1 shell1 shell2 shell2 shll3 shll3 调用 调用

———— 若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变量。

   设置或者重设各种shellset -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

    #运算符的优先级(不确定的地方,多加括号)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值