Linux引用变量再加单引号,【Linux基础篇】变量跟引用以及转义符

本文详细介绍了Shell脚本中的变量使用,包括变量赋值、引用、特殊变量如环境变量和位置参数。讲解了四种引用符号的含义和用法,以及如何设置和清除变量。此外,还探讨了局部变量、环境变量和位置参数的区别。通过示例展示了如何在脚本中传递和使用参数,并讨论了命令替换的概念。最后,文章提到了与C语言结合编程的方法。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值