shell脚本和编程 | 青训营笔记

89 阅读3分钟

1 Shell基础概念

概念

终端

获取用户输入、展示运算结果的硬件设备

tty

teletypeWriter的简称. 和终端等价.早期指电传印机. 在linux中是输入/输出环境

终端模拟器

Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件

Shell

command interpreter .处理来自终端模拟器的输入,解释执行之后输出结果给终端

Bash

shell的一种具体实现

发展

  • Ken Thompson(来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell
  • Stephen Bourne在贝尔实验室为V7UNIX所开发的 Bourneshell ,即sh
  • 开源组织GNU为了取代 Bourne shell开发的Bourne-Again shell,即 Bash

构成

shell.png

2 命令和语法

变量

类型作用域声明方式规范
自定义变量当前shell=
环境变量当前shell及其子shellexport、declare -x字符串、整型、浮点型、日期型
系统环境变量所有shell启动加载

自定义变量

declare [+/-] 选项 变量

选项含义
-给变量设定类型属性
+取消变量的类型属性
-a将变量声明为数组类型
-i将变量声明为整数型
-x将变量声明为环境变量
-r将变量声明为只读变量
-p显示指定变量的被声明的类型

系统环境变量

变量名含义常见操作
$0当前shell名称/脚本名称11、2等可以获取到传入参数
$#传入脚本的参数数量if[ $# -gt 1 ]
$*传入脚本的所有参数
$?上条命令执行的状态码if [ $? -eq 0 ];
$PS1命令提示符export PS1="lu@Ih lw>"
$HOME用户主文件夹cd~
$PATH全局命令的搜索路径PATH=$PATH:[新增路径]

配置文件加载

登录shell

/etc/profile

First of:

  • ~/bash_profle
  • ~/bash_login
  • ~/.profle

非登录shell

~/.bashrc

/etc/bashrc

运算符和引用

类型符号作用用法
算数运算符+一*/%l&常规运算
逻辑运算符ll && !
比较运算符==!=< >
引号双引号""部分引用,仅仅$`l保留作用foo="${a}123"
单引号”完全引用,原样输出foo=‘fooSa'
反引号“执行命令foo=`ls -a
圆括号(())算数运算foo=$((1+2))
()执行命令$(1s -a)
命令连接llcmdl执行完且返回码非0,则继续执行cmd2cmdl ll cmd2
&&cmdl执行完且返回码为0,则继续执行cmd2cmd1 && cmd2
;cmd1、 cmd2串行执行cmdl ; cmd2
后台运行&让命令在后台运行,可与nohup一起使用cmd &

管道

管道与管道符|,作用是将前一个命令的结果传递给后面的命令

语法: cmd1 | cmd2

要求:管道右侧的命令必须能/接受标准输人才行, 比如grep命令, ls、mv等不能直接使用,可以使用xargs预处理

注意: 管道命令仅仅处理 stdout,对于stderr会予以忽略,可以使用set -o pipefail 设置 shell遇到管道错误退出

重定向

输出重定向符号

>: 覆盖写入文件
>>: 追加写入文件
2>: 错误输出写入文件
&>: 正确和错误输出统一写入到文件中

输入重定向符号

<
<<

判断

shell中提供了test、[、[[三种判断符号,可用于:

  • 整数测试
  • 字符串测试
  • 文件测试

语法

  • test condition
  • [ condition ]
  • [[ condition ]]

注意

  • 中括号前后要有空格符;
  • [和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串。中括号内的变量,最好都是用引号括起来
  • [[更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则

分支

#语法1:
if condition ; then
    程序段
elif condition ; then
    程序段
esle
    程序段
fi

#语法2:
case $变量 in:
   "第一个变量内容")
       程序段
   ;;
   "第一个变量内容")
       程序段
   ;;
   *)
       程序段
   ;;
esac

循环

  • while循环

while condition ; do程序段; done

  • until循环

until condition ; do程序段; done

  • for循环

for var in [words...]; do 程序段; done

函数

  • 语法一: funcName()f echo "abc"; }

  • 语法二: function funcName() i echo "abc"; }

  • 注意:

    • shell自上而下执行,函数必须在使用前定义
    • 函数获取变量和shell script类似,0代表函数名,后续参数通过0代表函数名,后续参数通过1、$2...获取 - 函数内return仅仅表示函数执行状态,不代表函数执行结果
    • 返回结果一般使用echo、 printf在外面使用$()、”获取结果
    • 如果没有return ,函数状态是上一条命令的执行状态,存储在$?中

模块化

模块化的原理是在当前shell内执行函数文件,方式:

source [函数库的路径]

常用命令

命令使用
grep查找错误日志: grep -n "ERROR"-A3-B3 cloudfun.log、统计次数:grep -n"ERROR" -c cloudfun.log
sort指定分隔符后以第三列进行排序:sort -t " "一k 3
wc统计出现的行数、单词数、字符数wc -lwm
head查看前十行: head -n 10 cloudfun.log
tail等待追加内容: tail -f -n 10 cloudfun.log
cut对数据行的内容进行处理 cut -d " "-f 3
find文件和目录查找
xargs参数处理
which查找命令路径