iMisty的技术栈

iMisty的技术栈

Shell运算符之变量

875
2019-05-06

Shell运算符之变量

和Java或者c语言不同,shell是用来写脚本的用于主机维护,所见即所得,编译的过程和执行过程在一起

bash变量

  • bash就是Linux的标准shell

什么是变量和变量的分类

  • 变量是计算机内存的单元,其中存放的值可以改变

  • 变量让你能够把程序中准备使用的每一段数据都赋给一个简短易于记忆的名字
变量的命名规则
  • 变量名必须以字母和下划线打头,名字中间只能由字母数字下划线组成
  • 变量名的长度不能超过255
  • 变量名在有效范围内必须是惟一的
  • 在bash中,变量的默认类型都是字符串型

变量按照存储数据进行分类

  • 字符型
  • 整型
  • 浮点型
  • 日期型
  • 数组型

。。。。

变量的定义

  • 变量名=变量值,不能以数字开头,等号两侧不可以有空格,变量值里面如果有空格需要使用双引号

    • x=5
    • name="misty"

单引号和双引号的区别:单引号里面的符号完全丧失含义仅为纯文本,双引号里面的符号如:转移符 $等符号保持原有含义

变量的分类

用户自定义变量

用户自定义变量,变量自定义的

变量的调用

  • echo $变量名

    • 例如:echo $x
    • echo $name

变量的调用不止这一种方式,这只是输出变量的值,Linux中的变量的值都是字符而不是数字,不能用作运算

    x=5
    y=6
    echo $x+$y
    5+6     # 被当做字符处理

变量的叠加

  • 适用于将对变量做出修改而不是整个替换的场景
x=123
   x="$x"456  或者 x=${x}456
   123456

变量查看

  • set

    *   选项 `-u`如果设定此选项,调用未声明的变量时会报错(默认无任何提示)
    

    变量删除

  • unset 变量名

    *   删除变量不是删除变量值,不需要加上`$` `unset name`,删除变量名为name的变量
    

    环境变量

    环境变量:这种变量主要保存的是和系统操作环境相关的数据,变量可以自定义,但是对系统生效的环境变量名和变量的作用是固定的

    环境变量与用户自定义变量的区别?

    用户自定义变量只是在当前的shell中生效,环境变量在当前shell和这个shell的所有子shell中生效,一句话,环境变量是全局变量,自定义变量是局部变量

    对系统生效的环境变量名和变量的作用是固定的

 # 进入父shell的子shell
  pstree # 查看进程树会发现pstree当前shell上面还有一层shell说明是在子shell当中执行
  exit从子shell退回到父shell
设置环境变量
* `export 变量名=变量值` 赋值的同时声明或者先声明再赋值
* `变量名=变量值  export 变量名`

查看环境变量
* `set` 查看所有变量
* `env` 查看环境变量

删除变量
* `unset 变量名`

> 注意:父shell中声明的变量子shell中可以查看不可以删除

#### 常用环境变量
  • HOSTNAME :主机名称

  • SHELL:当前的shell

  • TERM:终端环境

  • HISTSIZE:历史命令条数

  • SSH_CLIENT:当前操作环境是用ssh链接的,这里记录客户端IP

  • SSH_TTY:ssh链接的终端时pts/1

  • USER :当前登录的用户

    PATH环境变量

  • PATH变量:系统查找命令的路径

  • echo $PATH 查看path环境变量

  • PATH = "${PATH}":/root/test.sh >注意:这样声明只是临时生效,重启或者重新登录就会失效

    PS1环境变量

    PS1变量:命令提示符设置,命令提示符会以设置的格式显示
    自定义命令提示符: PS1='[\u@\A \w]$ '
    一般使用默认的就好了(默认的才是最好的) PS1='[\u@\h \W]$ '

    常用的命令提示符
    img

    语系变量

    locale 查询当前系统语系

    • LANG:定义系统主语系的变量
    • LC_ALL:定义整体语系的变量

    例如:df -h 若是当前语系是中文则会中文输出,受到语系的影响

    语系变量LANG
    echo $LANG : 查看系统当前语系
    locale -a |more : 查看Linux支持的所有语系

    查询系统默认语系
    cat /etc/sysconfig/i18n

    linux中文支持

    前提条件:正确安装的中文字体和中文语系

  • 如果有图形界面,可以正确支持中文显示

  • 如果使用第三方远程工具,只要语系设定正确,可以支持中文显示(如xshell需要远程工具支持中文设置成utf-8)

  • 如果使用纯字符界面,必须使用第三方插件(如zhcon等),因为Linux的纯字符界面不支持中文显示

    注意在纯字符界面操作即使将LANG=zh_CN.UTF-8 语系设置正确也不可以正确显示中文

    LANG=zh_CN.UTF-8
    echo $LANG
    zh_CN.UTF-8
    df -h # 显示中文乱码

位置参数变量

位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
![img](https://gitee.com/iMist/Linux/raw/master/image2/img_shell1.png)

写几个例子
#!/bin/bash
 num1=$1
 num2=$2
 sum=$(($num1 + $num2))
 echo $sum

 chmod 755 test.sh
 ./test.sh 1 2 

 #!/bin/bash
 echo "\$* can shu shi : $* "
 echo "\$@ can shu shi : $@ "
 echo "\$# can shu shi :  $# "

 chmod 755 test1.sh
 ./test1.sh 1 2 3 4 

 #$*与 $@的区别
 #!/bin/bash
 for i in "$*"
 # $*中所有的参数看成是一个整体,所以这个for只循环一次
 do
         echo "the parameter is :$i"
 done

 # $@中的每个参数都看成是独立的,所以“$@”中有几个参数就会循环几次
 for j in "$@"
 do
         echo "the parameter is :$j"

 done
 chmod 755 test2.sh
 ./test2.sh 1 2 3 4 

预定义变量

预定义变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
![img](https://gitee.com/iMist/Linux/raw/master/image2/img_shell2.png)
  #!/bin/bash 

  echo "qian tai  :$$"

  find / -name test.sh &

  echo "hou tai : $! "

提醒:ls && echo yes ls || echo no多命令的顺序执行(还有if判断)就是依靠前一条命令的返回值是否为0来判断下一条命令是否执行

接收键盘输入

位置参数变量对作者之外的其他用户不太友好,使用键盘接收变量通过用户交互提示提供给其他用户使用
`read [选项] [变量名]`
* `-p` 提示信息,在等待read输入的时候,输出提示信息 
* `-t` 秒数,read命令会一直等待用户输入,使用此选项可以指定等待时间
* `-n` 字符数,read命令只接受指定的字符数,就会执行
* `-s` 隐藏输入的数据,适用于机密数据的输入
#!/bin/bash 
 read -p "please input your name :" -t 30 name

 echo $name

 read -p "please input your passwd: " -s passwd

 echo -e "\n"
 echo $passwd

 read -p "please input your sex [M/F]" -n 1 sex
 # 可以接收一个字符之后判断符合条件程序继续还是停止
 echo -e "\n"
 echo $sex
 ```