Shell脚本(上)(7)

Shell定义

Shell参考资料.md

Shell(Unix Shell)是一种命令行解释器,是Unix操作系统下最传统的人机接口。 Shell脚本是解释执行的,不需要编译,和大部分的编程语言很相似,也有基本的变量和流程控制语句。

shell是一种胶水语言, 把命令放在一起, 来按顺序执行. 我们平时使用Shell有两种方式:

  1. 输入命令,执行,这种方式称为交互式(Interactive);
  2. 批处理(Batch)方式,用户事先写好Shell脚本文件,然后顺序执行脚本中的命令。

终端演绎

  1. echo $0 -> 查看默认终端
    1. echo -> 终端打印
    2. -zsh -> 有- -> 登录的, Shell有基于用户, 有时候会用到签名所以需要登录
    3. zsh -> 没有- -> 没有登录的
      1. login -> 输入电脑账号/密码就可以登录
  2. ls -ls /bin/sh -> 查看当前电脑所有已经安装的Shell
  3. 因为后来的Shell都是基于最初的sh来做兼容进化的, 所以我们学习的话,是基于sh/bash3.2来做研究的.

Shell环境变量配置建议

  1. bash:
    • 将配置选项放到/.bashrc中,然后在/.bash_profile中通过source调用。
  2. zsh:
    • 建议仍然将配置选项放到/.bashrc,/.bash_profile中通过source调用,最后在/.zshrc中source调用/.bash_profile。
image.png
  • 编译行语言 -> 修改了需要重新走编译流程
  • 解释性语言(js/jason/python/shell) -> 中间出错, 不影响后面代码运行

如何学脚本

  1. 学语法
  2. 看脚本
  3. (最重要的-_-!)

Visual Studio Code的注意事项

  1. 点击.sh
  2. 点击右下角Shell Sript -> 搜索Shell -> 点击
  3. 以上操作可以将文件里面的表现形式改为Shell
自定义代码块
  1. Code -> Preferences -> User Snippets
  2. 选择要写的代码类型 -> 例如Shell
  3. 添加代码块(json格式的)
    image.png
    1. $0 -> 占位符

Shell初探与注意事项

Shell初探与注意事项.sh

  1. #!bin/bash -> Shell开头的固定写法, 详细看上面Shell初探与注意事项.sh文档
  2. echo $PS1 -> 查看Shell的命令前面的提示符 -> 是一种固定写法 -> 更改其他写法后, shell命令前面的提示会相应的发生变化 -> 解析行语言
  3. read ->
    image.png
  4. 单#开头的 -> 单行注释
    1. 多行注释 -> 查看文档Shell初探与注意事项.sh -> 主要用于给比人解析一个概念时有用到
    2. 也可以单行注释多谢几行
  5. 双引号 -> 用于字符串 -> 避免引起歧义的 -> 其实通常情况下,加不加一样
    1. 字符串里有特殊符号 -> 就可以用到双引号
    2. 单引号跟双引号类似, 但所有字符都没有特殊含有 -> 查看文档Shell初探与注意事项.sh
      1. echo 'I am echo SuperYann' -> I am echo SuperYann
    3. 反引号`` -> 通常是命令行, 程序会优先执行反引号中的内容,并替换
      1. echo "I am echo SuperYann" -> I am Super Yann -> 先执行 I am -> 再到 Super Yann
      2. 不要忘了Shell的执行顺序, 从上到下, 从左到右依次执行
    4. echo 输入默认换行(Visual Studio Code中)
      1. echo -n -> 不换行
    5. 字符打印还支持特效(在终端中)
  6. 特殊符号与使用.sh

find_api.sh

find_api.sh

  1. cd到目标文件夹
  2. grep weak test.m -> grep (要搜索的关键字) (要搜索的文件)
    1. grep "weak" test.m
  3. 搜索可执行文件 -> 查找可执行文件的符号表
    1. nm -pa test | grep "weak"
  4. find_api.sh -> grep weak --color=auto -- ../Common\ Symbol/test.m
    1. grep weak --color=auto -- "../Common Symbol/test.m"
    2. -- -> 代表没有参数要传了, 后面只能跟文件
    3. shell是通过空格来分割参数的
    4. 错误写法 -> grep weak --color=auto -- "../Common\ Symbol/test.m"
    5. 错误写法 -> grep weak --color=auto -- '../Common\ Symbol/test.m'

标准输出&输入&错误.sh

