shell脚本基础知识汇总1

电子说

1.2w人已加入

描述

1.shell脚本基础

1.1 shell环境

shell分类

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

Mac系统默认的是zsh环境,ubuntu下默认的shell环境是bash环境,可以通过执行命令查看:

# ubuntu终端
xq@ubuntu:~$ echo $SHELL
/bin/bash


# mac电脑终端
➜  ~ echo $SHELL
/bin/zsh

一般系统都会内置几种shell,可以通过命令chsh修改系统默认的shell环境,在下次打开终端生效,修改示例如下:

# 查看系统中已安装的shell类型
xq@ubuntu:~$ cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/bin/zsh
/usr/bin/zsh


# 切换默认的shell环境到zsh
xq@ubuntu:~$ chsh -s /bin/zsh


# 切换默认的shell环境到bash
xq@ubuntu:~$ chsh -s /bin/bash

shell配置文件

我们开发环境用的最多的就是bash和zsh了,下面就介绍这两个shell为例介绍对应的配置文件。

Bash的配置文件

  • /etc/profile:为系统的每个用户设置环境信息,当用户第一次登录时会执行该文件里的命令。默认会直接调用/etc/bashrc。该文件的改动需要重启才能生效。
  • /etc/bashrc:为每一个运行bash shell的用户执行此文件。当bash shell被打开时,会读取并执行该文件中的命令。所以修改该文件后,重新打开Shell即可生效。
  • ~/.bash_profile:和/etc/profile类似,但是只对当前用户生效。
  • ~/.bashrc:和/etc/bashrc类似,但是只对当前用户生效。
  • ~/.bash_logout:当每次退出bash shell时,执行该文件。
  • ~/.bash_history:保存了历史命令。在Shell为Bash时,每次敲击命令时,都会保存在这个文件里

加载顺序:/etc/profile、/etc/bashrc、 /.bash_profile、 /.bashrc

Zsh的配置文件

  • ~/.zshenv:存放的环境变量配置项在任何场景下都能被读取,这里通常把$PATH等变量写在这里,这样无论是在交互shell,或者运行程序都会读取此文件。个人理解对标Bash的profile。
  • ~/.zprofile:和.zlogin类似,但是是在.zshrc之前加载。
  • ~/.zshrc:在交互式shell中会读取并执行该文件,包含设置别名、函数、选项、键绑定等命令。对标bashrc。
  • ~/.zlogin:在login shell的时候读取。
  • ~/.zlogout:退出终端的时候读取,用于做一些清理工作。对标bash_logout。
  • ~/.zsh_history:保存了历史命令。在Shell为Zsh时,每次敲击命令时,都会保存在这个文件里。

加载顺序:zshenv、zprofile、zshrc、zlogin

1.2 shell脚本

由于bash脚本使用场景更广泛,如android源码build目录中各种shell脚本,下面就以bash脚本为例进行讲述。

shell没有官方的ide支持,可以通过vscode + shellman插件来实现高效编写。shellman插件有进行命令与模版提示的功能。

脚本文件一般以.sh结尾(扩展名并不影响脚本执行),文件第一行指定运行的shell解释器类型。

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

#!/bin/bash
echo "Hello World !"

还有一种指定shell解释器的写法是通过env来声明

#!/usr/bin/env bash
echo "Hello World !"

运行方式

  • 作为可执行程序

以脚本中声明的shell解释器运行,示例如下:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本
  • 作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,会忽略脚本中指定的解释器信息

如:

# 以zsh解析运行
zsh test.sh
# 以bash解析运行
bash test.sh

调试

shell脚本不能像android studio里面可以打断点方式调试,但是可以通过特定方式把执行过程都打印出来来排查问题。

对整个脚本加调试可以通过在指定解释器的地方添加-x参数

#!/usr/bin/env bash -x
echo "Hello World !"

或者

bash -x test.sh

如果是针对特定的代码块加调试可以通过下面的方式实现:

set -x
调试内容
set +x

示例代码如下:

set -x
echo "hello"
echo "world"
set +x


# 输出结果,带+的为执行过程打印
+ echo hello
hello
+ echo world
world
+ set +x
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分