shell变量定义、引用、变量测试、截取与替换

shell中的变量

1.变量的定义

变量用于保存有用的信息,如路径、文件名,数字等,linux用户使用变量定制其工作的环境,使系统获知用户相关的配置。变量本质上是存储数据的一个或多个计算机的内存地址。变量是Shell传递数据的一种方法,简单理解:用一个固定的字符串去表示不固定的内容,便于后续引用。

2.变量的分类

1.用户自定义变量:由用户自己定义,修改和使用的变量
2.shell环境变量:用于设置shell的运行环境,只要少数的环境变量可以修改其值。环境变量也是可以自定义的。
3.位置参数变量:通过命令行给脚本传递参数,变量名已经固定,不能自定义。
4.内部参数变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

3.变量定义与实践

说明:变量名只能包括大小写字母(a-z和A-Z)、数字(0-9)、下划线(_)等符号,并且变量名不能以数字开头,否则视为无效变量,变量区分大小写,变量名最好是有一定的含义。

1.变量赋值

变量是某个值的名称,引用变量值就称为变量替换,$符号是变量替换符号,例如:variable变量名,那么$variable就是变量的值。
变量赋值有两种格式:

variable=value
variable=`command` 注意:command是可以执行的命令

说明:等号的两边不可以有空格,如果value值中包含有空格,则需要使用双引号括起来,没哟空格时也是可以使用引号,效果和不用一样。

2.定义变量,赋值并使用

说明:使用变量前首先进行变量的声明,声明并赋值完成后才可以被引用。

[root@m01 ~]# m="we ai xiong"
[root@m01 ~]# echo $m
we ai xiong
[root@m01 ~]# n=1
[root@m01 ~]# echo $n
1
[root@m01 ~]# a=`echo 1`
[root@m01 ~]# echo $a
1
[root@m01 ~]# name="we ai xiong"
[root@m01 ~]# echo ${name}
we ai xiong

变量引用的方法有两种方式:

1.$variable     #$变量名
2.${variable}  #${变量名}

两种引用方式,在不同的环境中可以进行不同的选择,如果变量后面有内容,就必须使用第二种引用方式,这里建议还是统一使用第二种方式比较保险。

3.变量的清除和只读

当变量不在需要的时候可以通过unset进行清除,具体使用格式如下:

unset  variable #variable为变量名

有时会遇到一些变量不想被重新赋值的情况。这样的变量可以将设置为只读变量,使用readonly命令的具体设置格式如下:

variable=value       #先声明变量并赋值
readonly variable   # 然后将变量设置为只读

举例如下:

[root@m01 ~]# name="we ai xiong"
[root@m01 ~]# unset name
[root@m01 ~]# echo ${name}

[root@m01 ~]# name="we ai xiong"
[root@m01 ~]# echo ${name}
we ai xiong
[root@m01 ~]# readonly name
[root@m01 ~]# unset name
-bash: unset: name: cannot unset: readonly variable
[root@m01 ~]# name="xiao pang xiong"
-bash: name: readonly variable
以上可以看出变量被设置只读后,是无法清除和重新赋值的

4.位置参数变量

位置参数变量是一种特殊的shell变量,用于从命令行向脚本中传递参数。$0表示脚本的名称,$1表示第一个参数,$2表示第二个参数,依次下去代表第几个参数,但是从底十个参数位开始表示方法有所改变,需要加大括号,例如:${10},${11}....
举例说明如下:

测试脚本如下:
[root@m01 ~]# vim variable.sh
#!/bin/bash
echo "#当前shell脚本的文件名: $0"
echo "#第1个shell脚本位置参数:$1"
echo "#第2个shell脚本位置参数:$2"
echo "#第3个shell脚本位置参数:$3"
测试结果如下:
[root@m01 ~]# sh variable.sh 1 2 3
#当前shell脚本的文件名: variable.sh
#第1个shell脚本位置参数:1
#第2个shell脚本位置参数:2
#第3个shell脚本位置参数:3

5.内置参数变量

内部参数分为两类:

1.命令行参数

$@   #表示传递给脚本或函数的所有参数。被双引号引用时,与$*有所不同。
$*   # 表示传递给脚本或函数的所有参数
$0   # 表示命令行输入的脚本名称
$#   # 表示命令行上的参数个数
注意: $@和$*不加引号时,二者都是返回传入的参数,但加了引号后$*把参数作为一个字符串整体(单字符串)返回, $@把每个参数作为一个一个字符串返回

2.与进程相关的内部参数

$?   # 表示上一个命令执行的返回结果
$$   # 表示当前程序运行的 PID 
$!   # 表示获取上一个在后台工作进程的PID
$_   # 表示获取在此之前执行命令或脚本的最后一个参数

举例说明如下:

