Blogger Information
Blog 291
fans 0
comment 0
visits 350312
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
CentOS shell中的变量
Original
819 people have browsed it

镜像下载、域名解析、时间同步请点击 阿里云开源镜像站

shell中的变量

变量的介绍

变量即变化的量,核心是”变“与”量“二字,变即变化,量即衡量状态。

量:是记录现实世界当中的某种状态<br>变:指的是记录的状态是可以发送变化的

  1. name=wsh
  2. age=22

如何使用变量

  1. 变量名 赋值符号 变量值
  2. name=wsh //shell中定义变量
  3. name:wsh //yaml中定义的变量

定义变量的语法

  • 变量名

相当于一个门牌号,便于取出变量值,是访问到值的唯一方式

  • 赋值符号

将值的内存地址,绑定给变量名

  • 变量值

用来表示状态

变量的使用规则:先定义,再通过变量名去引用

定义变量名的规范

变量名的命名规则

1.大前提:变量名的命名应该能够反映出值记录的状态<br>2.变量是用来访问变量值的,所以变量名应该遵循一定规范,来方便我们标识存到内存中值的功能

  1. 1.变量名只能是字母、字母、数字或下划线的任意组合(区分大小写)
  2. 2.变量名不可以使用中文
  3. 3.变量名不可以使用命令来命名
  4. 4.不要用拼音
  5. 5.变量名不能以数字开头

变量名定义的方式

  1. 1.下划线+纯小写
  2. name_of_wsh='wushihang'
  3. name_of_oldboy='laonanhai'
  4. 2.驼峰体
  5. nameOfWsh='wushihang'
  6. nameOfOldboy='laonanhai'
  7. ageOfOldboy=88
  8. 3.下划线+纯大写
  9. NAME_OF_OLDBOY='laonanhai'
  10. 不好的方式:
  11. 1.变量名为中文、拼音
  12. 2.变量名过长
  13. 3.变量名词不达意

变量的分类

系统内置环境变量

  1. ## 查看系统环境变量
  2. env
  3. declare
  4. export
  5. ## 环境变量
  6. LANG ## 字符集语言
  7. PATH ## 该变量中路径里的所有可执行文件,都可以直接执行,不需要加路径
  8. PS1 ## 命令提示符
  9. UID ## 当前登录用户的uid
  10. HOSTNAME ## 当前主机
  11. PWD ## 当前工作路径
  12. USER ## 当前登录的用户名
  13. ## 历史记录相关
  14. HISTSIZE
  15. HISTFILESIZE
  16. HISTFILE
  17. TMOUT
  18. HISTCONTROL: export HISTCONTROL=ignorespace # 离职专用变量(强制历史记录不记住该命令)
  19. PROMPT_COMMAND

普通变量

  1. DATE=$(date +%F-%T)
  2. IP=$(ifconfig eth0|awk 'NR==2{print $2}')
  3. mkdir $DATE_$IP_$HOSTNAME ## 基本凉了
  4. ### 注意使用大括号分隔变量
  5. mkdir ${DATE}_${IP}_${HOSTNAME}

位置变量

  1. $n: N正整数,$1 $2 $3....$n 两位数要使用{}, ${10} ${11}
  2. $0: 执行脚本的路径和名字
  3. $#: 传递参数的个数
  4. $*: 1.不适合数组使用 2.调用时加双引号 ## 接收脚本后面所有的参数
  5. $@: 1.适合后面数组数据类型使用 2.调用时加双引号 ## 接收脚本后面所有的参数

特殊变量(状态)

  1. $?:表示上一个命令执行的状态(上一条命令的返回值) 0,成功执行 0,失败
  2. 特殊命令:
  3. - false
  4. - diff
  5. $$:表示当前脚本执行的pid
  6. $!:上一个脚本或程序运行的pid
  7. $_:获取上一条命令的最后一个参数(以空格为分隔符) ## 相当于 Esc + .

