/
...
/
/
Bash Script
Search
Try Notion
Bash Script
一.ShaBang
原理:
Sha-Bang 是 Shell 脚本开头字符#!连在一起的读音(Sharp Bang)
当 Shell 文件被 Linux 系统读取时,内核会通过#!表示的值(0x23, 0x21)识别出随后的解释器路径并调用,最后再将整个脚本内容传递给解释器。
由于 Shell 当中#字符同时表示注释,因此 Shell 解释脚本文件时会自动忽略该行。本文讨论的 Shell 脚本通常以#!/bin/sh或者#!/bin/bash开头,表示当前使用的解释器为 Dash Shell 或者 Bash Shell。本文所涉及的代码都基于#!/bin/bash路径下的Bash Shell
二.执行方式
Shell 脚本的执行主要存在如下 3种方式:
将拥有执行权限的脚本作为命令调用,例如:./hello.sh
使用source命令执行,例如:source hello.sh
显式使用 Shell 程序
(参数传递脚本地址) 显式使用 Shell 程序,将脚本文件作为参数来执行,例如:sh hello.sh
(标准输入传递脚本) 将脚本文件重定向至 Shell 程序的标准输入,例如:sh < hello.sh
(管道传递) 通过管道符将脚本内容输出至 Shell 程序的标准输入,例如:cat hello.sh | sh
三.Shell模型-字符串过滤
Shell 解释器采用了字符流过滤器模型
就是一条命令将结果送到标准输出,这个标准输出被连接到下一条命令的标准输入,每条命令的输出结果都是自己处理之后的字符流,接受的输入都是需要进行处理的字符流,所以字符串是 Shell 当中非常重要的组成部分。
字符串类型
简介: Shell 当中存在'"`三种引号类型
'当中的字符串 Shell 不会进行处理
"当中的字符串 Shell 会进行处理,如果其中包含有可以求值的部分(变量、表达式、命令),则会被 Shell 替换为相应的求值结果
pi@raspberrypi:~ $ writer=Hank pi@raspberrypi:~ $ echo "本文作者是:$writer"
Copy
Bash
反引号`用于引用一条 Linux 命令,其作用是将该命令的执行结果输出,效果类似于"$()"
四.重定向
特殊文件描述指针
默认情况下,Linux 当中的每一个进程都拥有 3 个特殊的文件描述指针:
标准输入:Standard Input,文件描述指针为0
标准输出:Standard Output,文件描述指针为1
标准错误输出:Standard Eror,文件描述指针为2
重定向至文件
输出重定向: 输出重定向符号>>>,可以将标准输出重定向至一个文件当中,如果该文件不存在则创建文件。
前者>会覆盖原文件内容
后者>>则会在原文件尾部追加新的内容
输入重定向: 输出重定向符号<<<,用于将标准输入重定向至一个文件。
💡< 非重定向情况
💻非重定向情况
pi@raspberrypi:~ $ cat<hello.sh #!/bin/bash echo "Hello Bash Shell !" # 注释 pi@raspberrypi:~ $ bash < hello.sh Hello Bash Shell !
Copy
Bash
如果<后跟着一个 Shell 脚本文件,则相当于将.sh脚本中的命令逐条输入至 Shell 程序当中执行
相当于没有执行重定向
<<可以用于 Here Document
💻HereDoc.sh示例
#!/bin/bash echo "文件 hello 不存在" ls -l # 列出当前目录所有文件 # 使用 Here Document 方式产生 hello.c 文件 cat>hello.c<<EOF #include<stdio.h> #include<stdlib.h> int main(void){ printf("Hello World\n"); return EXIT_SUCCESS; } EOF # 编译 hello.c cc -W -Wall -o hello hello.c ls -l # 列出当前目录所有文件 # 执行 hello,然后清除新生成的文件 ./hello rm hello hello.c
Copy
Bash
即将文本直接写在 Shell 脚本之中,并以添加终止符EOF(即 Linux 系统读取至文件结尾时所返回的信号值1),该文本相当于一份独立的文件内容,例如:执行下面的hello.sh脚本以后
五.变量
简单变量语法规则
简单的变量设置 [varName]='varValue'
Shell 中的变量在使用前不需要声明,赋值时可以直接使用变量名
且赋值的等号=两边不能有空格
变量定义之后,引用变量时一定需要使用$符号\
Shell 变量没有类型,例如annum=2020,既可以作为十进制整数2020直接参与算术运算,也可以作为字符串来进行处理。
简单变量取消 unset [varName]
特殊变量
?问号也是一个变量
💻?变量示例
pi@raspberrypi:~ $ false # false 命令返的回值恒为 1 pi@raspberrypi:~ $ echo $? 1 # 使用 echo 查看 1 次后,变量 ? 的值会就被 echo 命令的返回值 0 覆盖 pi@raspberrypi:~ $ echo $? 0
Copy
Bash
通过$?可以引用上一条命令的返回值,但是该值只能使用一次,使用完以后就会被目前命令的返回值所替换。
六.alias别名
在 .bashrc中可以设置快捷命令
💻快速设置proxy
alias pe_proxy='http_proxy="127.0.0.1:7890";https_proxy="127.0.0.1:7890"' alias pe_unsetproxy='unset http_proxy;unset https_proxy
Copy
Bash
💻设置ll指令
alias ll='ls -al --color="auto"'
Copy
Bash
七.函数
💻设置git-branch于Promote
# show git branch name function git-branch-name() { git symbolic-ref HEAD 2>/dev/null | cut -d"/" -f 3 } function git-branch-prompt() { local branch=`git-branch-name` if [ $branch ]; then printf "(%s)" $branch fi } function get-PS1() { local branchname=`git-branch-prompt` printf "\n\e[32m%s\e[36m%s\e[35m %s \e[33m%s\e[36m %s \e[0m \n%s " "\u" "[\#]" "MSYS" "\w" $(git-branch-prompt) "\$" } function show-PS1() { if [ -d "$(pwd)/.git" ]; then export PS1=`get-PS1` else export PS1="\n\[\e[32m\]\u\[\e[36m\][\#]\[\e[35m\] MSYS \[\e[33m\w\]\[\e[0m\] \n\$ " fi } function cd(){ builtin cd "$@" && show-PS1 } show-PS1
Copy
Bash