`

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

 

分享到:
评论

相关推荐

    shell编程之基础篇

    在本篇笔记中,将从基础篇开始,介绍构建基本Shell脚本的各项知识点。 首先,创建Shell脚本时,必须在文件的第一行指定要使用的shell解释器,这通常是通过“sha-bang”行来实现的,格式为“#!/bin/bash”。这条指令...

    linux脚本大全必看

    《Linux脚本大全必看》一书,是深入学习Shell脚本编程的宝典,它不仅涵盖了基础的脚本编写技巧,还详细介绍了高级的Shell编程技术,是每一位Linux爱好者和系统管理员不可多得的学习资源。以下是对该书中几个关键章节...

    BASH入门基础篇.pdf

    - 其他选项可用于改变输出行为,例如 `-e` 用于启用对转义字符的解释。 - **应用示例**: - `echo -n "Hello"` 不会在打印完 "Hello" 后换行。 - `echo -e "\nNew Line"` 会在新的一行中打印 "New Line"。 以上...

    linux C一站式编程课后答案汇总

    从提供的内容来看,本书可以分为上篇和下篇,上篇主要介绍C语言入门,包括程序的基本概念、常量、变量、表达式等基础知识,而下篇则深入探讨C语言的本质,可能包括更高级的主题。以下从提供的内容中整理出相关的知识...

    Linux命令学习笔记

    文章涵盖的主要内容包括:Linux管道的使用、常用的字符处理命令(如cat、grep、tail、echo等),以及环境配置、作用域、流程控制等内容,并通过具体的案例进行说明。 #### Linux管道 Linux管道是一种强大的功能,...

    Tcl常用命令备忘录(拾陆楼).pdf

    本文主要涵盖了Tcl的基础篇,包括置换、特殊字符、`append`和`incr`命令的使用,以及如何在不同环境中执行Tcl脚本。 首先,让我们深入理解Tcl中的置换机制。变量置换使用 `$` 符号来引用变量的值,如`$name`,它...

    高级Bash脚本编程指南

    Bash脚本中,特殊字符如`$`,`#`,和`*`等有着特定的意义,它们用于变量引用、注释和通配符等功能,理解这些特殊字符是编写有效脚本的基础。 #### 2. 变量与参数 - **变量替换**:`$VAR`用于引用变量VAR的值。 - **...

    实践大师:Unix Shell编程篇

    2. **转义字符**:`\`用于转义特殊字符,如`\*`表示匹配星号本身。 3. **数组**:在Bash中,`my_array=(value1 value2)`定义数组。 4. **算术扩展**:`$(())`或`let`用于执行算术运算。 **四、高级特性** 1. **...

    shell脚本.docx

    - 双引号内可以包含变量,支持转义字符。 #### 六、Shell脚本参数传递 1. **参数格式** - `$n`:`n`代表执行脚本时传递的参数位置。 - `$0`:代表执行的脚本文件名。 #### 七、Shell命令与控制流 1. **echo...

    高级bash脚本编程指南

    2. **引用**:双引号`"`保留变量扩展但不保留特殊字符,单引号`'`保留特殊字符但不扩展变量,反引号```执行命令。 ### 错误排查与调试 1. **日志记录**:使用`echo`或`printf`将信息写入日志文件,便于追踪脚本...

    linux Shell学习笔记最后一节,温故与知新

    本篇笔记主要总结了Linux Shell编程的一些关键点,包括脚本编写技巧、变量命名规范、注释规则、引用符号的使用、函数定义以及文本输出排版。 首先,脚本文件名的命名规则至关重要。文件名应由字母、数字、"."、"_...

    ABS中文版

    - 阐述了如何处理字符串中的变量和其他字符,以及如何转义特殊字符。 6. **第6章:退出与退出状态** - 解释了脚本如何优雅地结束执行,并返回退出码。 7. **第7章:测试** - 涵盖了条件判断语句的使用,包括...

    shell文档(适合新手以及经常使用unix的na使用)

    这篇文档适合新手学习,旨在介绍Shell的基本语法和常用命令。 首先,了解Shell的基本元素: 1. `~`代表用户的家目录,如`/home/username`。 2. `$`用于提示用户输入,而在脚本中则常用于引用变量或表示命令的结束。...

    cvs c++ 解析类

    因此,解析CSV文件的核心任务是识别这些分隔符和转义字符。 设计C++的CSV解析类时,我们可以考虑以下关键点: 1. **类的结构**:创建一个名为`CsvParser`的类,包含私有成员变量,如文件流对象、当前行和字段等,...

    Perl in 21 Days

    - **双引号与单引号**:双引号字符串支持变量插值和转义序列,而单引号则直接表示字符序列。 - **转义序列**:如`\n`表示换行,`\t`表示制表符。 ### 四、深化篇:更多操作符与函数 #### 4.1 运算符 - **幂运算**...

    一篇教会你写90%的shell脚本(入门小结)

    - 双引号内的变量有效,可以出现转义字符。 字符串操作包括: 1. 字符串拼接:通过空格或分号实现,如`name="this is" "my name"`。 2. 获取字符串长度:`echo ${#name}`。 3. 提取子字符串:`${name:起始位置:长度...

    传带空格的命令行参数

    为了解决这个问题,可以采用两种常见的方法:使用引号(双引号或单引号)将整个参数括起来或者通过转义字符来处理空格。 ### 在不同环境中的处理方式 #### Windows 环境 在 Windows 系统中,处理带空格的命令行...

    Yacc与Lex快速入门

    ### Yacc与Lex快速入门知识点详解 ...- 通过本篇文章的学习,读者可以了解到Lex和Yacc的基础知识以及它们在词法分析和语法分析中的应用。掌握这两门工具对于开发编译器或其他语言处理程序至关重要。

    unix command line notes (2010)

    本篇文章基于一份名为“Unix Command Line Notes (2010)”的教学资料,由Bob Dowling与Julian King编写,旨在为读者提供全面且深入的Unix命令行基础知识讲解。通过学习本文档,读者能够掌握在Unix环境下进行高效操作...

Global site tag (gtag.js) - Google Analytics