标准输出-输入-错误

  1. read website -> 进入标准输入状态
    1. SuperYann -> 输入后回车,结束该状态
  2. 进入标准输出&输入&错误.sh -> 终端直接拖拽 -> 回车
    1. 有错误 -> 因为名字中有特殊字符,需要转义符来声明一下\
  3. echo "LGSuperYann" > SuperYann -> 将一个标准输出,重定位到一个文件中
    1. cat SuperYann
    2. > -> 覆盖 -> echo "LGSuperYann1234" > SuperYann
    3. >> -> 累加 -> echo "LGSuperYann456" >> SuperYann
  4. man cat -> 查看cat定义 -> cat 后面如果没有参数, 则进入标准输入模式
    1. ctrl + d -> 终止
    2. cat > Cat1237(新的文件) -> 输入后 -> 退出 -> cat Cat1237
    3. cat > Cat1237 << "cat"(结束输入) -> 这种写法, 最后输入相应的结束字符,就可以结束 -> 日常开发 -> cat > Cat1237 << "eof"
  5. tty -> 查看当前终端xcode_run_cmd
    1. &>$TTY -> 将标准输出和错误,都重定位到终端
  6. ; -> 用来分割两个命令,代表连续执行
  7. 当前一个命令执行成功会回传一个 $?=0的值。
    1. echo "cat" -> echo $? -> 0,代表执行成功
    2. e -> echo $? -> 123(随机值) -> 执行失败
  8. cmd1 && cmd2 如果第一个命令的$?为0,则执行第二个命令。
    1. md1 || cmd2 如果第一个命令的$?为0,则不执行第二个命令。否则执行第二个命令。
  9. |:管道仅能处理前面一个命令传来的正确信息,将正确信息作为stdin传给下一个命令。
    1. otool -l test | grep 'DYLIB' -A 3 -i -
    2. 管道命令只处理前一个命令正确输出,不处理错误输出;
    3. 管道命令右边命令,必须能够接收标准输入流命令才行;
    4. 大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。
    5. echo "Cat1237" | cat
    6. echo "Cat1237" | xargs cat -> xargs:是将标准输入转为命令行参数
      • :减号在一些命令中表示从标准输入(stdin)中获取内容

三种运行方式

运行方式.sh

  1. shell也是有进程,以及子shell的
  2. 运行方式:
    1. sh:使用$ sh script.sh执行脚本时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。$ ./script.sh$ sh script.sh等效。也叫fork方式
    2. source:使用$ source script.sh方式,在当前上下文中执行脚本,不会生成新的进程。脚本执行完毕,回到当前shell。$ . script.sh$ source script.sh等效。不需要有"执行权限"
    3. exec方式:使用exec ./scriptsh方式,会用command进程替换当前shell进程,并且保持PID不变。执行完毕,直接退出,不回到之前的shell环境。
  3. 是否需要权限:
    1. sh /bash/zsh不需要有"执行权限"
    2. ./script.sh需要有"执行权限"
    3. source script.sh不需要有"执行权限"
    4. exec需要有"执行权限"

变量与函数的定义与作用

  1. 函数函数.sh
    1. function DoWork {} -> 注意空格
    2. 返回值 -> 只能是整数, 0代表成功,失败返回其他整数 -> 不写默认返回上一条的命令的执行结果
    3. 在shell中定义的变量, 默认是全局变量
      1. 如果申明局部变量 -> local
  2. 变量的定义变量的定义.sh
    1. 因为Shell空格敏感
    2. expr 3+4
    3. expr 3 + 4
    4. 更多例子, 请查看变量的定义.sh
    5. vim ~/.bashrc
    6. 所以我们的终端配置环境变量时,
      image.png
    7. echo $PATH -> 查看配置的环境变量
    8. set 11 22 33 44
      1. echo 12 34
      2. echo "$#" -> 参数个数
      3. echo "$@" -> 输出全部参数
      4. eval echo "$$#" -> 拿到最后一个参数 -> #$5 -> #55
      5. 注意上面的完整写法 eval echo "$$#" -> 此处出问题也是因为Shell的执行顺序是从左往右

05 参数的扩展

参数扩展.sh

06 test与判断

test与判断.sh

07 循环

循环.sh

实战Shell

写一个Shell思考两点:

  1. 命令如何来执行
  2. 执行的命令到底是哪一个 -> -v
  3. 错误信息, 自己控制输出

实战操作探寻

shell实战例子

  1. touch shell.sh
  2. #!/bin/sh
  3. 运行命令达到输出的效果
  4. echo "$@"
  5. sh shell.sh 12 23 34 -> 执行Shell,有点像去执行一个函数
    1. "echo "$@"" -> 执行报错
    2. eval "echo "$@"" -> eval,扫描两边,可以执行成功
  6. RunCommand() { "$@" &>文件 } -> 最后输入的位置可以是文件路经,也可以是终端
  7. 想看到命令执行时的详细信息 -> 函数里面写个echo来打印一下
    1. 并不是任何时候都需要打印的, 建议写个变量判断一下, 有需要才打印
    2. 以后写模板的参考 RunCommand/Echoerror

总结

  1. Fluter编译原理的脚本注释, 要拿到xcode_build.sh
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容