linux中shell脚本的变量设置、运行和置换

shell变量、运行和置换

  • 变量
    • 预定义变量
    • 环境变量
    • 自定义变量
      • 定义变量
      • 重复定义变量
      • 引用变量
      • 查看变量
      • 删除变量
      • 交互式定义变量
    • 位置变量
    • 变量的运算
      • 算式运算符
      • 生成随机数
      • 浮点运算
    • 变量的引用
    • 变量的嵌套
  • 运行
    • 脚本测试
    • 执行脚本
  • 变量置换
    • 命令替换
    • 变量替换
    • 变量截取
      • 匹配截取
      • 索引切片
      • 变量内容
        • 删除
        • 更改

变量

变量:bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能

预定义变量

被系统已经预先定义好的,随时都会使用的特殊变量

$0 脚本名/程序名
$* 所有的位置参数
$? 上一个程序的返回值(0是成功,非零失败)
$$ 当前进程的PID
$# 位置参数的个数     

环境变量

shell在开始执行时已经定义好的

env 查看所有环境变量
set 查看所有变量 
环境变量拥有可继承性:export之后就拥有继承性:   export 导出变量(作用范围) 

临时生效,终端临时定义
IPADDR=192.168.1.1
echo $IPADDR
192.168.1.1

永久生效,写在系统变量的文件中
写到4个登陆脚本中~/.bashrc ~/profile更好放在/etc/profile.d/*下建立独立的环境变量配置文件

自定义变量

用户自定义变量是最常用的变量类型,其特点是变量名和变量值都是由用户自由定义的。

定义变量

变量名称=值
变量名称:只能由字母,数字,下划线组成,不能以数字开头
= 赋值符号,前后不能有空格 
值: 所有的字符串和数字都可以
作用范围: 仅在当前shell中生效

注意:
应该让变量名称有意义
不能使用标点符号
不能使用bash中的关键字(可用help命令查看保留关键字)
定义变量只能使用英文字母、数字和下划线,首个字符不能以数字开头
等号左右两侧不能有空格
变量的值如果包含空格,必须用引用包含 {引用""}

重复定义变量

重复定义变量会进行变量叠加
变量重复使用会造成变量覆盖
在进行变量叠加时,使用${变量名}格式
在进行变量叠加时,变量名需要用""或者${}包含

如:
定义变量aa的值123     aa=123
叠加使用时要用""或者${}包含     aa=${aa}456  或者  aa="$aa"456
如果不使用""或者${}包含,就会造成变量覆盖    aa=456 

引用变量

$变量名

查看变量

echo $变量名;
set:显示与设置shell变量信息
env:查看当前系统中所有变量

删除变量

unset 变量名

交互式定义变量

read从键盘读入变量值    
赋值方式:read 变量名
read -p "文字提示信息:" 变量名
					
-s隐藏回显
-t 设置等待时间

位置变量

位置变量预先已经被定义过了

命令 参数1 参数2 参数3.....以后特殊定义
$0    $1   $2    $3  $4 $5 $6 $7 $8 $9...
				
位置变量就是$0 $1 $2 $3 
位置变量预先已经被定义过了
用户使用时候,必须携带参数
位置变量不是设计程序唯一的办法。如read也可以实现相同功能

变量的运算

算式运算符

+:加法运算

-:减法运算

*:乘法运算

/:除法取整运算

():优先运算括号内的

%:除法取余运算,取余(取模)

expr 在expr中*有其他含义,运算乘法时候需要转义,如:expr 5 \* 8

生成随机数

$RANDOM    //随机生成一个数字,后续可以进行运算

echo $(($RANDOM%10))      //生成0-9之间的随机数
echo $(($RANDOM%10+1))    //生成1-10之间的随机数

浮点运算

bash本身不能做小数计算:需要bc命令转换 
yum -y install bc   //安装bc工具

echo "scale=2 ;变量 符号 变量" | bc
scale是小数的位数

变量的引用

转义:\
当一个字符被引用时,其特殊含义被禁止,把有意义的变的没意义,把没意义的变的有意义

"":弱引用   只能转译一些比较常见的空格,通常做分隔作用
'':强引用   在单引号内部的所有特殊符号,都将失去它本身的含义,只余下字符含义
``:优先执行 优先执行引号内的语句、内容,通常用在命令的运行结果成为其他命令的参数时
$():效果等同于``

变量的嵌套

表示(变量)$var的长度:eval 执行字符串内的可执行命令

name='kobe' 
kobe=24 
eval echo '$'"${name}"

先获取name的值,通过再次构造echo命令,使用eval再一次执行语句

运行

脚本测试

sh –x script:这将执行该脚本并显示所有变量的值
sh –n script:不执行脚本只是检查语法模式,将返回所有错误语法
sh –v script:执行脚本前把脚本内容显示在屏幕上

执行脚本

sh 脚本.sh
bash 脚本.sh
./脚本.sh         //需要执行权限
. 脚本.sh
source 脚本.sh

sh执行方式和bash执行方式想同
.执行方式和source执行方式相同

sh和source的区别:
sh:当使用sh来执行脚本时,它会创建一个新的子进程来执行脚本,并且脚本中的变量和环境设置通常不会影响当前的shell环境
source:使用source或.来执行脚本文件时,脚本中的命令会在当前Shell环境中执行,并且脚本可以修改当前Shell的变量和环境设置。

变量置换

命令替换

a=`date +%m%d` 
a=$(date +%m%d) 

反引号可用$() 代替

变量替换

${parameter:-word}
若parameter为空或未设置,则用word代替parameter进行替换,parameter的值不变 

${parameter:=word}
若parameter为空或未设置,则用word代替parameter进行替换,parameter的值改变 

${parameter:+word}
若parameter设置了,则用word代替parameter进行替换,parameter的值不变

${parameter:?message}
若parameter为空或未设置,则message作为标准错误打印出来,这可用来检查变量是否正确设置

变量截取

匹配截取

${变量#关键词}  若变量内容从头开始的数据符合『关键词』,则将符合的最短数据切除

${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据切除

${变量%关键词}  若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据切除

${变量%%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据切除

${变量/旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串替代

${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串替代』

索引切片

a=12345678
echo ${a:5}      //从第5位开始截取 

echo ${a:3:4}    //从第3位开始截取,截取4位

echo ${a:2:-1}   //从第2位开始截取,从最后在截取1位

echo ${a:2:-2}   //从第2位开始截取,从最后截取2位

总结:变量后面是截取开始,再往后,负数结尾从最后切;正数结尾是步长。

url=www.sina.com.cn 
echo ${#url}   //获取变量的长度 
15

echo ${url}    //正常显示变量 
www.sina.com.cn

变量内容

删除
echo ${变量#*关键字}   从前往后,最短匹配关键字,删除匹配值之前的
echo ${变量##*关键字}  从前往后,最长匹配关键字,删除匹配值之前的

echo ${变量%关键字*}   从后往前,最短匹配,删除匹配值之后的
echo ${变量%%关键字*}  从后往前,最长匹配,删除匹配值之后的
更改
$ echo ${变量/旧字符/新字符}      //第一次匹配的旧字符被替换

$ echo ${a//旧字符/新字符}       //全局的旧字符匹配被替换

你可能感兴趣的:(linux,shell,linux,运维,服务器)