shell 变量和引用
变量无类型
变量的赋值与替换
特殊变量:环境变量,位置参数
4种引用符号的意义及用法
转义符
变量分类:本地变量、环境变量、位置参数
本地变量,即局部变量,仅在当前shell中有效
环境变量,即系统默认定义的变量,任何shell中都可以直接使用
位置参数,用来向shell脚本传递变量,只读
-----------------------------
给变量赋值
variable=value 或 ${variable=value}
1.等号两边不可以有空格
2.value中包含空格,则必须用双引号括起来
3.变量名以字母(a~z,A~Z),数字(0~9),下划线(_)组成,不能以数字开头
使用定义的变量
$variable 或 ${variable}
变量赋值中使用另一个变量
var1="hello shell"
var2="go: $var1"
echo $var2
输出:go:hello shell
清除变量
unset 变量名
重新给变量赋值
variable+value
测试变量是否已经赋值
variable?value
variable:?value
判断变量是否已经赋值,如果没有,则对其赋值(或临时赋值),否则,使用原值
variable:=value
variable:-value 临时赋值,使用后value清除
设置变量的只读属性
variable=value
readonly variable 声明该变量为只读
或者,通过declare和typeset命令设置变量为只读
变量的类型
bash shell 只支持整型和字符型(默认)
shell通过判断值是否全为数字,如果是,则为数值型,否则为字符型
字符型具有默认的整型值:0
declare -i a 声明a为整型,如果a为字符串,则不变;如果将字符串与整型进行运算,则字符串按0处理
declare -r 设置变量为只读,与readonly等价
可以不定义变量,直接使用:
数值型默认值为0,字符型默认值为空
echo "e=$e" #未定义,直接使用,输出e=
let "e+=1" #e=e+1
echo "e=$e" #e=1
环境变量
定义环境变量
第一步,对环境变量赋值(环境变量一般为大写字母):EVNIRON-VARIABLE=value
第二步,使用export声明该变量为环境变量:export EVNIRON-VARIABLE
如,设置1个环境变量,变量名为APPSPATH,值为/usr/local
APPSPATH=/usr/local
exprot APPSPATH
echo $APPSPATH
列出系统中的环境变量:env
输出内容很多,则使用grep抓取 env | grep xxx
清除环境变量
unset APPSPATH
重要的环境变量
PWD 记录当前目录,每次使用cd命令,将同步更新
OLDPWD 记录上一次打开的目录,即命令"cd -"的功能
PATH
用于shell命令定位输入的命令,输出的命令实际为1个个的shell脚本文件,也成为可执行文件
shell命令存放目录:
系统命令,放置在Linux系统标准目录;
用户自己编写的shell脚本,则放置到用户目录。
PATH将这些目录都记录下来,当输入命令时,Shell就会根据PATH搜索用户所输入的命令
任何PATH中关联到的命令都可以在任何目录下执行
查看当前PATH:$PATH
在PATH中添加新目录,注意,在后面追加以前的PATH值,不要丢失
export PATH="mydir/bin":$PATH
HOME
记录当前用户的根目录,即cd~
由/et/passwd 倒数第2个域决定
HOME目录用来保存当前登录用户的文件
非root用户的根目录都在/home目录下,通常以用户名命名
SHELL
SHELL变量保存默认的Shell值,默认值为/bin/bash,表示当前使用的Shell是bash Shell
如果要使用其它Shell,需要重新设置SHELL变量的值
USER/UID
USER和UID用来保存用户信息
USER表示已经登录的用户名
UID表示已登录用户的ID
echo $USER $UID
输出: root 0
PPID
表示创建当前进程的进程号,即父进程的进程号
PS1/PS2
用来设置linux命令行的提示符格式
[root@localhost ~]#
IFS
设置Shell域的分隔符
export IFS=: #设置分隔符为空格
export IFS= #设置分割符为冒号(默认就是冒号)
与环境变量配置相关的几个文件
.bash_profile
.bashrc
.bash_logout
.开头的文件,表示隐藏文件
这3个文件存放在用户的根目录下,即$HOME目录下
echo $HOME
输出:/root
$HOME/.bash_profile 是最重要的配置文件,当用户登录系统后,Shell会自动执行.bash_profile文件
如果该文件不存在,则自动执行系统默认的配置文件/etc/profile
==========================================================
# .bash_profile
# Get the aliase and functions
if [ -f ~/.bashrc ]; then #如果 宿主目录下存在.bashrc文件,则
. ~/.bashrc #执行宿主目录下的.bashrc文件
fi
# User specific environment and startup programs
export JAVA_HOME=/usr/local/jdk1.7.0
export CLASS_PATH=/usr/local/jdk1.7.0/lib
export CATALINA_HOME=/home/admin/tomcat7
export PATH=$PATH:$JAVA_HOME/bin:$HOME/bin #设置并声明新的环境变量 (如果是root,则$HOME为/root)
#over
==========================================================
新加入的exprot只有在注销用户后,再次登录才有效
如果要立即生效,需要使用source命令执行.bash_profile文件
source命令用来重新执行刚修改过的文件,使其立即生效,不必注销后再登录
source命令与符号 "." 等效
source bash_profile
. .bash_profile #.后面跟空格
使用source命令与在Shell中执行脚本的区别:
source是在当前bash环境下执行命令,新的环境变量在当前Shell进程与子Shell进程中都生效
而执行Shell脚本是启动1个子Shell来执行,新的环境变量只在子Shell中生效,无法在当前Shell中生效
.bashrc 由当前Shell所创建的新Shell,称为子Shell,子Shell将尝试读取.bashrc中的命令来设置自己的环境变量。
.bashrc文件使得用户登录时的环境变量与子Shell的环境变量相分离
.bash_logout 用户注销时执行,清除环境变量,记录登录时间等
===========================================================
#!bin/bash
#parent.sh
#输出当前线程的进程号
echo "Parent Process ID is $$"
#定义本地变量并输出
vlocal="Define a local variable."
echo "vlocal=$vlocal"
#定义环境变量
ENVVAR="Define a environment variable."
echo ENVVAR
exprot "ENVVAR=$ENVVAR"
#调用child.sh脚本,创建子shell
$PWD/child.sh #通过$PWD引用到当前的路径
#child.sh执行完毕后,输出上面定义的变量值
echo "Return to parent process: $$"
echo "vlocal=$vlocal"
echo "ENVVAR=$ENVVAR"
----------------------------------------
#!bin/bash
#child.sh
#输出自己的进程号
echo "Child Process ID is:$$"
#输出父进程号
echo "My Parent Process ID is $PPID"
#输出本地变量
echo "vlocal=$vlocal" #本地变量无法传递到子Shell中,输出vlocal=
echo "ENVVAR=$ENVVAR" #
#重新定义本地变量和环境变量
vlocal="Redefine this local variable"
ENVVAR="Redefine this environment variable"
echo "vlocal=$vlocal"
echo "ENVVAR=$ENVVAR"
#################################
执行parent.sh
sh parent.sh 或者 ./parent.sh
输出
Parent Process ID is:8101 #父进程号
vlocal=Define a local variable #本地变量的值
ENVVAR #没有使用$进行变量替换,则将ENVVAR当做字符串进行输出了
ENVVAR=Define a environment variable #定义的环境变量值
Child Process ID is:8102 #子进程编号
vlocal= #子Shell进程中获取不到父进程中的本地变量
ENVVAR= #子Shell进程中获取不到父进程中的环境变量
vlocal=Redefine this local variable #子Shell中设置的本地变量值
ENVVAR=Redefine this environment variable #子Shell中设置的环境变量值
Return to parent process:8101 #返回到父进程中,得到的进程号与开始时相同
vlocal=Define a local variable #本地变量与原来设置的一致
ENVVAR=Define a environment variable #环境变量与原来设置的一致
===========================================================
位置参数
在执行脚本时,向脚本传入的参数用$n进行替换
$0 #脚本名称
$1 到 $9 #第1个参数 ... 第9个参数
${10} ... ${20} #2为编号则需要用{}括起来
$# #传入到脚本的参数个数
$* 或者 $@ #从$1开始的全部参数
$$ #当前脚本运行的进程号
$? #当前脚本执行是否有错,0表示没有错误,非0则发生错误
==============================================================
引用
4个特殊符号的使用
双引号 "" 双引号中的"$"符号,"`"反引号,"\"反斜线都按特殊字符进行解析,不按字母意思解析。如"$vlocal"便可以将变量名替换为变量值
单引号 ‘’ 单引号中的任何字符都作为字符解析,没有特殊含义
反引号 `` Shell将反引号中的内容解析为系统命令,与$()功能相同,都是将内部字符串作为shell命令来执行
反斜线 \ 屏蔽下一个字符的特殊含义,如"\$PPID",则会将"$"按普通字符处理
ls a* #无引用,*按通配符进行解析,列出所有a开头的文件/目录
ls "a*" #被双引号引用后,*被解析普通字符,即列出a*目录的内容
1.双引号引用(部分引用) ""
既能保留美元符号($)、反引号(`)、反斜线(\)这3个符号的特殊功能,又能引用除了这3个符号之外的所有字符/字符串
如,双引号中的"$variable1"将对$进行特殊处理,引用variable1的值进行变量替换
另外,双引号可以防止字符串被分割,保留其中的空格
2.单引号引用(全引用) ''
单引号中的所有内容都解析为字面含义(单引号不再具备引用变量的功能)
==============================================================
命令替换
将1个命令的输出结果作为值付给某个变量
bash shell定义了2种语法进行命令替换
`command` #command泛指Linux中的任何命令
$(command) #$()功能更强大,可以嵌套
如,echo `date` 与 echo $(date) 等价
命令替换时,最好使用双引号""对命令进行引用,这样可以保留换行符
variable1=`ls -l a*`
echo $variable1 #换行符将被删除
echo "$variale1" #会保留换行符
expr length 计算字符串的长度
echo "$(sed -n '1p' parent.sh)" #获取parent.sh文件第1行的文本
echo $(expr length "$(sed -n '1p' parent.sh)") #计算parent.sh文件第1行的字符串长度
==============================================================
gcc: Linux下c语言编译器,对.c文件进行编译
gcc -o sample sample.c #对sample.c文件编译,通过-o参数将编译后的可执行文件命名为sample
shell与其它语言(c,c++,java)结合编程:
1.将其它语言的文件编译为shell的可执行文件 gcc -o sample sample.c
2.使用命令替换来调用这个文件 vother='./sample'
3.将这个文件输出的结果作为shell命令的输入 echo $vother
==============================================================
转义符
转义符屏蔽下一个字符的特殊含义
& 传递到脚本中的参数个数
? 0个或1个在其之前的那个普通字符
* 0个或多个在*符号之前的那个普通字符
+ 1个或多个在其之前的那个普通字符
^ 行首,或者表示"非"的含义
$ 命令退出状态,0表示没有错误,非0表示有错误发生
` 反引号,Shell引用符
" 双引号,Shell引用符
| 管道,或者表示"或"的意思
\ 反斜线,转义用
转义符后面跟一些特定字符表示特殊含义
\n 新换1行
\r 返回
\t 即Tab键
\v 或 \f 换行但光标停留在原来的位置
\b 退格键,即backspace
\a 报警声
\0xx ASCII码表中对应的字符
转义符的特殊用法
echo \ 将出现二级提示符,继续进行命令输入
echo \\ 转义符将自身进行转义,输出 \
==============================================================
echo
echo [option] [字符串]
作用:打印一段文字在控制台上,起提示和说明的作用
echo date
echo "`ls -l a*`"
echo 有2个参数:-n -e
-n 输出文字后,不换行
-e 将转义符后面的特殊字符按特殊含义解析