CentOS shell中的变量
Posted 白菜素三鲜丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CentOS shell中的变量相关的知识,希望对你有一定的参考价值。
shell中的变量
变量的介绍
变量即变化的量,核心是”变“与”量“二字,变即变化,量即衡量状态。
量:是记录现实世界当中的某种状态<br>变:指的是记录的状态是可以发送变化的
name=wsh
age=22
如何使用变量
变量名 赋值符号 变量值
name=wsh //shell中定义变量
name:wsh //yaml中定义的变量
定义变量的语法
- 变量名
- 相当于一个门牌号,便于取出变量值,是访问到值的唯一方式
- 赋值符号
- 将值的内存地址,绑定给变量名
- 变量值
- 用来表示状态
变量的使用规则:
先定义,再通过变量名去引用
定义变量名的规范
变量名的命名规则
1.大前提:变量名的命名应该能够反映出值记录的状态<br>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==2print $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==2print $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
shell中的数据类型
## 字符串类型
赋值:
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[*] // 数组中元素的个数
以上是关于CentOS shell中的变量的主要内容,如果未能解决你的问题,请参考以下文章
shell,shell脚本结构和执行方法,data命令,shell脚本中的变量
shell脚本介绍结构和执行date命令用法shell脚本中的变量
shell脚本介绍脚本结构和执行date命令用法脚本中的变量