Shell最全笔记 就决定用你了

一.简介

Shell最全笔记 就决定用你了_第1张图片

 Shell最全笔记 就决定用你了_第2张图片

 Shell最全笔记 就决定用你了_第3张图片

 二.shell脚本

2.1什么是

Shell最全笔记 就决定用你了_第4张图片

 2.2shebang

 2.3第一个脚本

简单输出一句话

shell脚本

#!/bin/bash
echo "我是你爹"

执行:./demo1.sh

python脚本

#!/usr/bin/python
#coding:utf-8
print("我是你爹")

执行:.python pydemo.py

2.4脚本注释

Shell最全笔记 就决定用你了_第5张图片

 Shell最全笔记 就决定用你了_第6张图片

2.5执行shell脚本的方式

Shell最全笔记 就决定用你了_第7张图片

2.6shell与运维

Shell最全笔记 就决定用你了_第8张图片

2.7弱类型

Shell最全笔记 就决定用你了_第9张图片

 2.8其它脚本语言

Shell最全笔记 就决定用你了_第10张图片

2.9shell的优势

Shell最全笔记 就决定用你了_第11张图片

 

2.10命令历史

Shell最全笔记 就决定用你了_第12张图片

2.11shell变量

Shell最全笔记 就决定用你了_第13张图片

 Shell最全笔记 就决定用你了_第14张图片

 2.12父子shellShell最全笔记 就决定用你了_第15张图片

sh命令执行 shell脚本后创建一个bash的进程 所以,可以看到再次输出name的时候是输出的

子shell中的变量

[root@VM-4-3-centos shelldemo]# vim mk_var.sh
[root@VM-4-3-centos shelldemo]# cat mk_var.sh
name="大西瓜"
[root@VM-4-3-centos shelldemo]# ll
total 12
-rwxr-xr-x 1 root root 32 Apr  8 17:40 demo1.sh
-rw-r--r-- 1 root root 17 Apr  8 19:14 mk_var.sh
-rwxr-xr-x 1 root root 54 Apr  8 17:51 pydemo.py
[root@VM-4-3-centos shelldemo]# bash mk_var.sh
[root@VM-4-3-centos shelldemo]# name="大菠萝"
[root@VM-4-3-centos shelldemo]# echo $name
大菠萝
[root@VM-4-3-centos shelldemo]# 
[root@VM-4-3-centos shelldemo]# vim mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr

[root@VM-4-3-centos shelldemo]# sh mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr

[root@VM-4-3-centos shelldemo]# source mk_var1.sh
[root@VM-4-3-centos shelldemo]# echo $userr
root
[root@VM-4-3-centos shelldemo]# cat mk_var1.sh
userr=`whoami`

 Shell最全笔记 就决定用你了_第16张图片

Shell最全笔记 就决定用你了_第17张图片

 2.13单双引号的区别

建议都用双引号 双引号能识别特殊字符,单引号只会原样输出单引号中的内容

[root@VM-4-3-centos bin]# name=libai
[root@VM-4-3-centos bin]# echo '${name}'
${name}
[root@VM-4-3-centos bin]# echo "${name}"
libai 

2.14shell面试题

Shell最全笔记 就决定用你了_第18张图片

2.15 bash_profile

这玩意用户登录时就会执行,并且执行后的变量只在当前用户下可见

[root@VM-4-3-centos ~]# echo $name
我是你爹111
[root@VM-4-3-centos ~]# cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

name="我是你爹111"

export PATH
[root@VM-4-3-centos ~]# useradd robert
[root@VM-4-3-centos ~]# sudo - robert
sudo: -: command not found
[root@VM-4-3-centos ~]# su - robert
[robert@VM-4-3-centos ~]$ echo $name

2.16环境变量与系统中的配置文件

Shell最全笔记 就决定用你了_第19张图片

2.17用户变量与全局变量

需要给用户设置该用户范围内可见变量 修改 bash_profile

