shell变量定义
一,变量:
可变化的量,有名称的内存空间(在内存中要占据空间)
声明变量的目的是:让计算机留出内存空间来储存某一个确定类型的数据
二,bash中变量的类型
(1)环境变量:对当前shell及其子shell都是生效的,declare -x var=value or export var=value
显示当前环境变量,export or printenv or env
(2)本地变量(局部变量):仅对当前shell有效,对子shell无效。
(3)特殊变量:通常指shell自身的变量
(4) $?:引用上一条命令状态的返回值;
0:成功
1-255:失败1,2,127系统预留的
(5),位置变量:用于引用传递过来的参数: $0, $1 ,$2 ....${11}
(6),局部变量:作用范围可以缩小到只对一段代码有效)
local name (定义成只对一段代码有效)
命令别名:alias cmd_alias= ''(有些时候要带,没-,/之类就不用带'') , unlias
三,系统上常用的环境变量:
(1)PATH:定义命令搜索路径
/usr/local/mysql/bin
export PATH=$PATH:/usr/local/mysql/bin(在原来PATH变量中添加/usr/local/mysql/bin,当运行mysql命令就不需要使用绝对路径)
hash 系统加速的缓存(shell内置变量)命令执行完会在hash中
(2) LANG:语言变量
/etc/sysconfig/i18n
语言:编码规则
DISPLAY=
screen
每个变量的生命的周期其关联进程,shell进程
(3) PS1
export 或declare -x 声明环境变量,
改变全局在/etc/profile,改变用户在~/.bashrc
立即生效与永久生效(写入配置文件才能永久生效)
(4) bash环境配置文件:
全局:
/etc/profile,/etc/profile.d/* ,/etc/bashrc
用户个人:
~/.bash_profile,~/.bashrc,~/.bash_logout
每一个shell脚本的执行,必然是使用对应的shell程序来实现
/bin/bash, /tmp/test.sh
登录式shell:(先读/etc/profile-->/etc/profile.d/*-->~/.bash_profile--->~/.bashrc-->/etc/bashrc)
1,用户登录最后创建的shell
2, su - username
非登录式的shell:(~/.bashrc-->/etc/bashrc--->/etc/profile.d/*)
su username
脚本执行
图形界面打开的shell
profile类:为登录式shell所用的配置文件(source=.)
设置环境变量;
设置命令或脚本
bashrc类,非登录式shell所用的配置文件
本地变量;
命令别名:
()表示在子shell中执行,()里的内容表示命令
管道的最后一个命令通常也在最后一个子shell执行
四,在bash中不需要事先声明,如果没声明则默认都当成字符串,但是可以事先声明,
变量的事先声明:
(1)declace [ options ] var
-i :整型
-x :环境变量
-a :数组
-r :只读变量,值不能改变,也不能撤消
(2)变量命名:
1,只能包含字母,数字,下划线,并且不能以数字开头;
2,不能与关键字冲突
3,见名知义
4,引号:
单引号:''
双引号:"" 变量替换
反引号:`` 命令替换(把命令执行结果当作别的命令的参数) =$()
5,变量引用:
$var
${var} :如果变量值中有特殊字符或带后缀时不能省略{}
path="$PATH"与path=${PATH}与path=$PATH(这种方式少用,因为有时$PATH中含有特殊字符时会出现问题,如含有空格之类的时候)
三种方式效果是一样的。都是定义path的变量等于PATH的变量
引用命令的结果两种方式:
(1)MYUID=$(id -u root)
(2)MYUDI=`id -u root`
五,变量赋值
set var_name=value (set 可以省略)
DIR=/tmp/name
DIR='/tmp/name'(一般情况都可以用,但是有空格之类的特殊符号时,刚必须加''或"")
DIR="/tmp/name"(如果/tmp/name中有$则不能使用'')
unset var_name(撤销变量) 变量名最好有大写,习惯性用法,当然不一定要
六:变量类型
1,决定存储类型 2,数据表示范围
整型:
字符型:
布尔型:
浮点型:
ascii:定义了基本字符,
byte:8bit
七,bash如何实现命令展开;
(1)切开;以space,tab,enter分隔
(2)别名替换,命令行展开,$ ,{} ,()
(3)再切开
(4)实现重定向:>,>> ,< ,<<
(5)执行命令
阻止展开:1,转义字符\,2,单引号,3 ,双引号
八,位置变量
./a.sh a b c
$0 $1 $2 $3
bash -x 与set -x(写在脚本里)调试脚本
set +x 取消调试,set -x 与set +x之间会调试(调试片段)
$#:代表接不接参数的个数,上面表示有四个
$@:代表”$1" "$2" "$3" "$4",每个变量是独立的(用双引号括起来)
$*:代表"$1 $2 $3 $4" 中间默认用空格键隔开,因IFS默认的第一个变量是空格
变量赋值等号与let (a=1 与let a=1效果一样,赋值数值,不用加引号)
name="mary smith"(引号的目的是告诉计算机从哪开始到哪结束,引号中间的字符就会被当作字符串处理
如果是只有单个时,可以不用引号name=mary,赋值字符串,最好加引号)
九,脚本的函数
功能模块,结构化编程,代码重用
先定义后调用
14,bash中定义被函数两种方式:
(1)function func_name {
body
}
(2)fname () {
body
}
函数的返回值:
是函数调用时所执行的函数体中的最后一条语句的状态返回值
自定义函数返回值
return #
函数还能接受参数
/var/lock/subsys
/etc/rc.d/init.d/functions 定义了系统上常用的函数
(1)daemon
(2)killproc
(3)pidofproc
(4)status
(5)echo
echo_failure
${para#*word} 以word为分隔符,自左向向,word这个分隔去匹配,找到第一次匹配到的所有内容先移出
${para##*word} 。。。。。。。。。。。。.................,找到最后一次,也就是最长的一个给移出
${para%word*}................ 自右向左
${para%%word*} 自右向左
取得目录路径的时候可以用上