博客列表 >CentOS shell中的变量

CentOS shell中的变量

哈
原创
2022年07月29日 17:42:41827浏览

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

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议