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*} 自右向左

取得目录路径的时候可以用上