Linux Shell——变量

分类

本地变量

相当于Java中的局部变量,只存在于当前shell。

环境变量

所有应用程序都有效。

位置参数

用于向shell脚本传递参数,只读的。

变量赋值和替换

变量是某个值的名称,引用变量值就成为变量替换,$符号是变量替换符号,如variable是变量名,则$variable就表示变量的值。

变量赋值的两种格式

variable=value
${ variable=value }

variable1=33
echo ${variable1}
33
echo $variable1
33
variable2="hello world"
echo $variable2
hello world

变量赋值中使用另一个变量

variable2="hello world"
variable3="We saying $variable2"
echo $variable3
We saying hello world

使用unset可以清除变量的值

unset 变量名

 unset variable1
echo $variable1
# 空白行
变量赋值的模式
模式意义
variable=value将value值赋值给variable
variable+value对已赋值的variable重设其值
variable?value或者variable:?value对未赋值的variable,显示系统错误信息
variable:=value对未赋值的variable将value值赋值给它
variable:-value对未赋值的variable,将value值赋值给它,value值不存储到variable对应的地址空间
# ":="和":-"的区别
colour=black
echo "The Backgroud is ${colour:=blue}"
The Backgroud is black
echo "The Backgroud is ${colour:-blue}"
The Backgroud is black
# 因为它们都不能对已经赋值的变量再进行赋值

unset colour 
echo "The Backgroud is ${colour:-blue}"
The Backgroud is blue
echo $colour    # 未对变量真正赋值
# 空白

echo "The Backgroud is ${colour:=blue}"
The Backgroud is blue
echo $colour	# 对变量赋值
blue

":?“和”?"可用于测试变量是否被赋值,若变量未赋值,Shell提示错误信息;

echo "The Background is ${colour:?blue}"
-bash: colour: blue
echo "The Background is ${colour?blue}"
-bash: colour: blue

设置变量只读

colour=blue
readonly colour #将colour设置为只读
colour=grey
-bash: colour: 只读变量
无类型的Shell脚本

Shell脚本变量是无类型的,不支持浮点型,只支持整型和字符型,默认情况下是字符型。如果变量只包含数字,则shell认定该变量是数值型,反之,认为是字符串。

b=xx09
[root@localhost ~]# echo "b=$b"
b=xx09
[root@localhost ~]# declare -i b
[root@localhost ~]# echo "b=$b"
b=xx09
[root@localhost ~]# let "b+=1"
[root@localhost ~]# echo "b=$b"
b=1

字符型变量的数值为0,初值为空,而且可以不预先定义变量而直接使用它,数值型初值为0。

环境变量

定义和清除环境变量

ENVIRON-VAEIABLE=value  #环境变量赋值
export ENVIRON-VARABLE	#声明环境变量

env 列出系统中的环境变量

PWD和OLDPWD
用来记录当前路径,OLDPWD用来记录旧的工作目录,即用户所出的前一个目录
PATH

在PATH中添加新目录

export PATH="/new directory":$PATH

HOME

记录当前用户的根目录

SHELL

保存默认的Shell值,默认值为/bin/bash

USER和UID

USER表示已经登录用户名,UID表示已登录的用户的ID。

echo $USER $UID
root 0

PPID

PPID是创建当前进程的进程号,当前进程的父进程号。

PS1和PS2

PS1是用于设置一级Shell提示符的环境变量,也称为主提示符字符串。

echo $PS1
[\u@\h \W]\$

\u表示当前用户名
\h表示主机名
\W当前目录名
$表示#号

echo $PS1
[\u@\h \W]\$
[root@localhost ~]# PS1="[\u\@\H \w \#]\$"
[root06:46 下午localhost.localdomain ~ 44]$

PS2用于设置二级Shell提示符的环境变量,当在Shell中输入不完全命令时,将出现二级提示符,二级提示符即为PS2变量的值

echo "E-Commence
> "
E-Commence

PS2="\s >"
[root@localhost ~]$echo "E-Commence
-bash >

IFS

用于指定Shell域分隔符,默认为空格

几个环境变量配置文件

由于Linux环境变量较多,系统管理员通常不会利用export逐个设置环境变量,而是将export命令放置在特殊的配置文件之中。

