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:显示指定变量的被声明类型
系统环境变量:
1、# ——含义:传入脚本的参数数量 常见操作:if[# -gt 1 ]
* ——含义:传入脚本的所有参数
? -eq 0 ]
HOME ——含义:用户主文件夹 常见操作:cd~
PATH:[新增路线]
使用方法:>echo $HOME
配置文件加载
login shell
non-login shell
管道:
管道和管道符,作用是将一个命令的结果传递给后面的命令
语法:cmd1|cmd2
要求:管道右侧的命令必须能接受标准输入才行,比如grep命令、ls、mv等不能直接使用,可以使用xargn进行预处理。
管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail设置shell管道错误退出\
运算符和引用
算术运算符:+、-、*、/、%、|、&
逻辑运算符:||、&&、!
比较运算符:==、!=、<、>.
引号:
双引号——“ ” 作用:部分引用,仅仅{a}123"
单引号——‘ ’ 作用:完全引用,原样输出 用法:foo='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 n2 test n2 test n2 /*字符串测试 test -z _a test -n _a test _a= _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"]; then
echo "ok contine"
fi
if ["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 [sum" done
2、until循环 until condition ;do 程序段;done #! /bin/bash let num=0 util[sum" ((num++)) done
3、for循环 for var in [words...]; do 程序段; done
#! /bin/bash /*对列表进行循环 for foo in a b c do echo 1 done
函数 语法1: funcName(){echo "abc"} 语法2:function funcName(){echo "abc"}