shell script中的变量不分数据类型,只有数值和字符串两种值。有几个点需要注意:
- 变量定义时不能加上
$
- 中间不能有空格
- 首字符是字母
- 不能使用关键字和标点符号。
-
~相关的内置变量
variable using ~username user’s home directory ~+ $PWD =~ 正则表达式匹配 ~- 上一个工作路径 eg:
cd -
is same ascd ~-
$变量
变量 作用 $# 输入脚本的参数个数 $1 输入脚本的第1个参数 $n 输入脚本的第n个参数 $$ 脚本的PID $? 最后命令的退出状态 $* 所有的参数 $@ 所有参数,不过和$*有区别 $! Shell最后运行的后台Process的PID $- 使用Set命令设定的Flag一览 $0 Shell本身的文件名 $@
和$*
的区别
例子:
脚本名称叫test.sh,入参三个: 1 2 3
运行test.sh 1 2 3
后
$*
为"1 2 3"
(一起被引号包住)
$@
为"1" "2" "3"
(分别被包住)给变量赋值NULL
var=
,unset var
两种置NULL的方法都是可以的。#! /bin/bash var= echo ${var} let var=1+1 echo ${var} unset var echo ${var}
执行:
[edemon@CentOS workspace]$ ./NULL.sh 2
假设没有给一个变量赋初值(直接使用未定义的变量),那么他的值默认是NULL,可以使用
-z
判断(检测变量的长度是否为0)。[edemon@CentOS workspace]$ cat unsigned.sh #! /bin/bash echo $unsigned if [ -z $unsigned ]; then echo '$unsigned is NULL' else echo '$unsigned is not NULL' fi
[edemon@CentOS workspace]$ ./unsigned.sh $unsigned is NULL
但是,如果对未赋值的变量进行算术操作,那么相当于在0的基础上操作。bash会把不是整数的整数(比如将string当做整数的情况)当做0。。
awk引用外部shell变量
利用
awk -v
可以做到引用外部shell变量,给变量赋值。#! /bin/bash var="hello world" echo "" | awk -v str="$var" '{ print str }'
[edemon@CentOS workspace]$ ./awk.sh hello world
awk运行外部的shell命令
实例:利用awk验证
url.list
的每一行,检查其url是否有效。
- 使用system()
当()内的内容加上引号,awk直接将相关的内容交给shell,当做命令行;当其没有加上引号,awk就将其当做变量处理。 -
$ [edemon@CentOS url]$ awk '{ system("curl -I "$0) }' url.list HTTP/1.1 200 OK Date: Wed, 30 Aug 2017 12:23:56 GMT Server: Apache/2.4.10 (Ubuntu) Last-Modified: Mon, 13 Mar 2017 02:42:01 GMT ETag: "2c39-54a93a7e73a98" Accept-Ranges: bytes Content-Length: 11321 Vary: Accept-Encoding Content-Type: text/html HTTP/1.1 200 OK Date: Wed, 30 Aug 2017 12:23:56 GMT Server: Apache/2.4.10 (Ubuntu) Last-Modified: Mon, 13 Mar 2017 02:42:01 GMT ETag: "2c39-54a93a7e73a98" Accept-Ranges: bytes Content-Length: 11321 Vary: Accept-Encoding Content-Type: text/html curl: (7) couldn't connect to host curl: (7) couldn't connect to host
print command | /bin/bash
-
awk 'BEGIN{}{ print "curl -I " $0 | "/bin/bash" }' url.list
命令结果赋予变量
将command的结果保存在变量中,单反引号和
$()
可能实现我们的目标。[edemon@CentOS workspace]$ arch=`uname -a` [edemon@CentOS workspace]$ echo $arch Linux CentOS.com 2.6.32-642.15.1.el6.i686 #1 SMP Fri Feb 24 13:54:50 UTC 2017 i686 i686 i386 GNU/Linux [edemon@CentOS workspace]$ arch=$(uname -a) [edemon@CentOS workspace]$ echo $arch Linux CentOS.com 2.6.32-642.15.1.el6.i686 #1 SMP Fri Feb 24 13:54:50 UTC 2017 i686 i686 i386 GNU/Linux
切片操作
切片操作,即获取、访问变量的一部分内容。
格式:${varible:startPos:length}
使用实例:[edemon@CentOS workspace]$ cat section.sh #! /bin/bash var="123456789" echo the context from third place: ${var:2} echo the context from third place and its length is 4: ${var:2:4}
[edemon@CentOS workspace]$ ./section.sh the context from third place: 3456789 the context from third place and its length is 4: 3456
当索引值是负数的时候,表示从右向左遍历:
[edemon@CentOS workspace]$ echo $var 123456789 [edemon@CentOS workspace]$ echo ${var:(-2)} 89 [edemon@CentOS workspace]$ echo ${var:(-3)} 789 [edemon@CentOS workspace]$ echo ${var:(-4):2} 67
子串替换
格式: ${varible/object/replaceObj}
[edemon@CentOS workspace]$ var=123456789 [edemon@CentOS workspace]$ echo ${var/1/2} 223456789
支持正则表达式:
[edemon@CentOS workspace]$ echo ${var/[0-9]*/-} -
环境变量与root验证
shell环境变量,可以通过set命令查看。如:
set > set.txt
, 然后查看set.txt即可。
常见的环境变量有:BATH, HOME, ID, UID, SHELL, TERM
等
export
将设置的环境变量告诉shell环境,同时传递给它的子进程。反之,子进程没有办法将自己设置的变量传递给父进程。
利用UID可以判断用户是否是root。(当它是0的时候即为root user)#! /bin/bash if (( $UID == 0 )); then echo Root User else echo Not Root User. fi
间接变量
- eval
eval阅读输入参数,然后将他们拼接起来形成一条命令交给shell处理。
格式:eval [arg ...]
利用eval的特性,可以多级访问shell变量。 -
#! /bin/bash var1=123 one=1 two=2 eval var2=\$var${one} eval var3=\$var${two} echo $var3
在
eval var2=\$var${one}
之后,var2
的值为$var1
。之后才有var3的成功赋值。
- ${!var}
${!var}
用于访问var代表的值(变量)的值 -
[edemon@CentOS workspace]$ cat direct.sh #! /bin/bash a=tmp tmp=b echo ${a} # direct echo ${!a} # indirect [edemon@CentOS workspace]$ ./direct.sh tmp b
IFS
$IFS
内置变量定义着变量的分隔符,默认情况下他是空格(space, tad, newline)[edemon@CentOS workspace]$ cat IFS #! /bin/bash PWD=`pwd` echo $PWD IFS='/' echo $PWD echo '$PWD' echo "$PWD" [edemon@CentOS workspace]$ ./IFS /home/edemon/workspace home edemon workspace $PWD /home/edemon/workspace
subshell
( )
中的命令是属于subshell的,父进程无法访问其中的变量。这有些像C中的局部变量。a=23 ( a=24 ) echo $a # 23