【Linux基础篇】变量跟引用以及转义符

【Linux基础篇】变量和引用以及转义符

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 将转义符后面的特殊字符按特殊含义解析