分类
本地变量
相当于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