Shell脚本(上)(7)

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

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 -> 输入电脑账号/密码就可以登录


  1. ls -ls /bin/sh -> 查看当前电脑所有已经安装的Shell
  2. 因为后来的Shell都是基于最初的sh来做兼容进化的, 所以我们学习的话,是基于sh/bash3.2来做研究的.


Shell环境变量配置建议


  1. bash:


  • 将配置选项放到/.bashrc中,然后在/.bash_profile中通过source调用


  1. zsh:


  • 建议仍然将配置选项放到/.bashrc,/.bash_profile中通过source调用,最后在/.zshrc中source调用/.bash_profile。


微信图片_20220510010842.png

image.png


  • 编译行语言 -> 修改了需要重新走编译流程
  • 解释性语言(js/jason/python/shell) -> 中间出错, 不影响后面代码运行


如何学脚本


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


Visual Studio Code的注意事项


  1. 点击.sh
  2. 点击右下角Shell Sript -> 搜索Shell -> 点击
  3. 以上操作可以将文件里面的表现形式改为Shell

自定义代码块



Code -> Preferences -> User Snippets
  1. 选择要写的代码类型 -> 例如Shell
  2. 添加代码块(json格式的)


微信图片_20220510010848.png

image.png

      1.$0 -> 占位符


Shell初探与注意事项


Shell初探与注意事项.sh


  1. #!bin/bash -> Shell开头的固定写法, 详细看上面Shell初探与注意事项.sh文档
  2. echo $PS1 -> 查看Shell的命令前面的提示符 -> 是一种固定写法 -> 更改其他写法后, shell命令前面的提示会相应的发生变化 -> 解析行语言


  1. read ->


微信图片_20220510010853.png
image.png


  1. 单#开头的 -> 单行注释


       1.多行注释 -> 查看文档Shell初探与注意事项.sh -> 主要用于给比人解析一个概念时有用到

       2.也可以单行注释多谢几行


  1. 双引号 -> 用于字符串 -> 避免引起歧义的 -> 其实通常情况下,加不加一样


       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.字符打印还支持特效(在终端中)


  1. 特殊符号与使用.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:是将标准输入转为命令行参数
    7.• :减号在一些命令中表示从标准输入(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环境。


  1. 是否需要权限:


       1.sh /bash/zsh不需要有"执行权限"

       2./script.sh需要有"执行权限"

       3.source script.sh不需要有"执行权限"

       4.exec需要有"执行权限"


变量与函数的定义与作用


  1. 函数函数.sh


       1.function DoWork {} -> 注意空格

       2.返回值 -> 只能是整数, 0代表成功,失败返回其他整数 -> 不写默认返回上一条的命令的执行结果

       3.在shell中定义的变量, 默认是全局变量


               1.如果申明局部变量 -> local


  1. 变量的定义变量的定义.sh


       1.因为Shell空格敏感

       2.expr 3+4

       3.expr 3 + 4

       4.更多例子, 请查看变量的定义.sh

       5.vim ~/.bashrc

       6.所以我们的终端配置环境变量时,


微信图片_20220510010857.png
image.png



        7.echo $PATH -> 查看配置的环境变量

        8.set 11 22 33 44


             1.echo 2 4

              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




目录
相关文章
|
7月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
672 9
|
7月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
685 2
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
10月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
364 60
|
7月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
9月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1113 1
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
415 1
|
11月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
503 17
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
1701 25
|
11月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
334 4