测试脚本如下:
[root@m01 ~]# vim variable1.sh 
#!/bin/bash
echo "#当前shell脚本的文件名: $0"
echo "#第1个shell脚本位置参数:$1"
echo "#第2个shell脚本位置参数:$2"
echo "#第3个shell脚本位置参数:$3"
echo "#所有传递的位置参数是: $*"
echo "#所有传递的位置参数是: $@"
echo "#总共传递的参数个数是: $#"
echo "#当前程序运行的 PID 是: $$"
echo "#上一个命令执行的返回结果: $?"                                                                                                          
测试结果如下:                                                               
[root@m01 ~]# sh variable1.sh we ai xiong
#当前shell脚本的文件名: variable1.sh
#第1个shell脚本位置参数:we
#第2个shell脚本位置参数:ai
#第3个shell脚本位置参数:xiong
#所有传递的位置参数是: we ai xiong
#所有传递的位置参数是: we ai xiong
#总共传递的参数个数是: 3
#当前程序运行的 PID 是: 8661
#上一个命令执行的返回结果: 0
这里举例展示了位置参数,内部参数的含义和输出。

下面举例说明$@和$*加双引号的的差别:

测试脚本如下:
[root@m01 ~]# vim test.sh
#! /bin/bash
test() {
echo "未加引号,二者相同"
echo $*
echo $@
echo "加入引号后对比"
for N in "$*"
do
echo $N
done

echo "----------"
for N in "$@"
do
echo $N
done
}
test 123 456 789  
测试结果如下:                                                                                                                                                                                
[root@m01 ~]# sh test.sh
未加引号,二者相同
123 456 789
123 456 789
加入引号后对比
123 456 789
----------
123
456
789

6.系统环境变量示例,在当前Shell和子Shell有效

1.定义环境变量:export 变量,将自定义变量转换成环境变量。 [root@m01 ~]# echo $user
we ai xiong
[root@m01 ~]# vim user.sh
#!/bin/bash
echo $name

[root@m01 ~]# sh user.sh              #执行脚本时,会调用另一个bash执行,就访问不到$user的值。
[root@m01 ~]# export user="we ai xiong"  #将变量转换为环境变量      
 [root@m01 ~]# sh user.sh  #再次执行脚本 qiudao
we ai xiong
  #注意:  使用export可以在当前用户的所有环境生效。  将export定义变量写入/etc/bashrc,对所有用户永久生效。  将exprot定义变量写入.bashrc,只对该用户永久生效。

2.使用系统已定义好的环境变量

测试脚本:
[root@m01 ~]# cat env.sh
#!/bin/bash
echo "用户的家目录: $HOME"
echo "当前主机名是: $HOSTNAME"
echo "当前所在目录: $PWD"
echo "当前连接服务器使用的地址和端口是: $SSH_CONNECTION"
测试结果:
[root@m01 ~]# sh env.sh
用户的家目录: /root 
当前主机名是: m01 
当前所在目录: /root
当前连接服务器使用的地址和端口是: 10.0.0.1 62881 10.0.0.61 22

7.命令替换

命令替换是指将命令运行输出的结果作为声明变量的赋值,命令替换在shell编程中经常使用。命令替换的两种格式如下:

variable=`command`
variable=$(command)

注意:第一个是反引号,个人建议使用的话还是使用第二个格式。
举例如下:

[root@m01 ~]# memuse=`ps aux|awk 'NR>1{sum+=$4}END{print sum}'`
[root@m01 ~]# memuse=$(ps aux|awk 'NR>1{sum+=$4}END{print sum}')

8.bash shell内置变量之read

read从标准输入读取字符串信息,传入shell程序内部定义的变量。简单的说就是read命令用来接收键盘输入的内容为变量赋值使用。
使用格式如下:

read [-p "自定义提示信息"] [varirable1 variable2 ....] 

注意:若未指定变量名,则将输入的内容会存入REPLY变量。
举例说明:

测试脚本指定变量:
[root@m01 ~]# vim read.sh
#!/bin/bash
read -p "提示信息:" var
echo "你输入的变量是: $var "
测试结果:
[root@m01 ~]# sh read.sh
提示信息:1  #这里是键入的赋值
你输入的变量是: 1
测试脚本未指定变量:
[root@m01 ~]# vim read1.sh
#!/bin/bash
read -p "提示信息:"
echo "你输入的变量是:$REPLY"
测试结果:
[root@m01 ~]# sh read1.sh
提示信息:1  #这里是键入的赋值
你输入的变量是: 1 

9.引用变量时, 加单双引号和不加引号的区别

说明:

单引号(' '):所见即所得,即输出时会将单引号内的所有内容都原样输出,这称为强引用。
双引号(" "):输出双引号内的所有内容;如果内容中有命令(要反引下)、变量、特殊转移等,会把变量、命令、转义字符解析出结果,然后输出最终的内容,这称为弱引用。
无引号: 与双引号类似,如果出现空格,不会算作一个整体。
举例测试如下:

