Shell脚本和编程(六) | 青训营笔记

35 阅读2分钟

今天是参加笔记活动的的第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) ${}

  1. 间接参数扩展${!parameter},其中引用的参数并不是parameter而是parameter的实际的值

  2. 参数长度 ${#parameter}

  3. 空参数处理

    ${parameter:-word为空替换

    ${parameter:=word}为空替换,并将值赋给$parameter变量

    ${parameter:?word}为空报错

    ${parameter:+word}不为空替换

  4. 参数切片

    ${parameter:offset}

    ${parameter:offset:length}

  5. 参数部分删除

    ${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/bashecho $((1+2)) #3

6.文件名展开(Filename Expansion) *?[..] 外壳文件名模式匹配

当有单词没有被引号包裹,且其中出现了'*','?',and'['字符,则shell会去按照正则匹配的方式查找文件名进行替换,如果没有找到则保持不变

#!/bin/bash
$echo D*
#输出当前目录下所有以D字母开头的目录,文件

调试和前端集成

调试

  1. 普通log,使用echo,printf
  2. 使用set命令
  3. 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

前端集成

  1. node中通过exec,spawn调用shell命令

  2. shell脚本中调用node命令

  3. 借助zx等库进行JavaScript,shell script的融合

    • 借助shell完成系统操作,文件io,内存,磁盘系统状态查询
    • 借助node.js完成应用层能立,网络io,计算等

exec 启动一个子 shell 进程执行传入的命令, 并且将执行结果保存在缓冲区中, 并且缓冲区是有大小限制的, 执行完毕通过回调函数返回, spawn默认不使用shell, 而是直接启动子进程执行命令, 且会直接返回一个 流对象,支持写入或者读取流数据, 这个在大数据量交互的场景比较适合