网络推荐



本广告位招租!

推荐给好友 上一篇 | 下一篇

bash变量赋值及字符串的操作

(S:YG7EY6EE~8}^Bash中的变量BSD爱好者乐园+mP1y[ H%Fs/B h
1.用户定义的变量
#_*L Qq&CN用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字.BSD爱好者乐园;S8c%Ig3DU2`(B
与其它UNIX名字一样,变量名是大小写敏感的.BSD爱好者乐园u;E2]E5\ Zk
对于变量,用户可按如下方式赋值:BSD爱好者乐园 b S/\)V;e:`+n+S/|'M
name = value
F-d4Mh7J1v在引用变量时,需在前面加$符号,用户也可以在变量间进行相互赋值,如:BSD爱好者乐园m|o9Z[ du-P
(前面的$是命令提示符)

;LW1^Yf:gT1PE8r9iBSD爱好者乐园jm i)SX3@0@%eB"n&E

$ JOHN = john
hD*E-o&Yo:M$ NAME = $JOHNBSD爱好者乐园(B0?(~|t
$ echo Hello $NAMEBSD爱好者乐园/z-k1DuX7o p CP
Hello john

9a$~n.@)ivhBSD爱好者乐园-_W^^^m

也可以用变量和其他字符组成新的字,这时可能需要把变量用{}括起,如:

?4}!MZ dPQy nBSD爱好者乐园 O/o!E-Z#G

$ SAT = SaturBSD爱好者乐园T$n#L6f-st\*tZ6~
$ echo Today is ${SAT}day
.@J{ h%]E!N0K)yUToday is Saturday

Y wu%A rd/w9i

p&xNO6t#U)Nb对于未赋值的变量,Bash以空值对待,用户也可以用unset命令清除给变量BSD爱好者乐园"avP#Wyhx'Yu
赋的值.BSD爱好者乐园5jIQ y_ Zn#~

e)x:F5^S-SL6R:XBash中还可以使用数组变量,其赋值有两种:BSD爱好者乐园+r~E/Hw

BSD爱好者乐园R]MOE8l

(1) name[index] = value
2gk fjG(2) name = (value1 ... valuen) 此时下标从0开始BSD爱好者乐园+f7_(a1~KOfo[

BSD爱好者乐园!d.TT D\

数组下标的范围没有任何限制,同时也不必使用连续的分量.BSD爱好者乐园4_K3~-|S6FJ

BSD爱好者乐园:RP jKg"~&_k

Bash中关于变量的内建命令有:

S,v v Mh8P O:R_BSD爱好者乐园%})z {y!t&z*c

(1) declare和typeset.两者具有一样的功能.其选项有:BSD爱好者乐园g|7bs b}!i
[-/+]a 设置/撤消变量的数组属性
!aGX*yYg[-/+]i 设置/撤消变量的整数属性BSD爱好者乐园LwQ0S+Fn9{(@2p#~ n
[-/+]r 设置/撤消变量的只读属性BSD爱好者乐园.R'v1f6r-_W7K/o$w
[-/+]x 设置/撤消变量的输出属性
KFb {G HE-p var 显示变量属性BSD爱好者乐园g3o!Q&nl/vT N
(2) export和local.BSD爱好者乐园.N @I/|lC$[;v*yYC
export把变量输出到环境中,用法为:
pM6M-a6s4Dexport nameBSD爱好者乐园Rw9^i$S;j:CDPl5A
export name = value

xA.yMj5PD:L1@ DBSD爱好者乐园 lM9z_gj

这里需要简单介绍一下export的作用:当Bash shell执行一个BSD爱好者乐园1miMv2u)n
程序时,将首先为该程序建立一个新的执行环境,称为子shell,
cV5N@4l bP在Bash Shell中变量都是局部的,即它们只是在创建它们的子BSD爱好者乐园&yTi#Cwn e:F
Shell中是有意义的,使用export后,变量被设置为全局变量,这
J)n o|Fv7E时可以被其它子Shell所识别

T8To.{1W~.H FP

t? KX d v Nlocal标记变量为局部的(如只能被函数内部使用),用法为:
7n,Bmf4c]d-Mlocal name
G(v~i@clocal name = value
!GTBz'gT b(3) readonly.
;LTK LU指定变量为只读,执行后,改变量不能被再次赋值,用法为:
nKk&Zw;A_readonly nameBSD爱好者乐园lL%yL5W C|

BSD爱好者乐园%v$z%m,\z QN8zBF

2.位置变量或Shell参数
1c4Bx3C,T+l)XH0b'wBash Shell在解释用户命令时,将把命令行的第一个子作为命令,而其它字作为
BA2W hJ WC$\参数通过位置变量传递给程序.$1,...,$9分别代表第一,...,九个参数.其中1-9BSD爱好者乐园5DD` a!sTL2R6]
是真正的参数名,"$"符只是用来标识变量的替换.
#}+i!UZ$cy5Z)Hc7U位置变量$0指命令对应的可执行名.BSD爱好者乐园c0wa`7_g&FL4@&Y
其它的还有:
:`9}G?7z7Rk%tp;@*Z$# 送给命令的参数个数
'?'Z1cR[C0u$@ 所有的参数,每个用双括号括起BSD爱好者乐园7l pq-{~
$* 所有的参数,用双括号括起
bvb d8rS3.与Shell有关的变量
x+j6@4S+lw(1) Shell自身设置的一些常用变量:BSD爱好者乐园-J|8p%_C np+OH
LINENO 正在执行的命令在脚本中的行号BSD爱好者乐园6m4G!Ys:KB
PWD 用户当前目录的全名
`O)g1k*DwHOLDPWD 最近一次执行cd之前,用户当前目录的全名
"sk,b/EjWPPID 父进程IDBSD爱好者乐园w e)aEH `
$ 当前进程IDBSD爱好者乐园 Hma(]]w nc@
RANDOM 随机数(范围0-32767)
J!i.` f*vCeSECONDS Bash Shell的运行时间,单位是秒BSD爱好者乐园JD @_1x$gqH0Nl9e
REPLY select和read命令使用,以后会讲到BSD爱好者乐园AO+i"r"]x!No@ g
OPTARG
6jE{smVn1@}mORTIND 这两个变量由getopt命令设置BSD爱好者乐园5Zx)Jt![6}B8[p7_2@
UID 当前用户的User IDBSD爱好者乐园Z?$\:^~YNwb
_ 上一条命令使用的最后一个参数BSD爱好者乐园 S W&Rs9x.k nJ d
(2) 影响Shell行为的一些常用环境变量:
?"K2Y&a)xi_ T0yPATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是,
-S6Iwj6Gv当前目录不在系统路径里BSD爱好者乐园9v\Z/u+s` E-J
HOME 用户home目录的路径名,是cd命令的默认参数
3GQ6b}xCOLUMNS 定义了命令编辑模式下可使用命令行的长度BSD爱好者乐园._m lV9Og&~ e6j
EDITOR 默认的行编辑器BSD爱好者乐园 l!ntR b,hM_zuF
VISUAL 默认的可视编辑器
o\mt-i^2K DFCEDIT 命令fc使用的编辑器BSD爱好者乐园o G+N&c8F;g"AF
HISTFILE 命令历史文件BSD爱好者乐园 Qb].t#?F0r D
HISTSIZE 命令历史文件中最多可包含的命令条数BSD爱好者乐园?5aXGJ9b,evF&UO
HISTFILESIZE 命令历史文件中包含的最大行数
8H&LZ.voSHB`_QIFS 定义SHELL使用的分隔符
1k Uh#jbr2_ozLOGNAME 用户登录名
@j}5Wv6v'U$h|F2EMAIL 指向一个需要SHELL监视其修改时间的文件.当该文件修改后,
\P9r ?q#_&JhSHELL将发消息You hava mail给用户BSD爱好者乐园z [7W2RH sUDG]
MAILCHECK SHELL检查MAIL文件的周期,单位是秒
N.X9S;tm&mMAILPATH 功能与MAIL类似.但可以用一组文件,以冒号分隔,每个文件后BSD爱好者乐园[3oE I#@O
可跟一个问号和一条发向用户的消息BSD爱好者乐园~ l?.n/U
SHELL SHELL的路径名
3g?+RI.b g(PTERM 终端类型
K4g"e([%D P.Pg~TMOUT SHELL自动退出的时间,单位为秒,若设为0则禁止SHELL自动退出BSD爱好者乐园*\0t;r1E7QG
PROMPT_COMMAND 指定在主命令提示符前应执行的命令
n3MZg lPS1 主命令提示符
CHY,CCYx|1g6j ~]iPS2 二级命令提示符,命令执行过程中要求输入数据时用
Ak;p7t.m0w"UPS3 select的命令提示符
4m2w6h;F#_M/I3TPS4 调试命令提示符
`S3_Vq2p X{MANPATH 寻找手册页的路径,以冒号分隔BSD爱好者乐园7NG$Qt(r1K
LD_LIBRARY_PATH 寻找库的路径,以冒号分隔BSD爱好者乐园,L Ml7Pm"O0I+G

o ^7\"n4V+iu5qbash变量赋值
J/Y4C5B O `caN

ox#ra!{ eA}#x K例子:经常在
configure脚本中,会出现以下类似的语句,都表示什么意思呢?BSD爱好者乐园1g |v4S]

if test -n "${ZSH_VERSION+set}"; then

@x6E8t I

$b@;iD-q1Pm

NGY4^"B J!AVX:O v-Uuac_env_build_alias_set=${build_alias+set}BSD爱好者乐园x}[1|`!T;r ?HNRQ

Wy[:Rt0~.c1?ktest "${ac_configure_args0+set}" != set

cv^9au

0Hqzu4c-W答案及扩展:BSD爱好者乐园&u8SR?'S6fi|*}8U

变量赋值方式BSD爱好者乐园BA~o?/x1k

str没有赋值BSD爱好者乐园/hoX@Q)z si

str为空字符串BSD爱好者乐园 t(a/b-r5YL~H

str为非空字符串

4a%u*iJ8R0I L0`

备注BSD爱好者乐园4{'T.\x![

var=${str-expr}var=exprvar=$strvar进行设置
var=${str+expr}var=$strvar=exprvar进行设置,varstr要不都取值,要不都不取值。虽然取值不同
var=${str=expr}str=expr
9Wpkvs-r5W,pvar=expr
str不变BSD爱好者乐园5a+])D:rWRa%ycH
var=$str
varstr进行设置,

bD'F?X+ZeS&E

VR'u wia*F5M [%D"I

L$K+Mqtz&~#t {i7hdvarstr保持一致

b+|:G ~5oz
var=${str?expr}expr输出至stderrvar=strvar进行设置
var=${str:-expr}var=exprvar=$str
var=${str:+expr}var=var=expr
var=${str:=expr}str=expr
~Ws'VV2Avar=expr
str不变
(?7ju'G+dVvar=$str
var=${str:?expr}expr输出至stderr

_!_,u;`]Bash字符串的操作BSD爱好者乐园6R]Z7d u QO

k o(}vMe ](一)字符串的替换BSD爱好者乐园$l:l F2Puak Sj
(1)BSD爱好者乐园[1@+rf*^'pb H
${变量1/查找字符/替换字符}
3w$X+Fz^(说明一下,这个操作中除了第一个参数是变量外其它两个都是字符;还有一点就是这个操作并不是把“变量1”中的字符替换了,详见例子)BSD爱好者乐园 M;Za7[J+C
例:
6i3_ Im*[+]9RFIstr1=abcABCabc123ABC
E3A.wbm/aecho ${str1/bcA/aaa}#这里的abc和aaa都是字符串,而str1是变量,并且这个操作过后str1里的字符串长度不会减少,只是产生了一个新的字串。
!lv Aoz#c(2)
Tsd?X'Q${变量1/#查找字符/替换字符}
9O/Mg&k;w6r-[5?w(说明一下,这个操作上和面的是一样的,只不过是从左边开始匹配,并且必须从左边第一个字符开始)
2s3g:C,?hu IU;l#|例:
akO`1zC.Nfecho ${str1/#bcA/aaa}#这个例子中并不会把bcA换成aaa因为b不是左边第一个开头字符BSD爱好者乐园 E}Mdw6?N
echo ${str1/#abc/aaa}#这样才行
oeL*i4cw(3)
$Md%FS;R J+`d#Nj${变量1/%查找字符/替换字符}
lFGo:S(F z'e(与(2)相反,是结尾最后一个字符要匹配才行)BSD爱好者乐园/l:OupaO]9A'v7Vk-Z
例:BSD爱好者乐园TD h1`.a:M-j
echo ${str1/%3ABC/aaa}#abcABCabc12aaaBSD爱好者乐园T;r Of!}+YWV
(3)
5?'C@:ZySj)Z${变量1//查找字符/替换字符}BSD爱好者乐园6u [`yk f2h(l]
全部替换
g^#u)x%N5J(二)取子串
!K0?+~2v"M`z6N(1)${变量1:位置}BSD爱好者乐园q&gA;?q d7Ee%t
(说明一下,默认是从左边开始,如果“位置”为负数,则是从右边的第“位置”个字符开始,并且第一个位置为0;从“位置”开始取子串到最后)BSD爱好者乐园"?;wDd*jqC
例:BSD爱好者乐园!Xaz.K~u[
str1=abcABCabc123ABC
F!cs0p)YIecho ${str1:(-3)}#会输出ABC
"?r&uI%S NqV2to(2)${变量1:开始位置:结束位置}BSD爱好者乐园#X2WL fx
(3)如果“变量1”为“*”或“@”,“位置”所表示的是第几个参数。BSD爱好者乐园,RL"{#V&T$}'F
(三)字符串移动
[/G(L nQtUH:p@#O7?R(1)${字串#匹配字串}BSD爱好者乐园-Q(c0A!xx.MU g3u"o
(说明一下,这个是从左边第一个开始匹配,剥去最短“匹配字串”)
Cc@4wQ7eQ{例:
f;F8QEvfstr1=abcABCabc123BSD爱好者乐园o!e5t%i1p%Z N(L~
echo ${str1#a*c}#输出ABCabc123BSD爱好者乐园 D$f`jf @
(2)${字串##匹配字串}BSD爱好者乐园Dn&y%E/QZf8V9t3z
(说明一下,这个是从左边第一个开始匹配,剥去最长“匹配字串”)BSD爱好者乐园{2v^0~ {O5P1m*V5V
str1=abcABCabc123BSD爱好者乐园]Kd8[L-V5J
echo ${str1#a*c}#输出123BSD爱好者乐园G,X2z#o*m*wy
echo ${str1#b*c}#输出abcABCabc123,因为没有从第一个开始匹配
X{6Yd-cI2|x u(3)${字串%匹配字串}
c@)R3zH:c&Rl%A(4)${字串%%匹配字串}
? l Yv9C-F1Np(说明一下,这与上面的(1)(2)是正好相反的,是从最后一个开始匹配的)
Tt:MYzcE\1o+fX4T(四)字符串长度BSD爱好者乐园]2E8q*fAZA
${#字串}
"R Pb3v.|!o例:
;VX9iC1i.JSstr=abcdefgBSD爱好者乐园Ej OL)cH
echo ${#str}#输出7

:Q0i~&nvN
[重要提醒]对本篇资料有疑问,请到论坛讨论,尽量使文章准确无误>>>
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: bash 变量
 

评分:0

我来说两句

seccode