[root@m01 ~]# hostname=$(hostname)
[root@m01 ~]# echo $hostname
m01
[root@m01 ~]# hostname="$(hostname)"
[root@m01 ~]# echo $hostname
m01
[root@m01 ~]# hostname='$(hostname)'
[root@m01 ~]# echo $hostname
$(hostname)
[root@m01 ~]# user=xpx
[root@m01 ~]# echo $user
xpx
[root@m01 ~]# echo $user is a girle
xpx is a girle
[root@m01 ~]# echo "$user is a girle"
xpx is a girle
[root@m01 ~]# echo '$user is a girlr'
$user is a girlr
[root@m01 ~]# echo $user money is $10000000
xpx money is 0000000
[root@m01 ~]# echo '$user money is $10000000'
$user money is $10000000
[root@m01 ~]# echo "$user money is $10000000"
xpx money is 0000000
[root@m01 ~]# echo $user money is \$10000000
xpx money is $10000000
[root@m01 ~]# echo '$user money is \$10000000'
$user money is \$10000000
[root@m01 ~]# echo "$user money is \$10000000"
xpx money is $10000000

4.shell变量的测试、截取、与替换

1.变量测试

shell是支持变量测试和默认赋值的,当一变量不存在的时候,可以默认的给此变量进行赋值,变量测试和赋值有多重方式,常见有如下四种方式:(更多方式你可以执行man bash 然后搜索Parameter Expansion"查看更多的内容)

${parameter:-word}  #若parameter存在且非空,则值为$parameter;若parameter未定义或为空值,则值为word,但parameter的值不变。
${parameter:=word}  #若parameter存在且非空,则值为$parameter;若parameter未定义或为空,则值为word,且parameter被赋值word。
${parameter:?word}  #若parameter存在且非空,则值为$parameter;若parameter未定义或为空,则输出信息word,并终止脚本。
${parameter:+word}  #若var存在且非空,则值为word;否则返回空值,但parameter的值不变。

举例测试如下:

[root@m01 ~]# parameter=
[root@m01 ~]# echo ${parameter:-word}
word
[root@m01 ~]# echo $parameter
[root@m01 ~]# parameter="wei ai xiong"
[root@m01 ~]# echo ${parameter:-word}
wei ai xiong
[root@m01 ~]# parameter=
[root@m01 ~]# echo ${parameter:=word}
word
[root@m01 ~]# echo ${parameter}
word
[root@m01 ~]# echo ${parameter:?word}
word
[root@m01 ~]# echo ${parameter:+word}
word
[root@m01 ~]# parameter=
[root@m01 ~]# echo ${parameter:+word}

[root@m01 ~]# echo $parameter

[root@m01 ~]# 

2.变量字符串长度、截取与替换


1.获取变量的长度

[root@m01 ~]# url=www.baidu.com   #声明变量并赋值
[root@m01 ~]# echo ${#url}        #获取变量的长度
13

2.从前往后删除变量的内容

[root@m01 ~]# url=www.baidu.com  #声明变量并赋值
[root@m01 ~]# echo ${url}        #输出变量的值
www.baidu.com
[root@m01 ~]# echo ${url#*.}     #从前往后,删除最短匹配
baidu.com
[root@m01 ~]# echo ${url##*.}    #从前往后,删除最长匹配
com

3.从后往前删除变量内容

[root@m01 ~]# url=www.baidu.com  #声明变量并赋值
[root@m01 ~]# echo ${url}        #输出变量的值
[root@m01 ~]# echo ${url%.*}     #从后往前,删除最短匹配
www.baidu
[root@m01 ~]# echo ${url%%.*}    #从后往前,删除最长匹配
www

4.变量内容替换

[root@m01 ~]# url=www.baidu.com  #声明变量并赋值
[root@m01 ~]# echo ${url}        #输出变量的值
[root@m01 ~]# echo ${url/w/W}    #局部替换
Www.baidu.com
[root@m01 ~]# echo ${url//w/W}   #全局替换
WWW.baidu.com

5.shell中同时输出多行信息

两种实现方法如下:

1.使用echo命令

样例如下:
[root@m01 ~]# vim 1.sh 
#!/bin/bash
echo "
第一行
第二行
第三行
"
样例结果:
[root@m01 ~]# sh 1.sh
第一行
第二行
第三行

注意:多行内容中不能出现双引号,否则echo会提前结束,如果确实需要使用转义字符""

2.使用cat命令

样例如下:
[root@m01 ~]# vim 2.sh
#!/bin/bash
cat <

注意:这里使用的是END ,也可以使用其它字符串的例如EOF等,只要上下一致即可,多行内容中不能出现内容为END或其他使用的字符串,否则cat将会提前退出。

你可能感兴趣的:(shell变量定义、引用、变量测试、截取与替换)