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

96 阅读2分钟

shell脚本和编程\

shell的基本概
终端:获取用户输入、展示运算结果的硬件设备
tty:和终端等价,在Linux中是输入与输出
终端模拟器: Mac Terminal、iTerm2等,关联虚拟tty的输入与输出软件
shell:处理来自终端模拟器的输入,解释执行之后输出结果给终端
Bash:shell的一种具体表现
shell:1、解释器 ——bash内置命令、GNU核心工具集
2、编程语言——变量、运算、语句、函数\

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

自定义变量:
#!/bin/bash
#变量名=变量值 默认变量值为字符型
page_size=1
page_number=2

#将命令复制给变量
_ls=ls

#将命令结果赋值给变量
file_list=$(ls-a)

#默认字符串,不会进行+运算
total=page_size*page_num 这是错误的

#声明量为整型 let total=page_sizepage_num declare -i total=page_sizepage_num

#导出环境变量 export total declare -x total

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

系统环境变量:
0——含义:当前shell名称(脚本名称)常见操作:0 ——含义:当前shell名称(脚本名称) 常见操作:1、2等可以获取传入参数2等可以获取传入参数 # ——含义:传入脚本的参数数量 常见操作:if[# -gt 1 ] * ——含义:传入脚本的所有参数 ?——含义:上调命令执行的状态码常见操作:if[? ——含义:上调命令执行的状态码 常见操作:if[? -eq 0 ] PS1——含义:命令提示符常见操作:exportPS1="\u@\h\w>"PS1 ——含义:命令提示符 常见操作:export PS1="\u@\h\w>" HOME ——含义:用户主文件夹 常见操作:cd~ PATH——含义:全局命令的搜索路线常见操作:PATH=PATH ——含义:全局命令的搜索路线 常见操作:PATH=PATH:[新增路线] 使用方法:>echo $HOME

配置文件加载
login shell non-login shell

管道:
管道和管道符,作用是将一个命令的结果传递给后面的命令
语法:cmd1|cmd2
要求:管道右侧的命令必须能接受标准输入才行,比如grep命令、ls、mv等不能直接使用,可以使用xargn进行预处理。
管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail设置shell管道错误退出\

运算符和引用
算术运算符:+、-、*、/、%、|、&
逻辑运算符:||、&&、!
比较运算符:==、!=、<、>.
引号:
双引号——“ ” 作用:部分引用,仅仅\保留作用用法:foo= ` \保留作用 用法:foo=“{a}123" 单引号——‘ ’ 作用:完全引用,原样输出 用法:foo='fooa反引号——作用:执行命令用法:foo=lsa圆括号: (())——作用:算数运算foo=a' 反引号——` ` 作用:执行命令 用法:foo=`ls -a` 圆括号:\ (())——作用:算数运算 foo=((1+2)) () ——作用:执行命令 $(ls -a) 命令连接: || ——cmd1执行完且返回码非零,则继续执行cmd2 用法:cmd1||cmd2 && ——cmd1执行完且返回码为零,则继续执行cmd2 用法:cmd1&&cmd2 ; ——cmd1,cmd2串行执行 用法:cmd1;cmd2 后台运行:& 作用:让命令在后台运行,可与nohup一起使用 用法:cmd&

重定向 fd0:标准输入 ./ fd1:标准输出 fd2:标准错误 输出重定向符:

:覆盖写入文件

:追加写入文件

2>:错误输出写入文件 &>:正确和错误输出统一写入文件中 输入重定向符: <: <<:

判断命令: 符号:test、[]、[[]] 语法:test condition [ condition ] [[ condition ]]

例如: #!/bin/bash /*整数测试 test n1eqn1 -eq n2 test n1ltn1 -lt n2 test n1gtn1 -gt n2 /*字符串测试 test -z strstr _a test -n strstr _a test strstr _a= strstr _b /*文件测试 test -e/dmt && echo ”exist“ test -f/usr/bin/npm && echo ”file exist“ 注意:1.中括号前后都有空格符 2.[]和test命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串 3.中括号内的变量最后用引号引起来 4.[[]]在整型比较中支持<、>、=、,在字符串中支持=~正则

分支语句: 1
if condition;then 程序段 elif condition;then 程序段 else condition;then 程序段 #! /bin/bash if ["yn"=="y"o"yn"=="y" -o "yn"=="Y"]; then echo "ok contine" fi if ["yn"=="y"]["yn"=="y"] ||[ "yn"=="Y"]; then echo "ok contine too" fi

2
case 变量 in: ”第一个变量内容“) 程序段 ;; ”第一个变量内容“) 程序段 ;; *) 程序段 ;; esac #! /bin/bash name=john case name in "nick") echo "hi nick" ;; "john") echo "my name is john" ;; *) echo "404" ;; esac

循环 1、while循环 while condition ; do程序段;done #! /bin/bash let num=0 while [numlt10];doecho"currentidx:num -lt 10]; do echo "current idx:sum" done

2、until循环 until condition ;do 程序段;done #! /bin/bash let num=0 util[numgt10];doecho"currentidx:num -gt 10]; do echo "current idx:sum" ((num++)) done

3、for循环 for var in [words...]; do 程序段; done

#! /bin/bash /*对列表进行循环 for foo in a b c do echo foodone/数值方式循环for((i=0;i<10;i++))doechofoo done /*数值方式循环 for((i=0;i<10;i++)) do echo 1 done

函数 语法1: funcName(){echo "abc"} 语法2:function funcName(){echo "abc"}