今天是参加笔记活动的的第13天
shell展开
1.大括号展开(Brace Expansion) {...}
一般由三部分构成,前缀,一对大括号,后缀,打括号内可以是逗号分割的字符串序列,也可以是序列表达式 {x..y[..incr]}
#字符串序列
a{b,c,d}e => abe ace ade
#表达式序列,(数字可以使用incr调整增量,字母不行)
{1..5} => 1 2 3 4 5
{1..5..2} => 1 3 5
{a..e} => a b c d e
2.波浪号展开(Tilde Expansion) ~
#当前用户主目录
~ => $HOME
~/foo => $HOME/foo
#指定用户的主目录
~fred/foo => 用户fred的$HOME/foo
#当前工作目录
~+/foo => $PWD/foo
#上一个工作目录
~-/foo => ${$OLDPWD-'~-'}/foo
3.参数展开(Shell Parameter Expansion) ${}
-
间接参数扩展
${!parameter}
,其中引用的参数并不是parameter而是parameter的实际的值 -
参数长度
${#parameter}
-
空参数处理
${parameter:-word
为空替换${parameter:=word}
为空替换,并将值赋给$parameter变量${parameter:?word}
为空报错${parameter:+word}
不为空替换 -
参数切片
${parameter:offset}
${parameter:offset:length}
-
参数部分删除
${parameter%word}
最小限度从后面截取word${parameter%%word}
最大限度从后面截取word${parameter#word}
最小限度从前面截取word${parameter##word}
最大限度从前面截取word
#! /bin/sh
str=abcdefg
sp1=${str##*d}
sp2=${str%%d*}
echo $sp1 #输出efg
echo $sp2 #输出abc
4.命令替换(Command Substitution)
在子进程中执行命令,并用得到的结果替换包裹的内容,形式上有两种: $(...)或...
#! /bin/bash
echo $(whoimi)
foo(){
echo "asdasd"
}
a=`foo`
5.数学计算(Arithemetic Expansion) $((..))
使用 $(())包裹数学运算表达式,得到结果并替换
#!/bin/bash
echo $((1+2)) #3
6.文件名展开(Filename Expansion) *?[..] 外壳文件名模式匹配
当有单词没有被引号包裹,且其中出现了'*','?',and'['字符,则shell会去按照正则匹配的方式查找文件名进行替换,如果没有找到则保持不变
#!/bin/bash
$echo D*
#输出当前目录下所有以D字母开头的目录,文件
调试和前端集成
调试
- 普通log,使用echo,printf
- 使用set命令
- wscode debug插件
set配置 | 作用 | 补充 |
---|---|---|
-u | 遇到不存在的变量就会报错,并停止执行 | -o nounset |
-x | 运行结果之前,先输出执行的那一行命令 | -o xtrace |
-e | 只要发生错误,就终止执行 | -o errexit |
-o pipefail | 管道符链接的,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行 |
#! /bin/sh
set -uxe -o pipefail
echo "hello world"
echo ${d[3]}
echo ${d[@]}
#1
#4
#1 2 3 4 5
前端集成
-
node中通过exec,spawn调用shell命令
-
shell脚本中调用node命令
-
借助zx等库进行JavaScript,shell script的融合
- 借助shell完成系统操作,文件io,内存,磁盘系统状态查询
- 借助node.js完成应用层能立,网络io,计算等
exec 启动一个子 shell 进程执行传入的命令, 并且将执行结果保存在缓冲区中, 并且缓冲区是有大小限制的, 执行完毕通过回调函数返回, spawn默认不使用shell, 而是直接启动子进程执行命令, 且会直接返回一个 流对象,支持写入或者读取流数据, 这个在大数据量交互的场景比较适合