变量的子串

  1. ${#变量名}:获取该变量的长度
  2. [root@web01 ~]# vim a.sh
  3. #!bin/bash
  4. name=wsh
  5. echo ${#name}
  6. [root@web01 ~]# . a.sh
  7. 3
  8. [root@web01 ~]# vim a.sh
  9. #!bin/bash
  10. name=$1
  11. echo ${#name}
  12. [root@web01 ~]# . a.sh 123456
  13. 6
  14. [root@web01 ~]# vim a.sh
  15. #!bin/bash
  16. read -p '请输入用户名:' name
  17. read -p '请输入密码:' pas
  18. if [ ${#pas} -lt 8 ];then
  19. echo '密码必须大于等于八位'
  20. else
  21. echo '密码符合要求'
  22. fi
  23. [root@web01 ~]# . a.sh
  24. 请输入用户名:www
  25. 请输入密码:111
  26. 密码必须大于等于八位
  27. [root@web01 ~]# . a.sh
  28. 请输入用户名:www
  29. 请输入密码:12345678
  30. 密码符合要求
  31. ${变量名}:调用变量
  32. ${变量名:偏移量}:字符串的截取
  33. [root@web01 ~]# vim a.sh
  34. #!bin/bash
  35. name=wsh
  36. echo ${name:1}
  37. [root@web01 ~]# . a.sh
  38. sh
  39. ${变量名:偏移量:步长}:字符串的截取
  40. [root@web01 ~]# vim a.sh
  41. #!bin/bash
  42. name=wsh_blog51CTO
  43. echo ${name:3:5}
  44. [root@web01 ~]# . a.sh
  45. _blog
  46. ${变量名#字符串}:从变量开头,删除最短匹配word的子串
  47. ${变量名##字符串}:从变量开头,删除最长匹配word的子串
  48. [root@web01 ~]# vim a.sh
  49. #!bin/bash
  50. name=/tmp/abc/1.txt
  51. echo ${name#*/}
  52. echo ${name##*/}
  53. [root@web01 ~]# . a.sh
  54. tmp/abc/1.txt
  55. 1.txt
  56. [root@web01 ~]# vim 1.txt
  57. /tmp/abc/1.txt
  58. /root/2.txt
  59. /usr/local/src/3.txt
  60. [root@web01 ~]# vim a.sh
  61. #!bin/bash
  62. for line in `cat 1.txt`;do
  63. echo ${line##*/}
  64. done
  65. [root@web01 ~]# . a.sh
  66. 1.txt
  67. 2.txt
  68. 3.txt
  69. ${变量名%字符串}:从变量结尾,删除最短匹配word的子串
  70. ${变量名%%字符串}:从变量结尾,删除最长匹配word的子串
  71. #!bin/bash
  72. for line in `cat 1.txt`;do
  73. echo ${line%%/*}
  74. echo ${line%/*}
  75. done
  76. [root@web01 ~]# . a.sh
  77. /tmp/abc
  78. /root
  79. /usr/local/src
  80. ${变量名/匹配内容/替换内容}:使用string替换第一个pattern
  81. [root@web01 ~]# vim a.sh
  82. #!bin/bash
  83. read -p '请输入用户名:' name
  84. echo ${name/ww/wsh}
  85. [root@web01 ~]# . a.sh
  86. 请输入用户名:ww_fff_ggg_ww
  87. wsh_fff_ggg_ww
  88. ${变量名//匹配内容/替换内容}:使用string替换所有pattern
  89. [root@web01 ~]# vim a.sh
  90. #!bin/bash
  91. read -p '请输入用户名:' name
  92. echo ${name//ww/wsh}
  93. [root@web01 ~]# . a.sh
  94. 请输入用户名:ww_ff_ww_gg
  95. wsh_ff_wsh_gg

扩展变量

给变量默认值

  1. ${变量名:-字符串}:如果parameter没被赋值或其值为空,就以string作为默认值,它不会赋值给变量
  2. [root@web01 ~]# echo $gender
  3. [root@web01 ~]# echo ${gender:-male}
  4. male
  5. [root@web01 ~]# gender=female
  6. [root@web01 ~]# echo $gender
  7. female
  8. [root@web01 ~]# echo ${gender:-male}
  9. female
  10. ${变量名:=字符串}:如果parameter没被赋值或其值为空,就以string作为默认值,它会赋值给变量(用户没有传递值)
  11. [root@web01 ~]# echo $gender
  12. [root@web01 ~]# echo ${gender:=male}
  13. male
  14. [root@web01 ~]# gender=female
  15. [root@web01 ~]# echo $gender
  16. female
  17. [root@web01 ~]# echo ${gender:=male}
  18. female
  19. ${变量名:?报错信息}:如果parameter没被赋值或其值为空,就以?后面的字符串作为报错输出
  20. [root@web01 ~]# unset gender
  21. [root@web01 ~]# echo ${gender:?male}
  22. -bash: gender: male
  23. ${变量名:+字符串}:如果parameter没被赋值或其值为空,就什么都不做,否则用string替换变量内容
  24. [root@web01 ~]# gender=female
  25. [root@web01 ~]# echo ${gender:+wsh}
  26. wsh

变量的赋值方式

  1. 直接赋值: name=wsh
  2. 间接赋值:将一个命令执行的结果赋值给一个变量,IP=`ifconfig eth0|awk 'NR==2{print $2}'`
  3. 交互赋值:read -p '请输入xxx' 变量名
  4. 传参赋值:执行脚本的时候,将需要传递的变量值,写在脚本的后面 $1 $2 $3

交互赋值

  1. read:
  2. read 选项 变量名
  3. read 选项 -p '一句话' 变量名
  4. ## 选项
  5. -p:打印一句话
  6. -s:不显示输入内容
  7. -t:设置超时时间
  8. -a:将后面的结果放入数组
  9. [root@web01 ~]# vim a.sh
  10. #!bin/bash
  11. passwd=123
  12. read -p 'm01 login:' name
  13. read -s -p 'password:' pass
  14. if [ $pass == $passwd ];then
  15. echo '登录成功'
  16. else
  17. echo '密码错误'
  18. fi
  19. [root@web01 ~]# . a.sh
  20. m01 login:www
  21. password:密码错误
  22. [root@web01 ~]# . a.sh
  23. m01 login:www
  24. password:登录成功
  25. [root@web01 ~]# vim a.sh
  26. #!bin/bash
  27. passwd=123
  28. read -p 'm01 login:' -a name
  29. read -t 5 -s -p 'password:' pass
  30. if [ $pass == $passwd ];then
  31. echo '登录成功'
  32. echo $name
  33. else
  34. echo '密码错误'
  35. fi
  36. [root@web01 ~]# . a.sh
  37. m01 login:www
  38. password:-bash: [: ==: unary operator expected
  39. [root@web01 ~]# . a.sh
  40. m01 login:www wsg ww rrr
  41. password:登录成功
  42. www

shell中的数据类型

  1. ## 字符串类型
  2. 赋值:
  3. name='字符串'
  4. 取值:
  5. $name
  6. ## 整型
  7. age=18
  8. ## 数组类型
  9. 赋值:
  10. list=(python java golang shell)
  11. list[0]='abc'
  12. list[1]='efg'
  13. list[2]='hij'
  14. list[3]='xyz'
  15. 取值:
  16. ${list[0]}
  17. ${list[1]}
  18. ${list[2]}
  19. ${list[3]}
  20. list=(python java golang shell)
  21. echo $list
  22. echo ${list[1]}
  23. echo ${list[2]}
  24. echo ${list[3]}
  25. -------------------
  26. list[0]='abc'
  27. list[1]='efg'
  28. list[2]='hij'
  29. list[3]='xyz'
  30. list=(python java golang shell)
  31. echo $list
  32. echo ${list[1]}
  33. echo ${list[2]}
  34. echo ${list[3]}
  35. --------------------------
  36. list=(python java golang shell)
  37. list[0]='abc'
  38. list[1]='efg'
  39. list[2]='hij'
  40. list[3]='xyz'
  41. echo $list ${list[1]} ${list[2]} ${list[3]}
  42. ----------循环数组------------------
  43. [root@web01 ~]# vim a.sh
  44. #!bin/bash
  45. list=(python java golang shell)
  46. for yuansu in ${#list[*]};do
  47. echo $yuansu
  48. done
  49. [root@web01 ~]# . a.sh
  50. 4
  51. echo ${#list[*]} // 数组中元素的个数

本文转自:https://blog.51cto.com/baicia/5516898

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post