搜索
简帛阁>技术文章>bash变量赋值及字符串的操作

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

转载:http://www.bsdlover.cn/html/24/n-3224.html

Bash
中的变量

1.用户定义的变量
用户定义的变量有字母数字及下划线组成,并且变量名的第一个字符不能为数字.
与其它UNIX名字一样,变量名是大小写敏感的.
对于变量,用户可按如下方式赋值:
name = value
在引用变量时,需在前面加$符号,用户也可以在变量间进行相互赋值,如:
(前面的$是命令提示符)

$ JOHN = john
$ NAME = $JOHN
$ echo Hello $NAME
Hello john

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

$ SAT = Satur
$ echo Today is ${SAT}day
Today is Saturday

对于未赋值的变量,Bash以空值对待,用户也可以用unset命令清除给变量
赋的值.

Bash中还可以使用数组变量,其赋值有两种:

(1) name[index] = value
(2) name = (value1 ... valuen) 此时下标从0开始

数组下标的范围没有任何限制,同时也不必使用连续的分量.

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

(1) declare和typeset.两者具有一样的功能.其选项有:
[-/+]a 设置/撤消变量的数组属性
[-/+]i 设置/撤消变量的整数属性
[-/+]r 设置/撤消变量的只读属性
[-/+]x 设置/撤消变量的输出属性
-p var 显示变量属性
(2) export和local.
export把变量输出到环境中,用法为:
export name
export name = value

这里需要简单介绍一下export的作用:当Bash shell执行一个
程序时,将首先为该程序建立一个新的执行环境,称为子shell,
在Bash Shell中变量都是局部的,即它们只是在创建它们的子
Shell中是有意义的,使用export后,变量被设置为全局变量,这
时可以被其它子Shell所识别

local标记变量为局部的(如只能被函数内部使用),用法为:
local name
local name = value
(3) readonly.
指定变量为只读,执行后,改变量不能被再次赋值,用法为:
readonly name

2.位置变量或Shell参数
Bash Shell在解释用户命令时,将把命令行的第一个子作为命令,而其它字作为
参数通过位置变量传递给程序.$1,...,$9分别代表第一,...,九个参数.其中1-9
是真正的参数名,"$"符只是用来标识变量的替换.
位置变量$0指命令对应的可执行名.
其它的还有:
$# 送给命令的参数个数
$@ 所有的参数,每个用双括号括起
$* 所有的参数,用双括号括起
3.与Shell有关的变量
(1) Shell自身设置的一些常用变量:
LINENO 正在执行的命令在脚本中的行号
PWD 用户当前目录的全名
OLDPWD 最近一次执行cd之前,用户当前目录的全名
PPID 父进程ID
$ 当前进程ID
RANDOM 随机数(范围0-32767)
SECONDS Bash Shell的运行时间,单位是秒
REPLY select和read命令使用,以后会讲到
OPTARG
ORTIND 这两个变量由getopt命令设置
UID 当前用户的User ID
_ 上一条命令使用的最后一个参数
(2) 影响Shell行为的一些常用环境变量:
PATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是,
当前目录不在系统路径里
HOME 用户home目录的路径名,是cd命令的默认参数
COLUMNS 定义了命令编辑模式下可使用命令行的长度
EDITOR 默认的行编辑器
VISUAL 默认的可视编辑器
FCEDIT 命令fc使用的编辑器
HISTFILE 命令历史文件
HISTSIZE 命令历史文件中最多可包含的命令条数
HISTFILESIZE 命令历史文件中包含的最大行数
IFS 定义SHELL使用的分隔符
LOGNAME 用户登录名
MAIL 指向一个需要SHELL监视其修改时间的文件.当该文件修改后,
SHELL将发消息You hava mail给用户
MAILCHECK SHELL检查MAIL文件的周期,单位是秒
MAILPATH 功能与MAIL类似.但可以用一组文件,以冒号分隔,每个文件后
可跟一个问号和一条发向用户的消息
SHELL SHELL的路径名
TERM 终端类型
TMOUT SHELL自动退出的时间,单位为秒,若设为0则禁止SHELL自动退出
PROMPT_COMMAND 指定在主命令提示符前应执行的命令
PS1 主命令提示符
PS2 二级命令提示符,命令执行过程中要求输入数据时用
PS3 select的命令提示符
PS4 调试命令提示符
MANPATH 寻找手册页的路径,以冒号分隔
LD_LIBRARY_PATH 寻找库的路径,以冒号分隔

bash变量赋值

例子:经常在configure脚本中,会出现以下类似的语句,都表示什么意思呢?

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

ac_env_build_alias_set=${build_alias+set}

test "${ac_configure_args0+set}" != set

答案及扩展:

变量赋值方式

str没有赋值

str为空字符串

str为非空字符串

备注