$HOME/.bash_profile

当某个Linux用户登录时,Shell会自动执行这个文件,如果不存在,则会默认执行/etc/profile

将自定义的环境变量添加到文件之后,使用这两条命令使之生效:

. .bash_profile或者source bash_profile

source和shell执行的区别:

source新环境变量在当前shell及其他子shell中生效。使用shell执行只在子shell中生效。

位置参数

用于从命令行向shell脚本传递参数,$1表示第一个参数,$2表示第二个参数以此类推;

特殊位置参数意义
$#传递到脚本的参数数量
$*和$@传递到脚本的所有参数
$$脚本运行的进程号
$?命令退出状态,0表示没有错误,非0表示有错误

引用

引用是指将字符串用引用符号引起来,以防止特殊字符被Shell脚本重解释为其他意义。

符号名称意义
" "双引号引用除美元符号($)、反引号(`)和反斜线()之外的所有字符
’ ’单引号应用所有字符
``反引号将反引号中的内容解释为系统命令
|反斜线转义符,屏蔽下一个字符的特殊意义
全引用和部分引用

#!/bin/bash

variable=2010
echo "$variable"
echo $variable

variable1="X   Y    Z"
echo "$variable1"
echo $variable1       

chmod u+x double.sh
./double.sh 
2010
2010
X   Y    Z
X Y Z
      
#单引号和双引号区别
echo "$PWD"
/home/demo
echo '$PWD'
$PWD

命令替换

是指将命令的标准输出作为值赋值给某个变量

[root@localhost demo]#echo `date`
2020年 01月 03日 星期五 19 37 54 CST
dirlist=`ls -l`  #命令替换
[root@localhost demo]# echo $dirlist   # 换行符删除
总用量 48 -rw-r--r-- 1 root root 58 1月 2 23:24 argv.awk -rwxr--r-- 1 root root 80 1月 2 23:17 array.awk -rwxr--r-- 1 root root 998 1月 3 00:43 count_word.sh -rwxr-xr-x 1 root root 2027 1月 2 18:00 dialer-service.conf -rwxr--r-- 1 root root 117 1月 3 19:31 double.sh -rwxr--r-- 1 root root 249 1月 2 23:35 findphone.awk -rwxr--r-- 1 root root 75 1月 2 22:45 pass.awk -rwxr--r-- 1 root root 50 1月 2 19:19 scr.awk -rwxr-xr-x 1 root root 78 1月 2 21:51 src1.awk -rw-r--r-- 1 root root 164 1月 2 21:52 sturecord -rw-r--r-- 1 root root 1500 1月 3 00:14 tmp -rw-r--r-- 1 root root 1500 1月 3 00:18 tmp1
[root@localhost demo]# echo "$dirlist"	# 换行符保留
总用量 48		
-rw-r--r-- 1 root root   58 1月   2 23:24 argv.awk
-rwxr--r-- 1 root root   80 1月   2 23:17 array.awk
-rwxr--r-- 1 root root  998 1月   3 00:43 count_word.sh
-rwxr-xr-x 1 root root 2027 1月   2 18:00 dialer-service.conf
-rwxr--r-- 1 root root  117 1月   3 19:31 double.sh
-rwxr--r-- 1 root root  249 1月   2 23:35 findphone.awk
-rwxr--r-- 1 root root   75 1月   2 22:45 pass.awk
-rwxr--r-- 1 root root   50 1月   2 19:19 scr.awk
-rwxr-xr-x 1 root root   78 1月   2 21:51 src1.awk
-rw-r--r-- 1 root root  164 1月   2 21:52 sturecord
-rw-r--r-- 1 root root 1500 1月   3 00:14 tmp
-rw-r--r-- 1 root root 1500 1月   3 00:18 tmp1

尽管$()与反引号在命令替换上是等价的,但是,$()的命令替换是可以嵌套的

firstlinelength=$(expr length "$(sed -n '1p' sturecord)")
echo $firstlinelength 
39
echo \\  #输出转义符
\
[root@localhost demo]# echo `echo \\`  #输出空白行

[root@localhost demo]# echo $(echo \\) # 输出单斜线符
\

与其他语言结合

#include <stdio.h>
main(){
	printf("This is the output from C program.*");
}


gcc -o simpleC simpleC.c 
testc=`./simpleC`
echo $testc 
This is the output from C program.*
转义

反斜线符号表示转义,当反斜线后一个字符有特殊意义时,需要转移。

字符串处理

${#…}和expr length

计算字符串长度

string="Speeding up small jobs in Hadoop"
[root@localhost ~]# echo ${#string}
32
[root@localhost ~]# expr length "$string"
32

expr index

匹配字符串中指定子串第一次出现的位置,若匹配不到则返回0;

string="Speeding up small jobs in Hadoop"
[root@localhost ~]# expr index "$string" job
19
[root@localhost ~]# expr index "$string" hello #hello没有完全匹配,返回第一个匹配字符h的位置
3

expr match

expr match $string $substring

在string的开头匹配子串,返回匹配到的子串长度,若string开头匹配不到,则返回0,substring可以是子串也可以是表达式。

string="Speeding up small jobs in Hadoop"
[root@localhost ~]# expr match "$string" S.*
32
[root@localhost ~]# expr match "$string" Spe
3
[root@localhost ~]# expr match "$string" small
0

抽取子串

#{string:position}

从string的字符串的第$position个位置开始抽取子串;

#{string:position:length}

从名为$string的字符串的第$position位置开始抽取长度为$length的子串。

 string="Speeding up small jobs in Hadoop"
[root@localhost ~]# echo ${string:0}  # 0表示抽取整个串
Speeding up small jobs in Hadoop
[root@localhost ~]# echo ${string:10} # 从标号10开始抽取
p small jobs in Hadoop
[root@localhost ~]# echo ${string:9:8} # 从标号9开始抽取8个
up small

从右边开始数

#{string:-position}

#{string:{position}}

expr substr $string $position $length

正则表达式抽取:

expr match $string '\($substring\)'

expr $string : '\($substring\)'

another_string="20091114 Reading Hadoop"
[root@localhost ~]# expr match "$another_string" '\([0-9]*\)'
20091114
[root@localhost ~]# expr match "$another_string" : '\([0-9]*\)' 
expr: 语法错误
[root@localhost ~]# expr "$another_string" : '\([0-9]*\)'
20091114

抽取string结尾子串:

expr match $string '.*\($substring\)'

expr $string : '.*\($substring\)'

expr match "$another_string" '.*\(......\)'
Hadoop
expr  "$another_string" : '.*\(......\)'
Hadoop

删除子串

${string#substring} #删除string开头处于substring匹配的最短子串

${string##substring} #删除string开头处与substring匹配的最长子串

echo ${another_string#2*1}
114 Reading Hadoop
echo ${another_string##2*1}
4 Reading Hadoop

从结尾处开始删除

${string%substring} #删除匹配最短

${string%%substring} #删除匹配最长

替换子串

${string/substring/replacement} #替换第一次与substring匹配的子串

${string//substring/replacement} #替换所有匹配的子串

string="20091115sunday20091116tomorrpw"
[root@localhost ~]# echo ${string/111/zzzz}
2009zzzz5sunday20091116tomorrpw
[root@localhost ~]# echo ${string//111/zzzz}
2009zzzz5sunday2009zzzz6tomorrpw


#正则匹配替换
echo ${string/0*y/zzzz}
2zzzz20091116tomorrpw

#替换开头
${string/#substring/replacement}
#替换结尾
${string/%substring/replacement}

有类型的变量

Shell变量一般是无类型的,但是bash shell提供了declare和typeset两个命令用于指定变量类型,另个命令是完全等价的。

declare [选项] 变量名

选项名意义
-r只读
-i整型数
-a数组
-f显示此脚本前定义过的所有函数名及内容
-F仅显示此脚本前定义多的所有函数名
-x将变量生命为环境变量

#!/bin/bash

variable1=2009
variable2=$variable1+1
echo "variable2=$variable2"  #以字符型处理variable2

let variable3=$variable1+1
echo "variable3=$variable3"  #let命令以整型数处理variable3


declare -i variable4         #将variable4定义为整型
variable4=$variable1+1
echo "variable4=$variable4"

简介变量引用

如果一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就成为简介变量引用:

variable1=variable2
variable2=value
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值