bash的字符串处理工具
字符串切片:
${var:offset:number}
取字符串的子串;
取字符串的最右侧的几个字符:${var: -length}
注意:冒号后必须有一个空白字符;
基于模式取子串;
${var#*word}:
其中word是指定的分隔符;功能:自左而右,查找var变量中所存储的字符串中,第一次出现word分隔符,删除字符串开头至此分隔符之间的所有字符;
${var##*word}:
其中word是指定的分隔符;功能:自左而右,查找var变量中所存储的字符串中,最后一次出现word分隔符,删除字符串开头至此分隔符之间的所有字符;
mypath="/etc/init.d/funtions"
${mypath##*/}:funtions
${mypath#/}:etc/init.d/functions
${var%word*}:
其中word是指定的分隔符;功能:自右而左,查找var变量中所存储的字符串中,第一次出现word分隔符,删除此分隔符至字符串尾部 的所有字符;
${var%%word*}:
其中word是指定的分隔符;功能:自右而左,查找var变量中所存储的字符串中,最后一次出现word分隔符,删除此分隔符至字符串尾部 的所有字符;
=================================
mypath="/etc/inita.d/functions"
${mypath$/*}:/etc/init.d
url=http://www.magedu.com:80
${url##*:}
${url%%:*}
================================
查找替换:
${var/pattern/substi}:
查找var所表示的字符串中,第一次被pattern所匹配到的字符串,将其替换为substi所表示的字符串;
${var//pattern/substi}:
查找var所表示的字符串中,所有被pattern所匹配到的字符串,全部替换为substi所表示的字符串;
${var/#pattern/substi}:
查找var所表示的字符串中,行首被pattern所匹配到的字符串,将其替换为substi所表示的字符串;
${var/%pattern/substi}:
查找var所表示的字符串中,行尾被pattern所匹配到的字符串,将其替换为substi所表示的字符串;
注意:pattern中使用glob风格和通配符;
查找删除:
${var/pattern}:
以pattern为模式查找var字符串中第一次的匹配,并且删除之
${var//pattern}:
以pattern为模式查找var字符串中所有匹配到的字符串,并且删除之
${var/#pattern}:
以pattern为模式查找var字符串中行首所匹配到的字符串,并且删除之
${var/%pattern}:
以pattern为模式查找var字符串中行尾所匹配到的字符串,并且删除之
字符大小写转换:
${var^^}:
把var中的所有小写字符转换为大写;
${var,,}:
把var中的所有大写字符转换为小写;
变量赋值:
${var:-value}:
如果var变量为空或未设置;那么返回value,否则,则返回var变量的值
${var:=value}:
如果var变量为空或未设置;那么返回value,并将value赋值给var变量;否则,则返回var变量的值
${var:+value}:
如果var变量不空;则返回value;
${var:?ERROR_INFO}:
如果var为空,或未设置,那么返回error_info为错误提示;否则,返回var值
高级变量用法
hell变量一般是无类型的,但是bash Shell提供了declare和
typeset两个命令用于指定变量的类型,两个命令是等价的
declare [选项] 变量名
-r 将变量设置为只读属性
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示此脚本前定义过的所有函数名及其内容
-F 仅显示此脚本前定义过的所有函数名
-x 将变量声明为环境变量
-l 将变量值转为小写字母 declare –l var=UPPER
-u 将变量值转为大写字母 declare –u var=lower
间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引
用第二个变量的值就称为间接变量引用
variable1=variable2
variable2=value
variable1的值是variable2,而variable2又是变量名,
variable2的值为value,间接变量引用是指通过variable1获
得变量值value的行为
bash Shell提供了两种格式实现间接变量引用
eval tempvar=\$$variable1
tempvar=${!variable1}
示例:
[root@server ~]# N=NAME
[root@server ~]# NAME=ali
[root@server ~]# N1=${!N}
[root@server ~]# echo $N1
ali
[root@server ~]# eval N2=\$$A
[root@server ~]# echo $N2
ali
命令行展开
把命令行分成单个命令词
展开别名
展开大括号种的声明( {})
展开波浪符声明( ~)
命令替换$() 和 “)
再次把命令行分成命令词
展开文件通配( *、 ?、 [abc]等等)
准备I/0重导向( <、 >)
运行命令
防止扩展
反斜线( \)会使随后的字符按原意解释
$ echo Your cost: \$5.00
Your cost: $5.00
加引号来防止扩展
单引号( ’)防止所有扩展
双引号( ”)也防止所有扩展,但是以下情况例外:
$(美元符号) - 变量扩展
`(反引号) - 命令替换
\(反斜线) - 禁止单个字符扩展
!(叹号) - 历史命令替换
bash的配置文件
按生效范围划分,存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
shell登录两种方式
交互式登录:
(1)直接通过终端输入账号密码登录;
(2)使用“ su – UserName” 切换的用户
执行顺序:
/etc/profile –> /etc/profile.d/*.sh –>
~/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登录:
(1)su UserName
(2)图形界面下打开的终端
(3)执行脚本
执行顺序:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
Profile类
按功能划分,存在两类:
profile类和bashrc类
profile类:为交互式登录的shell提供配置
全局: /etc/profile, /etc/profile.d/*.sh
个人: ~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
Bashrc类
bashrc类:为非交互式和交互式登录的shell提供配置
全局: /etc/bashrc
个人: ~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量
编辑配置文件生效
修改profile和bashrc文件后需生效
两种方法:
1重新启动shell进程
2 . 或source
例:
~/.bashrc
Bash 退出任务
保存在~/.bash_logout文件中(用户)
在退出登录shell时运行
用于
创建自动备份
清除临时文件
原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/39405