var=${str-expr} var=expr var=$str 对var进行设置
var=${str+expr} var=$str var=expr 对var进行设置,var与str要不都取值,要不都不取值。虽然取值不同
var=${str=expr} str=expr
var=expr
str不变
var=$str
对var与str进行设置,

var与str保持一致

var=${str?expr} expr输出至stderr var=str 对var进行设置
var=${str:-expr} var=expr var=$str  
var=${str:+expr} var= var=expr  
var=${str:=expr} str=expr
var=expr
str不变
var=$str
 
var=${str:?expr} expr输出至stderr

Bash字符串的操作

(一)字符串的替换
(1)
${变量1/查找字符/替换字符}
(说明一下,这个操作中除了第一个参数是变量外其它两个都是字符;还有一点就是这个操作并不是把“变量1”中的字符替换了,详见例子)
例:
str1=abcABCabc123ABC
echo ${str1/bcA/aaa}#这里的abc和aaa都是字符串,而str1是变量,并且这个操作过后str1里的字符串长度不会减少,只是产生了一个新的字串。
(2)
${变量1/#查找字符/替换字符}
(说明一下,这个操作上和面的是一样的,只不过是从左边开始匹配,并且必须从左边第一个字符开始)
例:
echo ${str1/#bcA/aaa}#这个例子中并不会把bcA换成aaa因为b不是左边第一个开头字符
echo ${str1/#abc/aaa}#这样才行
(3)
${变量1/%查找字符/替换字符}
(与(2)相反,是结尾最后一个字符要匹配才行)
例:
echo ${str1/%3ABC/aaa}#abcABCabc12aaa
(3)
${变量1//查找字符/替换字符}
全部替换
(二)取子串
(1)${变量1:位置}
(说明一下,默认是从左边开始,如果“位置”为负数,则是从右边的第“位置”个字符开始,并且第一个位置为0;从“位置”开始取子串到最后)
例:
str1=abcABCabc123ABC
echo ${str1:(-3)}#会输出ABC
(2)${变量1:开始位置:结束位置}
(3)如果“变量1”为“*”或“@”,“位置”所表示的是第几个参数。
(三)字符串移动
(1)${字串#匹配字串}
(说明一下,这个是从左边第一个开始匹配,剥去最短“匹配字串”)
例:
str1=abcABCabc123
echo ${str1#a*c}#输出ABCabc123
(2)${字串##匹配字串}
(说明一下,这个是从左边第一个开始匹配,剥去最长“匹配字串”)
str1=abcABCabc123
echo ${str1#a*c}#输出123
echo ${str1#b*c}#输出abcABCabc123,因为没有从第一个开始匹配
(3)${字串%匹配字串}
(4)${字串%%匹配字串}
(说明一下,这与上面的(1)(2)是正好相反的,是从最后一个开始匹配的)
(四)字符串长度
${#字串}
例:
str=abcdefg
echo ${#str}#输出7

?最后执行命令或脚本出口状态$当前进程id,脚本中反应脚本PID_初始为shell或脚本路径,而后变成最近执行命令选项或参数!最后一个运行后台进程PIDPPID父进程PIDOLDPWDPWD
以下结论和方法,笔者基于SSIS2010亲测,如有疑问欢迎指正1ExecuteSQLTask不能将数据库返回varchar(max)类型值赋给String变量2ExecuteSQLTask将数据库返
如:thislistthislist2,结果在list改变后list2也改变,这不是我们想要效果第一种:利用JSONparse和JSONstringifythislistJSONparse(JSO
exec函数,可以循环定义、赋值多个变量exec("temp%s1"%1)这段代码意思是,让exec执行temp11。字符串里面%s由‘1'代替了。我们在外面再套一个循环就可以实现对多个变量定义
一、变量定义mysql中变量定义用declare来定义一局部变量,该变量使用范围只能在beginend块中使用,变量必须定义在复合语句开头,并且是在其它语句之前,也可以同时申明多个变量,如果需
首先我们来看看代码,然后我们在说明和解释代码:declarel_deptinteger:20;currtimedate:sysdate;l_namvarchar2(20):to_char(add_mo
变量赋值为换行符在bash中,如果要把变量赋值为换行符,写为'\n'没有效果,需要写为$'\n'。具体举例如下:$newline'\n'$echo$newline\n$newline$'\n'$ec
前言BASH只支持一维数组,但参数个数没有限制。如声明一个数组:declareaarray(其实不用声明,按数组方式直接赋值变量即可,BASH就知道那是数组)一、定义数组1使用[]操作符names
1变量定义!/bin/bashfunctionvar_declare(){localnameyuezhu函数局部变量age25默认全局变量readonlysexfemale全局只读变量}functi
一,简单情况:核心是exec函数,exec函数可以执行我们输入代码字符串。exec函数简单例子:exec('print"helloworld"')helloworld可以很清晰看到,我们给ex