获取字符串长度
# 通常操作,需要加上 {}
echo ${#HOME}
# 如果是 zsh 可以不用加上 {}, 但是一般的云服务器需要
echo $#HOME
子字符串提取: 不能直接操作字符串(例:
${"hello":0:2}
),只能操作变量
${varname:offset:length?}
# $HOME=/Users/feiwu
echo ${HOME:4:4}
#rs/f
# 如果没有 length,则表示一直到结尾
echo ${HOME:4}
#rs/feiwu
# 如果是负数,则表示从末尾开始,最后一个字符为 -1
# 但是为了防止与 ${varname:-word} 混淆,: 后面必须加空格
echo ${HOME: -4}
#eiwu
# 也可以指定 length 为负值,但是不能小于 offset (如果在 mac 中,是不被允许的)
echo ${HOME: -4:-2}
不会改变原始变量
字符串头部的模式匹配
- 以下两种匹配可以检查字符串开头,是否匹配给定的字符串,如果匹配成功则删除匹配到部分,返回剩下的部分,pattern 是正则部分
# 非贪婪匹配
${varname#pattern}
# echo ${PATH#/*/}
#贪婪匹配
${varname##pattern}
#echo ${PATH##/*/}
- 替换: 将头部匹配成功的字符串替换 (必须出现在字符串头部)
#${varname/#pattern/replaceString}
#echo ${HOME/#\/Users/user}
#user/feiwu
字符串尾部的正则匹配
- 以下两种语法可以检查字符串结尾,是否匹配给定的模式。如果匹配成功,就删除匹配的部分,返回剩下的部分
# 非贪婪匹配
${varname%pattern}
# echo ${PATH%/*}
#贪婪匹配
${varname%%pattern}
#echo ${PATH%%/*}
- 替换,与头部匹配同样
${varname/%pattern/string}
任意位置的模式匹配
# 贪婪匹配,但仅替换第一个匹配到的字符
${varname/pattern/string}
# 贪婪匹配,替换所有匹配到的字符
${varname//pattern/string}
#如果省略了 string,相当于空字符
${varname/pattern/}
phone="555-456-1414"
echo ${phone/5?4/-}
55-56-1414
当然也可以使用扩展的形式
# 模式必须出现在字符串的开头
${variable/#pattern/string}
# 模式必须出现在字符串的结尾
${variable/%pattern/string}
mac 下的 bash 是不可以的
# 转为大写
${varname^^}
# 转为小写
${varname,,}
- 你可以直接为变量进行运算后的赋值,也可以直接进行单纯的计算
((f = 1 + 1))
echo $f
(( 1+1 ))
- 如果要读取变量,则需要在
$(())
中进行. 并且他可以嵌套
echo $(( 2+2 ))
echo $((( 2+2 ) * 2))
# 等同于
echo $(($(( 2+2 )) * 2))
- number:没有任何特殊表示法的数字是十进制数(以10为底)。
- 0number:八进制数。
- 0xnumber:十六进制数。
- base#number:base 进制的数
echo $((0xaa))
#170
$((...))
支持以下的二进制位运算符。
- <<:位左移运算,把一个数字的所有位向左移动指定的位。
- >>:位右移运算,把一个数字的所有位向右移动指定的位。
- &:位的“与”运算,对两个数字的所有位执行一个 AND 操作。
- |:位的“或”运算,对两个数字的所有位执行一个 OR 操作。
- ~:位的“否”运算,对一个数字的所有位取反。
- ^:位的异或运算(exclusive or),对两个数字的所有位执行一个异或操作。
逻辑操作符与 javascipt 相同
expr 支持算术运算符,可以不使用
(())
expr 3+2
# 也可以使用变量替换
expr $foo+1
let
命令用于将算术运算的结果,赋予一个变量。
let x=2+3
cd 命令用于进入用户指定的目录
# 进入用户原来所在的目录
cd -
# 进入用户目录
cd ~
pushd, popd
- pushd 命令类似于 cd,但是他会将指定的目录放入堆栈,并且每次使用
pushd
命令,都会将所要进入的目录放在堆栈顶部。 - popd 命令没有参数,会移除堆栈的顶部记录
➜ pwd
# /Users/feiwu
➜ pushd Project
# ~/Project ~ /
➜ pushd node
# ~/Project/node
➜ popd
# ~/Project ~ /
➜ pwd
# /Users/feiwu/Project
➜ popd
# ~ /
- 如果使用
popd -n
仅会改变堆栈,不会改变目录 - 如果使用整数参数,pushd 表示移动记录,popd 表示删除记录,分别都是从 0 开始
# 将从栈顶算起的1号目录(从0开始)移动到栈顶,同时切换到该目录
➜ pushd +1
# 将从栈底算起的1号目录(从0开始)移动到栈顶,同时切换到该目录
➜ pushd -1
# 删除从栈顶算起的1号目录(从0开始),不改变当前目录
➜ popd +1
# 删除从栈底算起的1号目录(从0开始),不改变当前目录
➜ popd -1
dirs 用于显示目录堆栈的内容,用于查看 pushd 和 popd 操作后的结果
➜ dirs
# ~ / ~/Project
参数 | 说明 |
---|---|
-c |
清空目录堆栈 |
-l |
显示完整的目录,不使用 ~ 替代用户目录 |
-p |
目录栈中的每个条目占一行 |
-v |
每行一个条目,每个条目之间显示位置编号 |
+N |
N 为整数,表示从堆栈顶算起的第 N 个目录,从 0 开始 |
-N |
N 为整数,表示从堆底顶算起的第 N 个目录,从 0 开始 |