【shell script】变量及其相关操作

网友投稿 819 2022-08-27

【shell script】变量及其相关操作

【shell script】变量及其相关操作

shell script中的变量不分数据类型,只有数值和字符串两种值。有几个点需要注意:

变量定义时不能加上​​$​​中间不能有空格首字符是字母不能使用关键字和标点符号。

~相关的内置变量

variable

using

~username

user’s home directory

~+

$PWD

=~

正则表达式匹配

~-

上一个工作路径

eg: ​​cd -​​​ is same as ​​cd ~-​​

$变量

变量

作用

$#

输入脚本的参数个数

$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/bashvar=echo ${var}let var=1+1echo ${var}unset varecho ${var}

执行:

[edemon@CentOS workspace]$ ./NULL.sh 2

假设没有给一个变量赋初值(直接使用未定义的变量),那么他的值默认是NULL,可以使用​​-z​​判断(检测变量的长度是否为0)。

[edemon@CentOS workspace]$ cat unsigned.sh #! /bin/bashecho $unsignedif [ -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/bashvar="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 OKDate: Wed, 30 Aug 2017 12:23:56 GMTServer: Apache/2.4.10 (Ubuntu)Last-Modified: Mon, 13 Mar 2017 02:42:01 GMTETag: "2c39-54a93a7e73a98"Accept-Ranges: bytesContent-Length: 11321Vary: Accept-EncodingContent-Type: text/htmlHTTP/1.1 200 OKDate: Wed, 30 Aug 2017 12:23:56 GMTServer: Apache/2.4.10 (Ubuntu)Last-Modified: Mon, 13 Mar 2017 02:42:01 GMTETag: "2c39-54a93a7e73a98"Accept-Ranges: bytesContent-Length: 11321Vary: Accept-EncodingContent-Type: text/htmlcurl: (7) couldn't connect to hostcurl: (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 $archLinux 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 $archLinux 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/bashvar="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.shthe context from third place: 3456789the context from third place and its length is 4: 3456

当索引值是负数的时候,表示从右向左遍历:

[edemon@CentOS workspace]$ echo $var123456789[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 Userelse echo Not Root User.fi

间接变量

evaleval阅读输入参数,然后将他们拼接起来形成一条命令交给shell处理。格式:​​​eval [arg ...]​​​利用eval的特性,可以多级访问shell变量。

#! /bin/bashvar1=123one=1two=2eval 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/basha=tmptmp=becho ${a} # directecho ${!a} # indirect

IFS

​​$IFS​​内置变量定义着变量的分隔符,默认情况下他是空格(space, tad, newline)

[edemon@CentOS workspace]$ cat IFS#! /bin/bashPWD=`pwd`echo $PWDIFS='/'echo $PWDecho '$PWD'echo "$PWD"[edemon@CentOS workspace]$ ./IFS/home/edemon/workspace home edemon workspace$PWD

subshell

​​( )​​中的命令是属于subshell的,父进程无法访问其中的变量。这有些像C中的局部变量。

a=23( a=24 )echo $a# 23

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:第一份qnx代码
下一篇:2014最流行的编程语言
相关文章

 发表评论

暂时没有评论,来抢沙发吧~