3

CentOS shell中的变量

 2 years ago
source link: https://blog.51cto.com/baicia/5516898
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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==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

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[*]} // 数组中元素的个数

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK