关于shell变量,你不得不知道的那些事

shell变量

一、变量的类型

  • 变量

    • bash作为程序设计语言和其它高级语言一样也提供使用和定义变量的功能
    • 需要注意的是,shell变量没有类型的区分,或者说仅有字符串类型。
  • 自定义变量、环境变量、位置变量、预定义变量

    自定义变量
    		定义:变量名称=值
    				变量名称:只能由字母,数字,下划线组成,不能以数字开头;
    				注意:应该让变量名称有意义;
    				= 赋值符号 前后不能有空格 ;
    				值: 所有的字符串和数字都可以;
    				引用变量: $变量名 或 ${变量名}[root@xiaowo ~]# a=99
    [root@xiaowo ~]# echo $a
    99
    [root@xiaowo ~]# echo $aa  
                                  #此时输出为空因为系统认定aa为变量
    [root@xiaowo ~]# echo ${a}a
    99a
    查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
    				取消变量: unset 变量名 仅在当前shell中有效
    				作用范围: 仅在当前shell中生效
    				
    
    环境变量
    		shell在开始执行时已经定义好的 
    		env 查看所有环境变量
    		set 查看所有变量 
    		环境变量拥有可继承性:export之后就拥有继承性
    		export 导出变量(作用范围)
    临时生效
        [root@xiaowo ~]# IPADDR=192.168.1.1
    		[root@xiaowo ~]# echo $IPADDR
    		192.168.1.1
    永久生效
    		写到4个登陆脚本中 ~/.bashrc ~/profile 更好放在/etc/profile.d/* 下建立独立的环境变量配置文件
    		常用环境变量:USER UID HOME HOSTNAME PWD PS1 PATH
    PATH:存储所有命令所在的路径		
    

    注:环境变量通常用在系统变量中,自己用一遍仅使用自定义变量。

    预定义变量:
    		$0 脚本名
            $$ 当前进程PID
            $? 命令执行后的返回状态.0 为执行正确,非 0 为执行错误 
            $# 位置参数的数量
            $* 所有位置参数的内容
            $@ 所有的参数
            $! 上一个后台进程的PID 
     注:注意$*$@的区别,
     
     位置变量
    		$1 $2 $3 $4... ${n}
    

    二、变量的类型

1.显式赋值

    变量名=变量值

    示例:
    ip=192.168.15.13
    name="xiaowo"
    today1=`date + %F`
    today2=$(date + %F)
  注意:   ` `$() 是等价的,shell中建议用后者
2.read从键盘读入变量值
	read 变量名
	read -p "提示信息" 变零名		 #-p 提示输入信息
	read -t 5 -p "提示信息" 变量名  #-t 5  延迟5秒
	read -n 2 变量名				#-n    限制输入的文本长度

三、强引和弱引

" "  弱引

' '  强引

[root@xiaowo ~]# name=xiaowo
[root@xiaowo ~]# echo "${name}" is a man
xiaowo is a man
[root@xiaowo ~]# echo '${name}' is a man
${name} is a man                           #在单引号中,不存在变量

注:1.在使用引号的嵌套时,注意单引号和双引号交替使用
    错误示范:" "xiaowo " " 此时体统会按前后顺序辨别引号
   2.` ` ,反引号等价于$(), 反引号中的shell命令会优先被执行

4.变量的运算

1.整数运算
+ - * / %   #加 减 乘 除 取余

方法一: expr
expr  1 + 2
expr  $num1 + $num   

方法二: $(())
echo $(($num1+$num2))
echo $((num1+num2))
echo $((5-2*3))
echo $(((2-1)*4)
echo $((2**3))
sum=$((1+3));echo $sum

方法三:$[]
echo $[5+2]
echo $[2**3]

方法四:let   
let sum=2+3;echo $sum
let i++;echo $i

2.小数运算
echo "2*4" |bc            #bc 进入交互模式
echo "2^4" |bc
echo "scale=2;6/4" |bc
awk 'BEGIN{print 1/2}'
echo "print 5.0/2" |python

5.变量"内容"的删除和替换

1.内容的删除
[root@xiaowo ~]# url=www.sina.com.cn
[root@xiaowo ~]# echo ${#url}     #获取变量值的长度
15
[root@xiaowo ~]# echo ${url}	  #标准查看
www.sina.com.cn
[root@xiaowo ~]# echo ${url#*.}   #从前往后,最短匹配
sina.com.cn
[root@xiaowo ~]# echo ${url##*.}  #从前往后,最长匹配
cn
[root@xiaowo ~]# echo ${url%.*}   #从后往前,最短匹配
www.sina.com
[root@xiaowo ~]# echo ${url%%.*}  #从后往前,最长匹配
www

切片和索引
索引下标 0 1 2 3 4 5 ... n
{url:m:n}   #从下标m开始,取n个值

[root@xiaowo ~]# url=www.sina.com.cn
[root@xiaowo ~]# echo ${url:0:5}
www.s
[root@xiaowo ~]# echo ${url:5:5}
ina.c
[root@xiaowo ~]# echo ${url:5}
ina.com.cn

内容的替换
${url/旧的值/新的值}

[root@xiaowo ~]# url=www.sina.com.cn
[root@xiaowo ~]# echo ${url/sina/baidu}
www.baidu.com.cn
[root@xiaowo ~]# echo ${url/n/N}
www.siNa.com.cn
[root@xiaowo ~]# echo ${url//n/N}   #贪婪匹配
www.siNa.com.cN


[root@xiaowo ~]# unset var1
[root@xiaowo ~]# echo ${var1}  #var1未定义

[root@xiaowo ~]# echo ${var1-aaaaa} 
aaaaa
[root@xiaowo ~]# var2=111        #var2已有值
[root@xiaowo ~]# echo ${var2-bbbb}
111
[root@xiaowo ~]# var3=			  #var3为空
[root@xiaowo ~]# echo ${var3-cccc}

[root@xiaowo ~]# 

${变量名-新的变量名}
变量没有被赋值:会使用“新的变量值”替代
变量有被赋值的(包括空值):不会被替代
${变量名:-新的变量名}
变量没有被赋值:会使用“新的变量值”替代
变量有被赋值的(不包括空值):不会被替代

6.变量中奇怪的字符总结

()		子shell中执行
(())	数值比较,运算C语言
$()		命令替换
$(())	整数运算

{}		集合
${}		引用变量等

[]		条件测试
[[]]	条件测试,支持正则 =~
$[]		整数运算
执行脚本
#./test.sh			需要执行权限,在子shell中执行
#bash test.sh		不需要执行权限,在子shell中执行

#.test.sh			不需要执行权限,在当前shell中执行
#source test.sh		不需要执行权限,在当前shell中执行

调试脚本
#sh -n test.sh		仅调试 syntax error
#sh -vn test.sh		以调试的方式进行,查询整个执行过程

basename & dirname(拓展)
basename 命令
basename 是去除目录后剩下的名字 
# 不会检测文件系统,只是取路径的最后一段,将他截取出来
例: 
		#temp=/home/temp/1.test
		#base=`basename $temp`
		#echo $base 
结果为:1.test
dirname 是去除文件的目录名
# 不会检测文件系统,默认路径的最后一段为文件名,把它扇区
例:
    #temp=/home/temp/1.test
    #dir=`dirname $temp`
    #echo $dir 
结果为:/home/temp

dirname 获取当前脚本的路径
$( cd $( dirname $0 ) ; pwd )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值