bash教程

操作系统简史

贝尔实验室Unix (AT&T Unix VS BSD SUN)
PC时代 (比尔盖茨 DOS VS 乔布斯Apple)
GUI时代(比尔盖茨Windows VS 乔布斯Mac VS Linux

移动时代(Google Android VS 乔布斯 iOS)

 

 

shell的价值

 

人机交互:Shell VS GUI
 批处理
❖ Unix、Linux、Mac、Android、iOS
❖ 脚本自动化 VS GUI⾃动化
工作场景
❖ 服务端测试
❖ 移动端测试

❖ 持续集成与自动化部署

 

shell种类

常用shell
❖ bash

❖ sh

❖ zsh

 

 

windows需要安装cygwin
❖ cygwin
❖ git bash

windows上没有/etc/shells

 

ssh [email protected]

 

testerhome

 

bash教程_第1张图片

Bash 语言

 

变量

 

变量定义

a=1
b=seveniruby
d="hello from testerhome"
e='hello from "霍格沃兹测试学院" '
f=`ls`
= 左右不要有空格
如果内容有空格,需要使用单引号或者双引号
双引号支持转义 $开头的变量会被自动替换

变量使用

echo $a
echo ${b}
echo "$a"
使用$var 或 ${var}来访问变量。后者更为严谨。$var_x ${var}_x是不同的
变量不需要定义也可以使用。引用未定义的变量,默认为空值

bash教程_第2张图片

{}括起来

预定义变量

 

echo$+2次tab键,系统预定义变量

bash教程_第3张图片

echo $PWD

系统路径

echo $USER

用户名

echo $HOME 

系统自XX的路径

bash教程_第4张图片

~ 是home的简写

echo $PATH

不输入路径,就需要在PATH列表内

数组变量

 

array=(1 3 4 6)
array=(`ls`)

echo ${array[2]}

 

访问第2个元素(从0开始)

echo ${array[*]}

输出全部内容

echo ${#array[*]}

打印数字,元素个数

使用()来定义数组变量,中间使用空格隔开

 

特殊符号的使用

双引号于括起一段字符串值,支持$var形式的变量替换

单引号也表示其内容是字符串值,不支持转义(原样输出)

\ 反斜线,某些情况下表示转义

$(ls) 表示执行ls后的结果。与``类似。不过可以嵌套。
`反引号。用法比较独特,代表命令的输出。非常有用。

$(()) 对变量进行操作。比如相加$((a+b)) $((2+3))

(()) 是整数扩展。把的变量当作整数去处理。

bash教程_第5张图片

bash教程_第6张图片

({1..10}) 等价于 seq 1 10。表示1到10

变量类型

字符串 a="xx"

取值

${value:offset}  ${value:offset:length} 从变量中提取子串  (第offset个元素,提取元素个数)

bash教程_第7张图片
${#value} 字符串长度


${#array[*]}和${#array[@]}表示数组中元素的个数

 

掐头去尾与内容替换

${value#pattern} ${value##pattern} #表示掐头


 

${value%pattern} ${value%%pattern} %表示去尾


${value/pattern/string} ${value//pattern/string} /表示替换


 

#与## %与%% /与//的区别:最短匹配模式VS最长匹配模式
${var/#Pattern/Replacement} ${var/%Pattern/Replacement}


 

数字 i=1314

 

计算

 i=1;echo $i;echo $((i+1))

更新

((i=i+1));echo $i

只能进行整数计算,只有int类型

浮点数计算请使用 awk 'BEGIN{print 1/3}’

 

Eg:

xx="1234567";
echo ${xx:2:3};
echo ${xx/3/c};
echo ${xx##*3};
echo ${xx%%5*};
echo $xx|awk '{print substr($0,2,3)}'

echo $xx|sed 's#3#c#g'  (sed ‘s#原字符串#新字符串#g’)

bash教程_第8张图片

 

布尔 a=true b=false

❖ true
❖ false
❖ 命令执行返回值 $?
    ❖ 任何命令执行都会有一个返回值
    ❖ 0表示正确

    ❖ 非0表示错误

 

 

算术判断

 

[ 2 –eq 2 ] 相等
[ 2 –ne 2 ] 不等
[ 3 –gt 1 ] 大于
[ 3 –ge 3 ] 大于等于
[ 3 –lt 4 ] 小于
[ 3 –le 3 ] 小于等于
(())也可以表示算术比较。((10>=8)) ,((10==10)),

bash教程_第9张图片
字符串判断

 

❖ [ string1 = string2 ] 如果两字符串相同,则结果为真
❖ [ string1 != string2 ] 如果两字符串不相同,则结果为真
❖ [ -n "$var" ] 如果字符串不是空,则结果为真
❖ [ -z "$var" ] 如果字符串是空,则结果为真
❖ [[ "xxxx" == x* ]] 在表达式中表示0或者多个字符
❖ [[ xxx == x?? ]] 在表达式中表示单个字符
❖ 在引用变量的时候要记得加双引号[ -z "$a"] 否则当a未定义时会语法报错

bash教程_第10张图片

 

逻辑判断

 

❖ [ 2 -ge 1 -a 3 -ge 4 ];echo $? 与
❖ [ 2 -ge 1 -o 3 -ge 4 ];echo $? 或
❖ [[ 2 -ge 1 && 3 -ge 4 ]];echo $? 与
❖ [[ 2 -ge 1 || 3 -ge 4 ]];echo $? 或
❖ [ ! 2 -ge 1 ];echo $? 非

shell内置判断

❖ -e file 如果文件存在,则结果为真
❖ -d file 如果文件是一个子录,则结果为真
❖ -f file 如果文件是一个普通文件,则结果为真

❖ -r file 如果文件可读,则结果为真
❖ -s file 如果文件的长度不为0,则结果为真
❖ -w file 如果文件可写,则结果为真
❖ -x file 如果文件可执行,则结果为真
❖ [[]]是[]的扩展语法,在老的sh里并不支持。推荐用[]

bash教程_第11张图片

 

bash教程_第12张图片

 

 

逻辑控制

 

❖ 条件 if

❖ if [ condition ] ; then …;fi
❖ if [ condition ] ; then …;else …;fi
❖ if [ condition ] ; then …;elif …;fi (多个条件)
❖ 简单的逻辑可以使用 &&(true) ||(false) 去替代 (有细微差别,暂时忽略)

❖ 条件可以用命令返回值代替

bash教程_第13张图片

回车换行-=

bash教程_第14张图片

❖ Case 结构 (选学)

用于条件太多的情况。每一个条件最后使用两个分号结尾,不可缺少。
❖ case $var in
❖ p1) … ;;
❖ p2) … ;;
❖ …
❖ pn) … ;;
❖ *) …;;
❖ esac

❖ 循环 for while until select

 

❖Select (选学)

❖ Select var in var_list;do ….;done;

❖ 菜单选择,一般与case结构一起用

❖ For循环

❖ for(( c1 ; c2 ; c3 ));
❖ do
❖ … ;
❖ done

❖ for((i=0;i<10;i++));do echo $i;done

bash教程_第15张图片

 

❖For 遍历循环

❖ 用于递归数组,还可以递归以空格隔开的字符串序列。或者是某个命令的返回值。
❖ for f in $array[*];
❖ do
❖ …..
❖ done
❖ ss="aa bb cc dd";for x in $ss;do echo $x ;done
❖ for x in `ls` ;do echo $x ;done
❖ ss=(aa bb cc "sss dd");for x in "${ss[@]}";do echo $x ;done

bash教程_第16张图片

bash教程_第17张图片

 

❖While 循环

❖ i=0;while [ $i -lt 3 ] ;do echo $i;((i=i+1));done

❖ 一个有用的小技巧。一行行的读取文件内容 while read line;do echo $line;done < /tmp/tmp

bash教程_第18张图片

bash教程_第19张图片

######################################创建文件保存并退出####################################

1.执行 vi /tmp/file (即创建名为file的文件)

2.按ESC回到命令模式

3.执行(:wq ) 保存文件并退出; (:w) 保存文件但不退出vi; (:w file1 )将修改另存为到file1中,不退出vi;:去 不保存文件,退出vi,回车即可

❖ until (选学)

自行查资料,不再介绍。因为until 语法在以前的大多数编程语音里没有。比较新的语音,python,ruby等有,为了精简的原则,不推荐使用。
❖ While 可以替代until 循环

❖ Break 和 continue

❖ 有生之年也许你只能用到if、for、while

 

 

 

❖退出控制

❖ return 函数返回
❖ exit 脚本退出
❖ break 退出当前循环
❖ continue 跳过当前的循环,进⼊下⼀次循环。

shell 环境

Shell 运行环境概念

❖ bash是一个进程
❖ bash下还可以再重新启动一个shell,这个shell是sub shell,原shell会复制自身给他
❖ 在sub shell中定义的变量,会随着sub shell的消亡而消失
❖ () 子shell中运行
❖ {} 当前shell中执行
❖ $$ 当前脚本执行的pid
❖ & 后台执行
❖ $!运行在后台的最后一个作业的PID(进程ID)
bash教程_第20张图片

 

Shell环境变量

❖ Shell先是一个工作环境,有很多变量可以供我们使用。
❖ set 可以获得当前的所有变量
❖ env可以获得可以传递给子进程的变量
❖ export aa=bbbb 把私有变量导出

 

set 可打印全部变量

bash教程_第21张图片

bash教程_第22张图片

env  可被子进程继承的变量

bash教程_第23张图片

bash教程_第24张图片

变量不会被传递到子进程

bash教程_第25张图片

解决方法

bash教程_第26张图片

PATH变量可传递到子进程中

Shell 输入输出

❖ Read 用来读取输入,并赋值给变量(遇到回车停止读取)

❖ echo ,printf可以简单输出变量。
❖ > file 将输出重定向到另一个文件件
❖ >> 表示追加 等价于tee -a
❖ < file 入重定向

 

read 后的符号不重要,读到

bash教程_第27张图片

bash教程_第28张图片

echo打印自动追加换行

printf 不换行

bash教程_第29张图片

❖ | 表示管道,也就是前一个命令的输出传入下一个命令的输入

 

文件描述符(跳过)

输入文件—标准输入0
❖ 输出文件—标准输出1
❖ 错误输出文件—标准错误2
❖ curl
❖ 使用 2>&1 >/tmp/tmp < /tmp/tmp  (重定向)

 

接口入门测试

bash教程_第30张图片

Linux中more和less命令用法 - 辞雀 - 博客园

[13426257806@izuf60jasqavbxb9efockpz ~]$ open /tmp/1.html
Couldn't get a file descriptor referring to the console

 

重定向

 

 

 

 

通配

❖ Bash可以⾃动扩展特定的关键词
❖ Echo * 在shell中表示当前文件
❖ Echo ????
❖ 放⼊到引号中可以避免转义
❖ Echo "* ????"

 

脚本应用自动化

脚本

❖ 注释
❖ 传入参数
❖ 函数
❖ 执行
❖ 调试

注释

❖ #以后的语句,shell不会解析。
❖ 多行注释可以考虑采用:<<

 

函数

❖ [function] name()
❖ {
❖ ..
❖ }
❖ Function 可以省略。除了可以在脚本文件中使用函数外,还可以shell中定义。这些定义会在本次shell结束后消失。
❖ 如果没有return,返回值是最后一句指令的返回值。

bash教程_第31张图片

 

传参

❖ $0 表示知晓的程序,是相对于执行目录的路径
❖ $1 ,$2 ,$3 分别表示第一个参数。默认shell只支持9个参数,使用shift可以传递更多的参数。
❖ $@,$* 表示所有的参数,不含$0
❖ ${#*}和${#@}表示位置参数的个数
❖ 通过${*:1:3}, ${*:$#} 来表示多个参数。

bash教程_第32张图片

bash教程_第33张图片

 

 

$@ PK $* (跳过)

❖ $@ 可以在函数之间传递参数,并不改变参数的排列
    ❖ 比如 1 2 3 ‘ 4 5 “6 7” 8 ‘ 。这个参数在经过多次传递后,依然表示4个参数
    ❖ 记得使用”$@” ,不要直接使用$@
❖ $* 会把参数打散。相对顺序不变,但是参数的个数就变成8个了。
❖ 演示方法 ff()
❖ ff(){ for d in $@ "$@" $* "$*"; do echo $d ; done; } ; ff 1 2 '3 "4 5" 6' 7"8 9"

 

 

执行方式

❖ chmod u+x xxx.sh; ./xxx.sh(这种方式会开启一个sub shell)

❖ bash xxx.sh (这种方式会开启一个sub shell)

 

创建文件

bash教程_第34张图片

 

bash教程_第35张图片

文件移动到PATH路径,不需要输入路径可直接读取

 

bash教程_第36张图片

 

bash教程_第37张图片

 

变量仅在子进程中

bash教程_第38张图片

❖ source xxx.sh (在当前shell中执行 . Xxx.sh 同义)

source 将子进程在当前shell中执行, bash/sh 会释放子进程 (简写为 .)

bash教程_第39张图片

bash教程_第40张图片

❖ eval 可以执行shell原义语句

❖ exec 尽量不要使用,这会破坏当前的shell

 

 

debug

❖ bash –x (读取每一句,并执行,可以方便的看到执行的语句)

bash教程_第41张图片

❖ set –x 在当前shell中调试,set +x还原
❖ trap 相关的信号,包括ERR,DEBUG等

❖ trap ‘cmd’ ERR

 

 

删除PATH变量中的错误地址

1.

bash教程_第42张图片

 

linux三剑客 grep+awk+sed
 

is 

LKJ,/LK/ 

`23560O9 

你可能感兴趣的:(霍克沃兹)