第六章 shell学习之变量和引用

变量

本地变量:类似于局部变量,只在当前shell进程有效

环境变量:适用于所有登录进程所产生的子进程

位置参数:用于向shell脚本传递参数,只读

变量替换和赋值

引用变量值就称为变量替换,$就为变量替换符号,如a为变量名则$a或${a}为变量值

将值赋给某个变量名就称为变量赋值,格式:variable=value或${ variable=value },如值中包含空格则必须用""

清除变量的值:

unset 变量名

设置只读变量:

variable=value

readonly variable

还可以用declare和typeset实现

查看系统中的所有只读变量:

[[email protected] tmp]# readonly

declare -ar BASH_VERSINFO=‘([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")‘

declare -ir EUID="0"

...

变量赋值的模式

1.variable:?value或variable?value

对未赋值的variable显示系统错误

[[email protected] tmp]# echo ${a:?blue}

bash: a: blue

[[email protected] tmp]# a=black

[[email protected] tmp]# echo ${a:?blue}

black

2.variable:=value

对未赋值的variable,将value值赋给它

[[email protected] tmp]# a=black

[[email protected] tmp]# echo ${a:=blue}

black

[[email protected] tmp]# unset a

[[email protected] tmp]# echo ${a:=blue}

blue

[[email protected] tmp]# echo $a

blue

3.variable:-value

对未赋值的variable,返回value,但是variable仍未赋值

[[email protected] tmp]# unset a

[[email protected] tmp]# echo ${a:-blue}

blue

[[email protected] tmp]# echo ${a:?blue}

bash: a: blue

无类型的shell脚本变量

shell脚本变量是无类型的,并且同时具有数字型和字符型两种赋值,可以不用预定义变量而直接使用,数字型的初始值为0,字符型的初始值为空

[[email protected] tmp]# cat a.sh

#! /bin/sh

c=""

echo "c=$c"

let "c+=1"    #let命令用于执行算数运算,let "c+=1"等价于c+=1

echo "c=$c"

echo "e=$e"

let "e+=1"

echo "e=$e"

e="hello"          #此时该变量的数字值又变为0

echo "e=$e"

let "e+=2"

echo "e=$e"

[[email protected] tmp]# ./a.sh

c=

c=1

e=

e=1

e=hello

e=2

环境变量

父进程的环境变量可以传递给子进程,但是子进程的环境变量(或者修改了父进程定义的环境变量)传递不了也影响不了父进程

定义环境变量:

ENVIRON-VARIABLE=value

export ENVIRON-VARIABLE

习惯环境变量用大写

export表明此变量为环境变量

清除环境变量:

unset ENVIRON-VARIABLE

重要的环境变量:

1.PWD和OLDPWD

PWD记录当前目录,OLDPWD记录旧的工作目录

[[email protected] tmp]# echo $PWD

/tmp

[[email protected] tmp]# cd

[[email protected] ~]# echo $PWD

/root

[[email protected] ~]# echo $OLDPWD

/tmp

2.PATH

shell为每个输入命令搜索PATH中的目录列表

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

[[email protected] ~]# export PATH=$PATH:/tmp/bin      #添加新路径

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin

3.HOME

用户家目录的路径

[[email protected] ~]# echo $HOME

/root

4.SHELL

保存默认的shell值(/bin/bash)

5.USER和UID

已登录用户的名字和已登录用户的ID

[[email protected] ~]# echo $USER $UID

root 0

6.PPID和$

$PPID当前进程的父进程号,$$为当前进程的进程号

7.PS1和PS2

分别为开头的提示符和分行的提示符(即命令分多行输入时的提示符)

[[email protected] ~]# echo $PS1

[\[email protected]\h \W]\$

[[email protected] ~]# echo $PS2

>

\u代表当前用户名

\h代表主机名

\H代表主机名和域名

\W代表当前工作目录的名字

\w代表当前工作目录的完整路径

\$ UID为0则显示#,否则打印$

8.IFS

指定shell的输入域分隔符,默认为空格

[[email protected] ~]# export IFS=" "

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp/bin

[[email protected] ~]# export IFS=:

[[email protected] ~]# echo $PATH

/usr/kerberos/sbin /usr/kerberos/bin /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /usr/X11R6/bin /root/bin /tmp/bin

环境变量配置文件

在用户的根目录中,为隐藏文件

1.  .bash_profile

用户登录时自动执行,初始化环境变量,如果不存在该文件则执行/etc/profile

可以自己加入新的环境变量,并且执行. .bash_profile或者source .bash_profile立即生效(注销也可以)

source命令等价于.命令

直接执行文件是启动一个子shell,而子shell脚本设置的环境变量无法影响当前shell脚本,soure命令(或.命令)让简本在当前shell执行

[[email protected] ~]# cat .bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

. ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

2.  .bashrc

设置子shell的环境变量,使得用户登录时的环境变量设置与子shell的环境变量设置相分离,提高灵活性

3.   .bash_logout

在用户注销时执行,可以写入清楚某些环境变量的命令,也可以不存在

export PATH

unset USERNAME

父进程,子进程环境变量关系

子进程能继承父进程的环境变量,但是子进程修改父进程的环境变量只对子进程有效,不影响父进程环境变量,子进程创建的环境变量父进程也接收不到,而本地变量则互不影响

例:

[[email protected] tmp]# cat father.sh

#! /bin/bash

fatherLocal="fatherLocal"

fatherEnviron="fatherEnviron"

export fatherEnviron

echo "in fahter.sh"

echo "father process ID is $$"

echo "fatherLocal is $fatherLocal"

echo "fatherEnviron is $fatherEnviron"

$PWD/child.sh

echo "return to father.sh"

echo "fatherLocal is $fatherLocal"

echo "fatherEnviron is $fatherEnviron"

[[email protected] tmp]# cat child.sh

#! /bin/bash

echo "in child.sh"

echo "child process ID is $$ and my father is $PPID"

echo "fatherLocal is $fatherLocal"

echo "fatherEnviron is $fatherEnviron"

echo "change faterEnviron"

export "fatherEnviron=redefinfatherEnviron"

echo "new fatherEnviron is $fatherEnviron"

结果:

[[email protected] tmp]# ./father.sh

in fahter.sh

father process ID is 29171

fatherLocal is fatherLocal

fatherEnviron is fatherEnviron

in child.sh

child process ID is 29172 and my father is 29171

fatherLocal is

fatherEnviron is fatherEnviron

change faterEnviron

new fatherEnviron is redefinfatherEnviron

return to father.sh

fatherLocal is fatherLocal

fatherEnviron is fatherEnviron

位置参数

$0 脚本名称

$1 第一个参数

${10} 第十个参数,从10开始要加{}

$# 参数个数

$*或[email protected] 所有参数,不包括$0

$$ 进程号

$PPID 父进程号

$? 退出状态,0表示没有错误,非0表示有错误

引用

引用是屏蔽特殊字符的特殊意义,而将其解释为字面意义

"" 引用除了美元符号($),反引号(``),反斜杠(\)之外的所有字符

‘‘ 引用除了‘‘本身的所有字符

`` 反引号,shell将反引号中的内容解释为系统命令

\ 反斜杠,屏蔽下一个字符的特殊含义

对于变量加双引号可以保留多个空格(还有换行),而不解释为字段的分隔符(IFS默认为空),即双引号有防止变量变分隔符的作用

例:

[[email protected] tmp]# a="a       b       c"

[[email protected] tmp]# echo $a

a b c

[[email protected] tmp]# echo "$a"

a       b       c

[[email protected] tmp]# echo ‘$a‘

$a

[[email protected] tmp]# echo ‘why can‘t I‘m you are‘

why cant Im you are

[[email protected] tmp]# echo "why can‘t I‘m you are"

why can‘t I‘m you are

命令替换

将命令执行的标准输出替换该命令所在的位置

反引号(``)和$()

$()命令可以嵌套

$()将\就是\,而反引号(``)将\解释为空格

利用反引号可以将其它语言执行的结果赋值给shell变量,从而用shell处理

例:

[[email protected] tmp]# echo \\

\

[[email protected] tmp]# echo $(echo \\)

\

[[email protected] tmp]# echo `echo \\`

#空白行

command `echo`   #command代表任何命令,这里相当于不带参数

command "`echo`"  #带空字符串参数

command `echo x y`  #带两个参数,为x和y

command "`echo x y`"   #带一个参数,为x y

转义

作用:

1.解除一些特殊字符的含义

2.单个\在命令行中为出现二级提示符,在shell脚本中同样适用

3.在echo、sed、awk等命令中让一些字母能够表达特殊含义

1.

variable="()\\{}\$\""

echo $variable

echo "$variable"

IFS=‘\‘                        #改变输入变量分隔符

echo $variable

echo "$variable"        #双引号有防止变量变分隔符的作用,保留变量分隔符

[[email protected] tmp]# ./a3.sh

()\{}$"

()\{}$"

() {}$"

()\{}$"

2.

2.1

[[email protected] tmp]# echo \

> hello world

hello world

2.2

[[email protected] tmp]# echo \     #echo可以用""也可以不用

> "hello world"

hello world

2.3

[[email protected] tmp]# echo "\"   #注意这和前面两个存在本质的区别,这里的\转义了"导致缺少后",补全命令才结束,和2.4同

> hello world"

"

hello world

2.4

[[email protected] tmp]# echo "

> hello

> world"

hello

world

2.5

[[email protected] tmp]# variable=\

> hello world

bash: world: command not found         #变量赋值如果有空格必须用引号

2.6

[[email protected] tmp]# variable=\

> "hello world"

[[email protected] tmp]# echo $variable

hello world

2.7

[[email protected] tmp]# cat a5.sh

#! /bin/bash

echo \                                                   #单个/在shell脚本中同样适用

hello world

[[email protected] tmp]# ./a5.sh

hello world

3.

\后跟字母的特殊含义:

\n 新的一行

\r 返回

\t tab键

\v或\f 换行但光标忍停留在原来的位置(横坐标相同)

\b 退格键

\a 发出警报声

\0xx ASCII码0xx对应的字符

例:

[[email protected] tmp]# echo hello\b\101

hellob101

[[email protected] tmp]# echo $‘hello\b\101‘        #和-e ""基本等价

hellA

[[email protected] tmp]# echo -e "hello\b\0101"    #注意\0101的0,没有0不能解析成ASCII码

hellA

[[email protected] tmp]# echo -e "hello\b\101"

hell\101

[[email protected] tmp]# echo -e hello\b\101        #注意-e没有""同样不能解析

hellob101

注意:

echo [选项] [字符串]

选项-e表示将转移符(\)后跟字符形成的特殊字符解释成特殊意义

选项-n表示输出文字后不换行:

[[email protected] tmp]# echo -n "hello"

hello[[email protected] tmp]#

第六章 shell学习之变量和引用

时间: 2024-10-18 07:28:37

第六章 shell学习之变量和引用的相关文章

第四章 shell学习之sed命令和awk编程

sed命令 sed只是对缓冲区中原始文件的副本进行编辑,不改变源文件,所以要保存则要重定向到另一个文件 sed三种方式: 1.sed [选项] 'sed命令' 输入文件 2.sed [选项] -f sed脚本文件 输入文件 3../sed脚本文件 输入文件 其中3的sed脚本文件要以#! bin/sed -f等开头 选项: -n 不打印所有行到标准输出,默认先打印匹配的再打印所有 -e 关联多个sed命令 -f 调用sed脚本文件 定位文本: x x为指定行号 x,y 从x到y行 /patter

第六章 Shell数组应用

目录 第六章 Shell数组应用 1. 数组基本概述 2. 数组基本使用 3. 数组遍历与循环 第六章 Shell数组应用 1. 数组基本概述 01. 什么是数组? 数组其实也算是变量,传统的变量只能存储一个值,但数组可以存储多个值. 02. 数组的分类 Shell数组分为普通数组和关联数组.普通数组:只能使用整数作为数组索引.关联数组:可以使用字符串作为数组索引. 2. 数组基本使用 01. 普通数组仅能使用整数来作为索引 #普通数组赋值方式 1.方式一:针对每个索引进行赋值 [[email 

第三章 shell学习之正则表达式

正则表达式 \<the\>:精确匹配the,不包括包含the的单词 [^b-d]:不包含b~d a\{2\}:a出现2次 a\{2,3\}:a出现2~3次 a\{2,\}:a至少出现2次 [:upper:]:大写字母(用的时候外面加一层[]表示匹配字符集合) [:lower:]:小写字母 [:digit:]:数字 [:alnum:]:大小写字母和数字 [:space:]:表示空格或tab键 [:alpha:]:大小写字母 通配 注意通配和正则表达式不同,虽然有共同的符号 ls -l *.sh

第五章 shell学习之文件的排序、合并和分割

sort命令 sort [选项] [输入文件] 选项: -c 测试文件是否已经排序,如果未被排序则输出第一个未被排序的记录 -k 指定排序的域 -m 合并两个已排序的文件,合并的文件也已经排序,如sort -m a1 a2,a1的记录被有序的插入a2 -n 根据数字的大小进行排序,一般放在域号后,如-k3n -o 将输出重定向到指定文件 -r 将排序结果逆向显示 -t 改变域分割符,如-t: -u 去除结果中的重复行 sort和awk联合 例: [[email protected] tmp]#

OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)

OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-while) 跳跃(discard, return, break, continue) 6.1函数定义   着色器是由一系列全局声明和函数定义组成的.函数声明规范如下: // prototype returnType functionName (type0 arg0, type1 arg1, ...,

