Skip to content

Latest commit

 

History

History
243 lines (177 loc) · 5.43 KB

03.Bash操作.md

File metadata and controls

243 lines (177 loc) · 5.43 KB

Bash 字符串、运算符、行、目录堆栈

操作字符串

获取字符串长度

# 通常操作,需要加上 {}
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 与 let

expr 支持算术运算符,可以不使用 (())

expr 3+2

# 也可以使用变量替换
expr $foo+1

let 命令用于将算术运算的结果,赋予一个变量。

let x=2+3

目录堆栈

cd 命令用于进入用户指定的目录

# 进入用户原来所在的目录
cd -
# 进入用户目录
cd ~

pushd, popd

  • pushd 命令类似于 cd,但是他会将指定的目录放入堆栈,并且每次使用 pushd 命令,都会将所要进入的目录放在堆栈顶部。
  • popd 命令没有参数,会移除堆栈的顶部记录
pwd                           
# /Users/feiwupushd Project 
# ~/Project ~ /pushd node   
# ~/Project/nodepopd      
# ~/Project ~ /pwd 
# /Users/feiwu/Projectpopd
# ~ /
  • 如果使用 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 开始