shell学习 一 |青训营笔记

96 阅读3分钟

shell基础

shell概念

shell是用户使用Linux的桥梁,既是命令语言也是一种程序设计语言。通过shell我们来处理终端模拟器的输入,解释执行过后输出给终端。
1971年由Ken Thompson为Unix开发V6 shell,它也是第一种Unix shell。
开源组织GNU为了取代Stephen Bourne为V7 Unix开发的Bourne shell开发出了Bourne-Again shell即Bash,它也是shell的一种具体体现。
shell分解释器和编程语言俩大类;解释器包括:bash 内置命令、GNU核心工具集以及第三方库;编程语言包含了变量、运算、语句、函数。


语法及命令

变量:

  1. 自定义变量,在脚本或命令中定义,仅在当前shell中有效,其他shell的启动程序无法访问。变量名和变量值=连接,类型有整型,字符串型,浮点型及日期型
  2. 环境变量,当前shell及其子shell,使用export declare -x作声明方式。父子shell 由父shell触发子shell,结束后返回继续执行下一条命令。
  3. 系统环境变量作用在所有shell中,声明方式启动加载。

变量写法

#! /bin/bash

# 变量名=变量值(不能有空格出现)
size=1
num=2
# 命令赋值给变量
ls=ls
# 命令结果赋值给变量
list=$(ls)

# 默认字符串不进行+运算
total=size*num
# 需要声明变量为整型
let total=size*num
declare -i total=size*num
# 导出环境变量
export total
#声明变量为环境变量
declare -x total
declare [+/-] 选项变量
选项含义
-设定变量类型属性
+取消变量类型属性
-a声明为数组类型
-i声明为整型
-x声明为环境变量
-r只读变量
-p显示指定变量被声明的类型

系统环境变量常见操作及变量名

变量名含义常见操作
$0当前shell名称/脚本名称11、2获取传入参数
$#传入脚本参数数量if[$# -gt 1]
$*传入脚本所有参数if[$? -eq 0];
$PS1命令提示符expot PS1="\u@\h\w>"
$HOME用户主文件夹cd ~
$PATH全局命令的搜索路径PATH=$PATH:[新增路径]

配置文件加载时需要bash完整登录时称为login shell;远程登录时不需要登录bash时称为non-login bash,比如开启子进程、执行外部命令。
在修改配置文件后不会立即生效,需要重启终端或者执行source ~/.bashrc

类型符号作用用法
算数运算符+ - * / % | &常规运算
逻辑运算符|| && !
比较运算符== != < >
引号双引号""部分引用,仅$ `  \保留作用foo="${a}123"
单引号''完全引用,原样输出foo='foo$a'
反引号``执行命令foo=ls -a
圆括号(())算术运算foo=$((1+2))
()执行命令$(ls -a)
命令连接||命令1执行后返回码非零,则继续执行命令2cmd1 || cmd2
&&命令1执行后返回码非零,则继续执行命令2cmd1 && cmd2
cmd1、cmd2 串行执行cmd1 ;cmd2
后台运行&命令后台运行,可与nohup一起使用,使得终端关闭后命令继续执行cmd &

管道:管道符|之前的命令执行完后执行|之后的命令
管道右侧命令必须接受标准输入,如grep,不能直接使用的命令可以用xargs作预处理比如find . -maxdepth 1 -name "*.sh" | xargs ls -l
管道命令仅处理stdout,忽略stderr使用set -o pipefail设置遇到管道错误退出。
简单说就是多个程序进行一个连接,进程通信方式之一。

重定向:
shell命令执行时会打开三个文件描述符0、1、2,对应标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),三个文件描述符默认指向终端输入和终端输出,重定向值指不去使用默认输入输出,我们自己重新指定输入输出的文件作标准设备。
输入重定向符号

  1. 标准输入:命令<文件1  命令将文件1的内容作标准输入设备
  2. 标识符限定输入:命令<<标识符  命令把当前输入内容继续使用,当遇见标识符停止,接收内容作新的标准输入。

输出重定向符号:

  1. 标准输出:命令>文件 覆盖并写入到指定文件;命令>>文件 追加并写入指定文件或设备;
  2. 标准错误输出:错误命令2>文件 覆盖并把命令的错误输出输出到指定文件;错误命令2>>追加并把命令的错误输出输出到指定文件。
  3. 正确输出错误输出同时保存进文件:命令&>文件 覆盖方式正确输出错误输出同时保存进同一文件。