一.简介
二.shell脚本
2.1什么是
2.2shebang
2.3第一个脚本
简单输出一句话
shell脚本
#!/bin/bash
echo "我是你爹"
执行:./demo1.sh
python脚本
#!/usr/bin/python
#coding:utf-8
print("我是你爹")
执行:.python pydemo.py
2.4脚本注释
2.5执行shell脚本的方式
2.6shell与运维
2.7弱类型
2.8其它脚本语言
2.9shell的优势
2.10命令历史
2.11shell变量
2.12父子shell
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`
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面试题
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环境变量与系统中的配置文件
2.17用户变量与全局变量
需要给用户设置该用户范围内可见变量 修改 bash_profile
需要设置全局变量 也就是所有用户可见 修改 etc下的profile
2.18设置只读变量
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一样 以分号分开即可
2.21环境变量初始化及加载顺序
2.22 $0 $n $# $* $@ 等特殊变量的使用与区别
2.23特殊状态变量
man bash 然后
/Special Para
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字串常用命令
2.25.1 echo 与 printf
2.25.2 eval
2.25.3 exec
2.26 shell中字符串的常见方法
就像java中有各种字符串的方法比如 截取 替换等等
2.27统计不同方式计算字符串长度的消耗时间
结论:shell内置命令${#var} 最快
2.28字符串截取常见方式
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中的扩展变量,用于变量判空处理
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
2.32.2sh与bash的区别
2.32.3shell脚本执行方式回顾
2.32.4使用$BASH_SUBSHELL 看是否在子shell以及子shell的层级
2.32.5使用()开启子shell,多少个()开多少层子shell
2.32.6使用pstree及ps -ef --forest查看进程列表
ps -ef --forest看到的就是以下效果
2.33内置命令与外置命令区别
简单来说内置命令启动时加载到内存,运行速度更快,使用 type 即可查看是否是内置命令
使用compgen -b查看所有内置命令
[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脚本的不同
2.35${vars} $() `` () $vars符号的使用区别
$() 与 `` 都是在当前shell执行命令
()是开启子shell执行命令
${vars} 与 $vars是取值
2.36shell中的常见运算符号与运算命令
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服务是否存活
2.39expr命令
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 命令
2.44 test 及单双中括号进行条件判断
强调:对变量进行条件判断必须加双引号
使用 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,(()),[[]]中的不同表达
2.47逻辑运算符号 && || -a -o 分别在什么时候能用
&& ||跟java中一样
2.48 [] test [[]] (())的区别,常用[]
2.49综合脚本编写
让用户选择输入数字,数字对应会执行命令 这里比较简单就不写了
2.50if then,if then ifel then 等条件判断分支语句
注意事项 一个if 对应 一个 fi 然后 [] 或者[[]]中内容首尾都要加空格
文章来源地址https://www.toymoban.com/news/detail-411738.html
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
2.51if else练习:编写一个脚本传入两个参数 比较大小后输出告诉运行者
2.52使用 php或者python连接mysql 然后判断连接是否成功
文章来源:https://www.toymoban.com/news/detail-411738.html
到了这里,关于Shell最全笔记 就决定用你了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!