需要设置全局变量 也就是所有用户可见 修改 etc下的profile

Shell最全笔记 就决定用你了_第20张图片

2.18设置只读变量

Shell最全笔记 就决定用你了_第21张图片

2.19 使用awk命令查看所有全局变量名

可以看到很多我们熟悉的,比如之前设置的JAVA_HOME

还有 HISTSIZE HOSTNAME等本身自带的

[root@VM-4-3-centos ~]# env |awk -F '=' '{print $1}'
HOSTNAME
SSL_CERT_FILE
TERM
SHELL
HISTSIZE
USER
LS_COLORS
USERNAME
PATH
MAIL
PWD
JAVA_HOME
TST_HACK_BASH_SESSION_ID
LANG
SSL_CERT_DIR
SHLVL
HOME
LOGNAME
CLASSPATH
LESSOPEN
PROMPT_COMMAND
HISTTIMEFORMAT

2.20bash多命令执行

bash支持一次性执行多条命令 跟mysql一样 以分号分开即可

Shell最全笔记 就决定用你了_第22张图片

2.21环境变量初始化及加载顺序 

Shell最全笔记 就决定用你了_第23张图片

2.22 $0 $n $# $* $@ 等特殊变量的使用与区别

Shell最全笔记 就决定用你了_第24张图片

 Shell最全笔记 就决定用你了_第25张图片

 Shell最全笔记 就决定用你了_第26张图片

 Shell最全笔记 就决定用你了_第27张图片

2.23特殊状态变量

Shell最全笔记 就决定用你了_第28张图片

 man bash 然后

/Special Para        

Shell最全笔记 就决定用你了_第29张图片

2.24小练习 判断当前执行脚本参数是否为两个 若不是则给出提示

