变量即变化的量,核心是”变“与”量“二字,变即变化,量即衡量状态。
量:是记录现实世界当中的某种状态
变:指的是记录的状态是可以发送变化的
name=wsh age=22
变量名 赋值符号 变量值 name=wsh //shell中定义变量 name:wsh //yaml中定义的变量
相当于一个门牌号,便于取出变量值,是访问到值的唯一方式
将值的内存地址,绑定给变量名
用来表示状态
变量的使用规则:先定义,再通过变量名去引用
变量名的命名规则
1.大前提:变量名的命名应该能够反映出值记录的状态
2.变量是用来访问变量值的,所以变量名应该遵循一定规范,来方便我们标识存到内存中值的功能
1.变量名只能是字母、字母、数字或下划线的任意组合(区分大小写) 2.变量名不可以使用中文 3.变量名不可以使用命令来命名 4.不要用拼音 5.变量名不能以数字开头
变量名定义的方式
1.下划线+纯小写 name_of_wsh='wushihang' name_of_oldboy='laonanhai' 2.驼峰体 nameOfWsh='wushihang' nameOfOldboy='laonanhai' ageOfOldboy=88 3.下划线+纯大写 NAME_OF_OLDBOY='laonanhai' 不好的方式: 1.变量名为中文、拼音 2.变量名过长 3.变量名词不达意
## 查看系统环境变量 env declare export ## 环境变量 LANG ## 字符集语言 PATH ## 该变量中路径里的所有可执行文件,都可以直接执行,不需要加路径 PS1 ## 命令提示符 UID ## 当前登录用户的uid HOSTNAME ## 当前主机 PWD ## 当前工作路径 USER ## 当前登录的用户名 ## 历史记录相关 HISTSIZE HISTFILESIZE HISTFILE TMOUT HISTCONTROL: export HISTCONTROL=ignorespace # 离职专用变量(强制历史记录不记住该命令) PROMPT_COMMAND
DATE=$(date +%F-%T) IP=$(ifconfig eth0|awk 'NR==2{print $2}') mkdir $DATE_$IP_$HOSTNAME ## 基本凉了 ### 注意使用大括号分隔变量 mkdir ${DATE}_${IP}_${HOSTNAME}
$n: N正整数,$1 $2 $3....$n 两位数要使用{}, ${10} ${11} $0: 执行脚本的路径和名字 $#: 传递参数的个数 $*: 1.不适合数组使用 2.调用时加双引号 ## 接收脚本后面所有的参数 $@: 1.适合后面数组数据类型使用 2.调用时加双引号 ## 接收脚本后面所有的参数
$?:表示上一个命令执行的状态(上一条命令的返回值) 0,成功执行 非0,失败 特殊命令: - false - diff $$:表示当前脚本执行的pid $!:上一个脚本或程序运行的pid $_:获取上一条命令的最后一个参数(以空格为分隔符) ## 相当于 Esc + .
${#变量名}:获取该变量的长度 [root@web01 ~]# vim a.sh #!bin/bash name=wsh echo ${#name} [root@web01 ~]# . a.sh 3 [root@web01 ~]# vim a.sh #!bin/bash name=$1 echo ${#name} [root@web01 ~]# . a.sh 123456 6 [root@web01 ~]# vim a.sh #!bin/bash read -p '请输入用户名:' name read -p '请输入密码:' pas if [ ${#pas} -lt 8 ];then echo '密码必须大于等于八位' else echo '密码符合要求' fi [root@web01 ~]# . a.sh 请输入用户名:www 请输入密码:111 密码必须大于等于八位 [root@web01 ~]# . a.sh 请输入用户名:www 请输入密码:12345678 密码符合要求 ${变量名}:调用变量 ${变量名:偏移量}:字符串的截取 [root@web01 ~]# vim a.sh #!bin/bash name=wsh echo ${name:1} [root@web01 ~]# . a.sh sh ${变量名:偏移量:步长}:字符串的截取 [root@web01 ~]# vim a.sh #!bin/bash name=wsh_blog51CTO echo ${name:3:5} [root@web01 ~]# . a.sh _blog ${变量名#字符串}:从变量开头,删除最短匹配word的子串 ${变量名##字符串}:从变量开头,删除最长匹配word的子串 [root@web01 ~]# vim a.sh #!bin/bash name=/tmp/abc/1.txt echo ${name#*/} echo ${name##*/} [root@web01 ~]# . a.sh tmp/abc/1.txt 1.txt [root@web01 ~]# vim 1.txt /tmp/abc/1.txt /root/2.txt /usr/local/src/3.txt [root@web01 ~]# vim a.sh #!bin/bash for line in `cat 1.txt`;do echo ${line##*/} done [root@web01 ~]# . a.sh 1.txt 2.txt 3.txt ${变量名%字符串}:从变量结尾,删除最短匹配word的子串 ${变量名%%字符串}:从变量结尾,删除最长匹配word的子串 #!bin/bash for line in `cat 1.txt`;do echo ${line%%/*} echo ${line%/*} done [root@web01 ~]# . a.sh /tmp/abc /root /usr/local/src ${变量名/匹配内容/替换内容}:使用string替换第一个pattern [root@web01 ~]# vim a.sh #!bin/bash read -p '请输入用户名:' name echo ${name/ww/wsh} [root@web01 ~]# . a.sh 请输入用户名:ww_fff_ggg_ww wsh_fff_ggg_ww ${变量名//匹配内容/替换内容}:使用string替换所有pattern [root@web01 ~]# vim a.sh #!bin/bash read -p '请输入用户名:' name echo ${name//ww/wsh} [root@web01 ~]# . a.sh 请输入用户名:ww_ff_ww_gg wsh_ff_wsh_gg
给变量默认值
${变量名:-字符串}:如果parameter没被赋值或其值为空,就以string作为默认值,它不会赋值给变量 [root@web01 ~]# echo $gender [root@web01 ~]# echo ${gender:-male} male [root@web01 ~]# gender=female [root@web01 ~]# echo $gender female [root@web01 ~]# echo ${gender:-male} female ${变量名:=字符串}:如果parameter没被赋值或其值为空,就以string作为默认值,它会赋值给变量(用户没有传递值) [root@web01 ~]# echo $gender [root@web01 ~]# echo ${gender:=male} male [root@web01 ~]# gender=female [root@web01 ~]# echo $gender female [root@web01 ~]# echo ${gender:=male} female ${变量名:?报错信息}:如果parameter没被赋值或其值为空,就以?后面的字符串作为报错输出 [root@web01 ~]# unset gender [root@web01 ~]# echo ${gender:?male} -bash: gender: male ${变量名:+字符串}:如果parameter没被赋值或其值为空,就什么都不做,否则用string替换变量内容 [root@web01 ~]# gender=female [root@web01 ~]# echo ${gender:+wsh} wsh
直接赋值: name=wsh 间接赋值:将一个命令执行的结果赋值给一个变量,IP=`ifconfig eth0|awk 'NR==2{print $2}'` 交互赋值:read -p '请输入xxx' 变量名 传参赋值:执行脚本的时候,将需要传递的变量值,写在脚本的后面 $1 $2 $3
read: read 选项 变量名 read 选项 -p '一句话' 变量名 ## 选项 -p:打印一句话 -s:不显示输入内容 -t:设置超时时间 -a:将后面的结果放入数组 [root@web01 ~]# vim a.sh #!bin/bash passwd=123 read -p 'm01 login:' name read -s -p 'password:' pass if [ $pass == $passwd ];then echo '登录成功' else echo '密码错误' fi [root@web01 ~]# . a.sh m01 login:www password:密码错误 [root@web01 ~]# . a.sh m01 login:www password:登录成功 [root@web01 ~]# vim a.sh #!bin/bash passwd=123 read -p 'm01 login:' -a name read -t 5 -s -p 'password:' pass if [ $pass == $passwd ];then echo '登录成功' echo $name else echo '密码错误' fi [root@web01 ~]# . a.sh m01 login:www password:-bash: [: ==: unary operator expected [root@web01 ~]# . a.sh m01 login:www wsg ww rrr password:登录成功 www
## 字符串类型 赋值: name='字符串' 取值: $name ## 整型 age=18 ## 数组类型 赋值: list=(python java golang shell) list[0]='abc' list[1]='efg' list[2]='hij' list[3]='xyz' 取值: ${list[0]} ${list[1]} ${list[2]} ${list[3]} list=(python java golang shell) echo $list echo ${list[1]} echo ${list[2]} echo ${list[3]} ------------------- list[0]='abc' list[1]='efg' list[2]='hij' list[3]='xyz' list=(python java golang shell) echo $list echo ${list[1]} echo ${list[2]} echo ${list[3]} -------------------------- list=(python java golang shell) list[0]='abc' list[1]='efg' list[2]='hij' list[3]='xyz' echo $list ${list[1]} ${list[2]} ${list[3]} ----------循环数组------------------ [root@web01 ~]# vim a.sh #!bin/bash list=(python java golang shell) for yuansu in ${#list[*]};do echo $yuansu done [root@web01 ~]# . a.sh 4 echo ${#list[*]} // 数组中元素的个数