第二章 Shell编程之变量

Shell编程之变量 一 Bash变量与变量分类 Bash是Linux中的标准Shell,因此经常称Bash为Shell. 1. 变量命名规则 变量名可以由字母.数字.下划线组成,但必须以字母与下划线开头: 变量名的长度不能超过255个字符: 变量名在有效范围必须唯一: 在Bash中,变量的默认类型都字符串型: 2. 变量按照存储类型分类 默认类型是字符串型. 字符串型,赋值时单双引号皆可: 整形: 浮点型: 日期型: 二 用户自定义变量 变量名与变量值都是用户自定义的,就是说可以由用户控制修改

鸟哥的Linux私房菜——第十六章:学习Shell Scripts

视频链接: 1. 什么是 Shell Script       (shell写的脚本)1.1 干嘛学习 shell scripts? ()1.2 第一支 script 的撰写与执行1.3 撰写 shell script 的良好习惯建立 2. 简单的 shell script 练习: (read -p  date)3. 善用判断式:3.1 利用 test 指令的测试功能3.2 利用判断符号 [ ] 3.3 Shell script 的预设变数($0, $1...)4. 条件判断式:4.1 利用 i

shell学习之变量

一  变量定义 1 显式定义 variable=XXX   没有空格 2 read variable读取 主要写了如下两行代码,读取name和name family read -p "please input your name:"  name read -p "please input your whole name :" name family 运行下 [[email protected] shell]# ./var.sh please input your n

第六章 Shell标准输入、输出和错误

文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件. 内核为每个进程维护该进程打开的文件记录表.文件描述符只适应Unix.Linux操作系统. 6.1 标准输入.输出和错误 文件描述符 描述 映射关系 0 标准输入,键盘 /dev/stdin -> /proc/self/fd/0 1 标准输出,屏幕 /dev/stdout -> /proc/self/fd/1 2 标准错误,屏幕 /dev/stderr -