记得 []中内容两侧要空格不然会报错 ./special_statusvar.sh: line 2: [0: command not found

[root@VM-4-3-centos shelldemo]# cat special_statusvar.sh
#!/bin/bash
[$# -ne 2]&&{
echo "must be two params"
exit 119
}
echo "执行成功"
[root@VM-4-3-centos shelldemo]# vim special_statusvar.sh 
[root@VM-4-3-centos shelldemo]# ./special_statusvar.sh
must be two params
[root@VM-4-3-centos shelldemo]# ./special_statusvar.sh aa bb
执行成功
[root@VM-4-3-centos shelldemo]# 

2.25shell字串常用命令

Shell最全笔记 就决定用你了_第30张图片

 2.25.1 echo 与 printf 

Shell最全笔记 就决定用你了_第31张图片

  2.25.2 eval

Shell最全笔记 就决定用你了_第32张图片

  2.25.3 exec

Shell最全笔记 就决定用你了_第33张图片

2.26 shell中字符串的常见方法

就像java中有各种字符串的方法比如 截取 替换等等 

Shell最全笔记 就决定用你了_第34张图片

2.27统计不同方式计算字符串长度的消耗时间

结论:shell内置命令${#var} 最快

Shell最全笔记 就决定用你了_第35张图片

Shell最全笔记 就决定用你了_第36张图片

Shell最全笔记 就决定用你了_第37张图片

Shell最全笔记 就决定用你了_第38张图片

2.28字符串截取常见方式

Shell最全笔记 就决定用你了_第39张图片

2.29字符串局部批量替换小案例

如下,批量把文件名中的 juege替换为juejue

[root@VM-4-3-centos shelldemo]# touch juege_{1..5}.jpg
[root@VM-4-3-centos shelldemo]# ls
demo1.sh  juege_1.jpg  juege_2.jpg  juege_3.jpg  juege_4.jpg  juege_5.jpg  mk_var1.sh  pydemo.py  special_statusvar.sh
[root@VM-4-3-centos shelldemo]# ls *.jpg
juege_1.jpg  juege_2.jpg  juege_3.jpg  juege_4.jpg  juege_5.jpg
[root@VM-4-3-centos shelldemo]# for file_name in `ls *.jpg`;do mv $file_name `echo ${file_name/ju*ge/juejue}`;
> done
[root@VM-4-3-centos shelldemo]# ll
total 16
-rwxr-xr-x 1 root root 32 Apr  8 17:40 demo1.sh
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_1.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_2.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_3.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_4.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_5.jpg
-rw-r--r-- 1 root root 15 Apr  8 19:26 mk_var1.sh
-rwxr-xr-x 1 root root 54 Apr  8 17:51 pydemo.py
-rwxr-xr-x 1 root root 87 Apr  9 12:23 special_statusvar.sh

 2.30shell中的扩展变量,用于变量判空处理

Shell最全笔记 就决定用你了_第40张图片

 2.31判空处理小练习

find dir_path -name pattern :查找文件夹中符合pattern的文件

这里用:=判断查找的文件夹名是否有效 比如如果不存在就替换为dir_path

[root@VM-4-3-centos shelldemo]# ll
total 16
-rwxr-xr-x 1 root root 32 Apr  8 17:40 demo1.sh
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_1.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_2.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_3.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_4.jpg
-rw-r--r-- 1 root root  0 Apr  9 22:48 juejue_5.jpg
-rw-r--r-- 1 root root 15 Apr  8 19:26 mk_var1.sh
-rwxr-xr-x 1 root root 54 Apr  8 17:51 pydemo.py
-rwxr-xr-x 1 root root 87 Apr  9 12:23 special_statusvar.sh
[root@VM-4-3-centos shelldemo]# dir_path=/shelldemo
[root@VM-4-3-centos shelldemo]# find ${dir_pp:=$dirpath} -name "juege*"
[root@VM-4-3-centos shelldemo]# find ${dir_pp:=$dirpath} -name "juejue*"
./juejue_2.jpg
./juejue_5.jpg
./juejue_3.jpg
./juejue_1.jpg
./juejue_4.jpg

2.32父子shell进一步理解

2.32.1 为啥要学习父子shell

Shell最全笔记 就决定用你了_第41张图片

 2.32.2sh与bash的区别

Shell最全笔记 就决定用你了_第42张图片

2.32.3shell脚本执行方式回顾

Shell最全笔记 就决定用你了_第43张图片

2.32.4使用$BASH_SUBSHELL 看是否在子shell以及子shell的层级 

Shell最全笔记 就决定用你了_第44张图片

 2.32.5使用()开启子shell,多少个()开多少层子shell

Shell最全笔记 就决定用你了_第45张图片

Shell最全笔记 就决定用你了_第46张图片 Shell最全笔记 就决定用你了_第47张图片

2.32.6使用pstree及ps -ef --forest查看进程列表

Shell最全笔记 就决定用你了_第48张图片

ps -ef --forest看到的就是以下效果 

Shell最全笔记 就决定用你了_第49张图片

2.33内置命令与外置命令区别 

简单来说内置命令启动时加载到内存,运行速度更快,使用 type 即可查看是否是内置命令

使用compgen -b查看所有内置命令

Shell最全笔记 就决定用你了_第50张图片

Shell最全笔记 就决定用你了_第51张图片

[root@VM-4-3-centos shelldemo]# type cd
cd is a shell builtin
[root@VM-4-3-centos shelldemo]# type exit
exit is a shell builtin
[root@VM-4-3-centos shelldemo]# compgen -b
.
:
[
alias
bg
bind
break
builtin
caller
cd
command
compgen
complete
compopt
continue
declare
dirs
disown
echo
enable
eval
exec
exit
export
false

2.34source和. bash和sh执行shell脚本的不同

Shell最全笔记 就决定用你了_第52张图片

2.35${vars} $() `` () $vars符号的使用区别

$() 与 `` 都是在当前shell执行命令 

()是开启子shell执行命令

${vars} 与 $vars是取值

Shell最全笔记 就决定用你了_第53张图片

2.36shell中的常见运算符号与运算命令

Shell最全笔记 就决定用你了_第54张图片

Shell最全笔记 就决定用你了_第55张图片

 Shell最全笔记 就决定用你了_第56张图片

2.37综合小练习:编写一个进行数学运算的脚本 参数非法时进行提示

[root@VM-4-3-centos shelldemo]# . caculation.sh 12 + a
12
this is a script for math caculation pls enter number1 operator number2 as three parameters

脚本内容如下

1.该脚本编写注意事项  必须双括号才是进行数值运算

2.if 后的[] 中内容前后必须要有空格

3.$?的值为上一条命令执行的结果 如果不为1表示执行失败 

[root@VM-4-3-centos shelldemo]# cat caculation.sh
#!/bin/bash
echo "$(($1$2$3))"
if [ $? != 1 ];
then 
echo "this is a script for math caculation pls enter number1 operator number2 as three parameters"
fi

2.38小练习二 检测nginx服务是否存活

Shell最全笔记 就决定用你了_第57张图片

2.39expr命令

Shell最全笔记 就决定用你了_第58张图片Shell最全笔记 就决定用你了_第59张图片

 2.40 案例一 编写脚本使用expr命令判断文件名后缀是否符合要求

[root@VM-4-3-centos shelldemo]# . expr_demo.sh aa.jpg
符合要求
[root@VM-4-3-centos shelldemo]# . expr_demo.sh aa.png
请输入以jpg结尾的文件名
[root@VM-4-3-centos shelldemo]# cat expr_demo.sh
#!/bin/bash

if expr "$1" ":" ".*\.jpg" &> /dev/null
        then echo "符合要求"
else echo "请输入以jpg结尾的文件名"
fi
[root@VM-4-3-centos shelldemo]# 

2.41编写个脚本判断参数中所有长度不大于5的单词

用./ 执行需要先加权限  chmod +x for_expr_demo.sh

[root@VM-4-3-centos shelldemo]# ./for_expr_demo.sh hello you are welcome to china , I am your father
长度不大于5的参数是
you
are
to
,
I
am
your
[root@VM-4-3-centos shelldemo]# cat for_expr_demo.sh
#!/bin/bash

echo "长度不大于5的参数是";
for word in $*
 do 
    if [ `expr length $word` -lt 5 ]
        then
            echo $word;
    fi    
done
[root@VM-4-3-centos shelldemo]#

2.42使用多种方式计算1到200中所有数字之和

2.42.1使用bc命令

tr命令:text replace,  下面报错原因是 tr前面也需要管道符

[root@VM-4-3-centos ~]# echo {1..200}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
[root@VM-4-3-centos ~]# echo {1..200} tr " " "+" |bc 
(standard_in) 1: syntax error
[root@VM-4-3-centos ~]# echo {1..200}|tr " " "+" |bc 
20100

2.42.2使用双括号计算

seq 10 生成1到10十个数字 seq -s +10 生成十个数字的同时使用+号连接

我们再使用之前说过的双括号运算即可 记得双括号内命令左右要加`` 外面要加$

[root@VM-4-3-centos ~]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@VM-4-3-centos ~]# seq -s + 10
1+2+3+4+5+6+7+8+9+10
[root@VM-4-3-centos ~]# echo $((`seq -s + 200`)) 
20100

2.42.3使用expr

记得接收参数的命令是xargs 我第一次写成了 args

[root@VM-4-3-centos shelldemo]# seq -s " + " 10 | xargs expr
55


2.43 read 命令 

Shell最全笔记 就决定用你了_第60张图片

2.44 test 及单双中括号进行条件判断

  强调:对变量进行条件判断必须加双引号

Shell最全笔记 就决定用你了_第61张图片

Shell最全笔记 就决定用你了_第62张图片

 Shell最全笔记 就决定用你了_第63张图片

 使用 test 或者 [ ] 或者[[]] 进行条件判断

[root@VM-4-3-centos shelldemo]# touch aaa.sh
[root@VM-4-3-centos shelldemo]# echo `test -e aaa.sh`

[root@VM-4-3-centos shelldemo]# test -e aaa.sh && echo "aaa.sh 已存在" || touch aaa.sh
aaa.sh 已存在
[root@VM-4-3-centos shelldemo]# [ -e "aaa" ] && echo "aaa 文件已存在" || touch aaa
aaa 文件已存在
[root@VM-4-3-centos shelldemo]# a=20
[root@VM-4-3-centos shelldemo]# [[ $a > 5 ]] && echo "a的值大于5" || echo "a的值小于等于5"
a的值小于等于5
[root@VM-4-3-centos shelldemo]# [[ $a > 5 ]] && echo "a的值小于等于5" || echo "a的值大于5"
a的值大于5
[root@VM-4-3-centos shelldemo]# 

 单中括号 [ ] 与 双中括号的异同

单中括号 [ ]
a. [ ] 两个符号左右都要有空格分隔
b. 内部操作符与操作变量之间要有空格:如 [“a” = “b” ]
c. 字符串比较中,> < 需要写成 \> \< 进行转义
d. [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,以避免值未定义引用而出错
e. [ ] 中可以使用 –a –o 进行逻辑运算
f. [ ] 是bash 内置命令:[ is a shell builtin

双中括号
a. [[ ]] 两个符号左右都要有空格分隔
b. 内部操作符与操作变量之间要有空格:如 [[ “a’ = “b” ]]
c. 字符串比较中,可以直接使用 > < 无需转义
d. [[ ]] 中字符串或者${}变量尽量使用”" 双引号扩住,如未使用""会进行模式和元字符匹配
e. [[ ]] 内部可以使用 && || 进行逻辑运算
f. [[ ]] 是bash keyword:[[ is a shell keyword

2.45成为高级shell开发得多看大神写的好脚本

比如查看 

/etc/init.d/functions

/etc/init.d/mysql

脚本

2.46数值比较符号 :大于 小于 等于 不等于等在[],test,(()),[[]]中的不同表达

Shell最全笔记 就决定用你了_第64张图片

2.47逻辑运算符号  && || -a -o 分别在什么时候能用

&& ||跟java中一样

Shell最全笔记 就决定用你了_第65张图片

Shell最全笔记 就决定用你了_第66张图片

2.48 [] test [[]] (())的区别,常用[]

Shell最全笔记 就决定用你了_第67张图片

2.49综合脚本编写

让用户选择输入数字,数字对应会执行命令 这里比较简单就不写了

Shell最全笔记 就决定用你了_第68张图片

2.50if then,if then ifel then 等条件判断分支语句 

注意事项 一个if 对应 一个 fi  然后 [] 或者[[]]中内容首尾都要加空格

Shell最全笔记 就决定用你了_第69张图片

Shell最全笔记 就决定用你了_第70张图片 

 Shell最全笔记 就决定用你了_第71张图片

 Shell最全笔记 就决定用你了_第72张图片

 

2.50使用awk获取当前内存剩余多少兆

NR:number of row 行数 起始行为1 NF:number of field 总列数

所以如下两条命令的效果一样,因为总列数为7 值不同是因为两次命令删除的间歇刚好消耗了1m

[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $NF}'
2746

[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $7}'
2745

[root@VM-4-3-centos ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3694         659         132           0        2902        2746
Swap:             0           0           0
[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $NF}'
2746

[root@VM-4-3-centos ~]# free -m | awk 'NR==2 {print $7}'
2745

Shell最全笔记 就决定用你了_第73张图片

 Shell最全笔记 就决定用你了_第74张图片

 

2.51if else练习:编写一个脚本传入两个参数 比较大小后输出告诉运行者

2.52使用 php或者python连接mysql 然后判断连接是否成功

Shell最全笔记 就决定用你了_第75张图片

 Shell最全笔记 就决定用你了_第76张图片

 Shell最全笔记 就决定用你了_第77张图片

 

你可能感兴趣的:(servlet,html,前端)