一. 输入输出重定向 回顾1 输入输出重定向
输入
read -p “请输入” a -p 提示 a 赋值给a
read -s 密码隐藏
输出
echo
# echo -e “abc\t abc” 转义字符输出
abc abc
# echo “abc\t abc”
abc\t abc
echo -n 不接换行
echo -e 转义字符输出
二. 2个特殊文件 知识点2 2个特殊文件
两个特殊文件
·/dev/null
:过滤标准错误信息
·/dev/zero
:用来创建指定长度文件
/dev/null
:黑洞文件,不保存,不输出的信息,就丢到黑洞文件
/dev/zero
:用来生成指定大小的文件,生成一堆0
示例:/dev/zero
:用来生成指定大小的文件,生成一堆0
/dev/zero
一般用作生成指定大小的文件,做测试用
dd是一个备份命令,也可以产生一个指定大小的文件
if 输入文件 input file
of 输出文件 output file
bs 输出的数据的单位大小
count 输出的数据单位数量
示例:___________________________ ____________________________
1 2 3 4 5 6 7 [root@sanchuang-linux dev] 记录了5+0 的读入 记录了5+0 的写出 5242880 bytes (5.2 MB, 5.0 MiB) copied, 0.00196718 s, 2.7 GB/s [root@sanchuang-linux dev] 5.0M /tmp/test.dd if 从哪里导进来 , of 导出去这个文件 , bs 数据单位大小 , count数据单位数量
三. here document 知识点3 here document
here document 文档就在这里
<<
生成一个指定内容的文档。
简单脚本中使用
示例:
-----------------------------------------------------------
[root@sanchuang-linux chenpeng]# cat >here_test.txt <<EOF
> nihao > sanchuang > huanying > world… > x y z\> EOF
[root@sanchuang-linux chenpeng]# cat here_test.txt nihao sanchuang huanying world… x y z
知识点3.2 EOF是文档结束标志 可以自行定义 (end of file)
示例:
------------------------------------------------------
[root@sanchuang-linux chenpeng]# cat >here_test <<XYZ
> nihao > hello world> XYZ
[root@sanchuang-linux chenpeng]# cat here_test nihao hello world
四. tee命令 知识点4 tee命令
tee命令 输出到屏幕也重定向到文件
示例:
----------------------------------
[root@sanchuang-linux chenpeng]# echo “aa” >test_aa.txt #(注:默认不输出到屏幕) [root@sanchuang-linux chenpeng]# cat test_aa.txt aa [root@sanchuang-linux chenpeng]# echo "bb" |tee test_bb.txt #
(注:屏幕+文件) bb [root@sanchuang-linux chenpeng]# cat test_bb.txt bb
五. 清空文件内容 知识点5 清空文件内容
[root@sanchuang-linux chenpeng]# >test_bb.txt
[root@sanchuang-linux chenpeng]# echo > test_bb.txt
#(注:有换行) [root@sanchuang-linux chenpeng]# cat test_bb.txt
[root@sanchuang-linux chenpeng]# echo -n > test_bb.txt
[root@sanchuang-linux chenpeng]# cat test_bb.txt [root@sanchuang-linux chenpeng]# :>test_bb.txt
[root@sanchuang-linux chenpeng]# cat test_bb.txt
知识点6 echo
echo
在屏幕上显示一段文字或指定内容
输出变量,输出指定内容
-e 选项 转义字符输出
-n 选项 不接换行
六. SHELL入门 shell入门
shell 是一个用C语言写的程序,它是用户使用linux的桥梁
shell 脚本 实现自动化 重复性的操作编写脚本完成,减少人工失误
SHELL的变量 shell的变量
1、局部变量 定义在脚本或命令中
2、环境变量 shell启动的程序能访问到的环境变量 env、 echo $PATH
3、shell变量
1 2 3 4 5 6 7 8 9 10 11 12 示例:环境变量 ------------------------------------------ [root@sanchuang-linux chenpeng] alias ls ='ls --color=auto' /usr/bin/ls [root@sanchuang-linux chenpeng] /lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/root/bin:/usr/local/nginx5/sbin:/root/bin 示例2:局部变量 ------------------------------------------- a=1 echo $a echo ${a}
知识点8.2 变量名命名规则
变量名命名规则:
由数字、字母、下划线组合,不能以数字开头
不能使用bash中的关键字
使用一个定义过的变量,需要在前面加上$符号
1 2 3 4 示例: -------------------------------------------- [root@sanchuang-linux chenpeng] /lianxi/sc:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin:/root/bin:/usr/local/nginx5/sbin:/root/bin
SHELL接收参数 知识点9 shell接收参数
shell接收
位置变量 :$1 - $9 ,分别代表参数列表中的 第1 - 9 个参数
可以重复使用(即脚本里可以出现两个$1)
预定义变量,系统预留的一些变量:
$0 当前进程 或者 脚本名称
$! 后台运行的最后一个进程的pid号
$? 上一条命令程序返回值
$* 代表所有参数内容
$$ 表示当前进程pid号
$# 表示参数个数
$@ 代表所有参数(逐个提取)
# perror 1
查看命令的返回值,并且看返回值的具体含义
$? 命令返回值为0 表示正常执行
不为0 都表示运行错误
1 2 3 4 5 示例如下:__________________________________ [root@mysql-binary shell_test] 1 [root@mysql-binary shell_test] OS error code 1: Operation not permitted
#!/bin/bash 脚本前最好加上这一行,默认使用什么解释器去执行
原因:类unix操作系统,unbuntu、debian、centos每个操作系统的默认bash可能不一样
示例1:位置变量$1、$2
__________________________________
[root@sanchuang-linux shell_test]# cat canshu.sh #!/bin/bash
echo “########这是$1########” #(注:位置变量) echo “$1” #(注:位置变量) echo “########这是$2########” #(注:位置变量) echo “$2” #(注:位置变量) [root@sanchuang-linux shell_test]# sh canshu.sh "hello" "world" #
(注:传了2个参数) ########这是hello######## #(注:参数1) hello ########这是world######## #(注:参数2) world
示例2:预定义变量 $0
__________________________________________________________
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@sanchuang-linux shell_test] -bash [root@sanchuang-linux shell_test] hello world canshu.sh [root@sanchuang-linux shell_test] echo "########这是$1 ########" echo "$1 " echo "########这是$2 ########" echo "$2 " echo "$0 "
示例3:预定义变量 $* $# $@
_____________________
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@sanchuang-linux shell_test] echo "########这是$1 ########" echo "$1 " echo "########这是$2 ########" echo "$2 " echo "$0 " echo "这是所有:$*" echo "参数#:$# " echo "这是@:$@ " ────────────────────────────────────────────── [root@sanchuang-linux shell_test] hello world canshu.sh 这是所有:hello world 2020 参数 这是@:hello world 2020
知识点10 python中接收参数 sys模块
python中
sys模块里面的argv属性。python后面 传过来的参数是一个列表
,然后获取第一个第二个
1 2 3 4 5 6 7 8 9 [root@sanchuang-linux ~] import sysprint (sys.argv[1 ],sys.argv[2 ]) print (sys.argv[0 ]) ---------------------------------------------------------------------- [root@sanchuang-linux ~] hello world canshu.py
数据类型 知识点11 数据类型
shell常用数字、字符串、数组
字符串的定义,可以使用单引号,也可以使用双引号,也可以不用引号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 示例:字符串的定义__________________ [root@sanchuang-linux ~] abc [root@sanchuang-linux ~] [root@sanchuang-linux ~] b [root@sanchuang-linux ~] [root@sanchuang-linux ~] b [root@sanchuang-linux ~] [root@sanchuang-linux ~] b 示例:数字的定义_________________ [root@sanchuang-linux ~] [root@sanchuang-linux ~]
引号区别 知识点12 引号区别:双引号可以识别变量,单引号不可以识别变量
引号区别:双引号可以识别变量,单引号不可以
1 2 3 4 [root@sanchuang-linux ~] root:x:0:0:root:/root:/bin/bash [root@sanchuang-linux ~] root:x:0:0:root:/root:/bin/bash
1 2 3 4 5 6 7 8 #!/bin/bash line=`head -n1 /etc/passwd` echo $line --------------------------------------------------------------------------------- [root@sanchuang-linux chenpeng] root:x:0:0:root:/root:/bin/bash
示例:双引号可以识别变量,单引号不可以识别变量_____________________________
1 2 3 4 5 echo "字符串为:$line " 字符串为:root:x:0:0:root:/root:/bin/bash ------------------------------------------ echo '字符串为:$line' 字符串为:$line
字符串操作 知识点13 字符串操作
1 2 3 4 5 6 7 8 9 截取 截取前4个字符:echo ${line:0:4} 截取后9个字符 echo ${line:0-9} 从倒数第九个字符开始截取4个字符 echo ${line:0-9:4} 从左向右截取最后一个:后的字符 echo ${line##*:} 从左向右截取第一个:后的字符 echo ${line#*:} 从右往左截取最后一个:后的字符 echo ${line%%:*} 从右向左截取第一个:后的字符 echo ${line%:*} 字符串长度 echo ${#line}
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 示例:字符串操作_______________________________ [root@sanchuang-linux chenpeng] line=`head -n1 /etc/passwd` echo $line echo "字符串为:$line " echo '字符串为:$line' echo "截取前4个字符:" echo ${line:0:4} echo "截取后9个字符" echo ${line:0-9} echo "从倒数第九个字符开始截取4个字符" echo ${line:0-9:4} echo "从左向右截取最后一个:后的字符" echo ${line##*:} echo "从左向右截取第一个:后的字符" echo ${line#*:} echo "从右往左截取最后一个:后的字符" echo ${line%%:*} echo "从右向左截取第一个:后的字符" echo ${line%:*} echo "字符串长度" echo ${#line} ----------------------------------------------- [root@sanchuang-linux chenpeng] root:x:0:0:root:/root:/bin/bash 字符串为:root:x:0:0:root:/root:/bin/bash 字符串为:$line 截取前4个字符: root 截取后9个字符 /bin/bash 从倒数第九个字符开始截取4个字符 /bin 从左向右截取最后一个:后的字符 /bin/bash 从左向右截取第一个:后的字符 x:0:0:root:/root:/bin/bash 从右往左截取最后一个:后的字符 root 从右向左截取第一个:后的字符 root:x:0:0:root:/root 字符串长度 31
练习13 截取百度网址
1 2 3 4 5 6 7 8 9 10 11 12 13 14 line="http://www.baidu.com/login" echo ${line:0-5} echo ${line##*/} echo ${line##*//} echo ${line%/*} echo ${line%%/*}
数值的运算与比较 知识点14 数值的运算与比较
数值的运算: 第一种: $(( 表达式 ))
第二种: $[ 表达式 ]
第三种: expr 表达式
注意表达式运算符左右空格
1 2 3 4 5 6 7 8 9 10 11 12 13 示例:↓↓↓↓↓↓↓↓↓↓↓↓↓↓ [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] -bash: 30: 未找到命令 [root@sanchuang-linux ~] 30 [root@sanchuang-linux ~] 30 [root@sanchuang-linux ~] 30 [root@sanchuang-linux ~] 10+20
SHELL结构语句,循环和判断 知识点15 shell结构语句,循环和判断
知识点15.1 for循环
for循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 语法1:↓↓↓↓↓↓↓↓ ----------------------- for 变量 in 值1 值2do 循环执行语句 done ======================================= 语法2:↓↓↓↓↓↓↓ --------------------------------------- for ((初始化变量; 结束循环的条件; 运算))do 循环执行的语句 done
知识点15.2 while循环
While循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 语法1:↓↓↓↓↓ --------------------------------------- while read linedo 循环执行语句 done ======================================= 语法2↓↓↓↓↓↓↓↓↓ --------------------------------------- while [条件(非必选)]:do 循环执行语句 done ======================================= 注:也支持break ,continue
知识点15 判断
知识点15.3 if语句
if语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 语法1:↓↓↓↓↓ ------------------------- if 条件then 执行语句 fi ========================= 语法2:↓↓↓↓↓ if 条件then 执行语句 else 执行语句 fi ========================== 语法3:↓↓↓↓↓↓ ---------------------- if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 else 符合该条件执行的语句 fi
知识点15.4 case语句
case语句
1 2 3 4 5 6 7 8 9 10 语法:↓↓↓↓↓________________ case $变量名 in 条件1) 执行语句一 ;; 条件2) 执行语句二 ;; *) esac
练习16
编写一个shell脚本
接收用户输入的两个数,然后选择要对着两个数进行什么计算,并且输出结果
实现菜单选择
================
add 加法
sub 减法
mul 乘法
exit 退出
================
注:菜单选择用case、服务重启脚本用case
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 示例:↓↓↓↓↓↓↓↓↓_________________________ [root@sanchuang-linux chenpeng] read -p "请输入数字一:" num1read -p "请输入数字二:" num2echo "================" echo "1.add 加法" echo "2.sub 减法" echo "3.mul 乘法" echo "4.exit 退出" echo "================" read -p "请输入你的选择:" optionscase $options in 1) echo "两数相加为:$(($num1 + $num2) )" ;; 2) echo "两数相减为:$(($num1 - $num2) )" ;; 3) echo "两数相乘为:$(($num1 * $num2) )" ;; 4) echo "退出!" exit esac ------------------------------------------------------------------------------------------- 整成函数形式 add (){ echo "两数相加为:$(($num1 + $num2) )" } case $options in 1) add ;; 2)…………………………
/etc/init.d 服务的启动脚本 知识点17 /etc/init.d 服务的启动脚本
/etc/init.d/ 放着服务的启动脚本
1 2 3 [root@sanchuang-linux chenpeng] [root@sanchuang-linux init.d] functions README
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 示例:服务重启脚本用case ↓↓↓↓↓__________________ case $mode in start) 启动 ;; stop) 关闭(使用kill 命令) ;; restart) 关闭 启动 ;; reload) 重新加载配置(使用kill -HUP) ;; esac
kill 知识点18 kill
1 2 3 4 5 6 7 8 9 10 11 12 kill 用来删除正在执行中的程序或者工作kill 可以将指定的信息发送给程序kill 不接信号量的时候,默认为信号15除了9号信号,其他信号进程都有权利拒绝执行!
注:重新加载 相当于 加载最新的配置 服务还是正常运行的(连接不会断)
重启 服务会断
1 2 3 4 5 6 示例:↓↓↓↓↓↓↓↓↓____________ [root@sanchuang-linux ~] 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 ………………………… 63) SIGRTMAX-1 64) SIGRTMAX
SHELL编程 if判断 知识点19 shell编程 if判断
if 判断
1 2 3 4 5 6 7 8 9 10 11 12 示例:↓↓↓↓↓↓____________________________________________________________ [root@sanchuang-linux ~] id : “wenyao”:无此用户error -------------------------------------------------------- 等同于:↓↓↓↓↓________________________________________________ if id wenyao; then echo "ok" ; else echo "error" ; fi
[ ] 知识点20 [ ]
[ ]表示条件测试
注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格。
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 常用判断: [ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。 [ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。 [ -e **** ] 判断文件/文件夹是否存在 字符串判断: [ -z STRING ] 如果STRING的长度为零则返回为真,即空是真 [ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真 [ STRING1 ] 如果字符串不为空则返回为真,与-n类似 [ STRING1 == STRING2 ] 如果两个字符串相同则返回为真 [ STRING1 != STRING2 ] 如果字符串不相同则返回为真 [ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。 [ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。 数值判断 [ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,= [ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<> [ INT1 -gt INT2 ] INT1大于INT2返回为真 ,> [ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>= [ INT1 -lt INT2 ] INT1小于INT2返回为真 ,< [ INT1 -le INT2 ] INT1小于等于INT2返回为真,<= 逻辑判断 [ ! EXPR ] 逻辑非,如果 EXPR 是false 则返回为真。 [ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。 [ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。 [ ] || [ ] 用OR来合并两个条件 [ ] && [ ] 用AND来合并两个条件
1 2 3 4 5 6 7 8 9 10 11 12 示例:↓↓↓↓↓↓↓↓↓↓↓↓↓ [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] a<b [root@sanchuang-linux ~] a>b (注:使用2个中括号不出错) [root@sanchuang-linux ~] a<b [root@sanchuang-linux ~] 输出a<b
练习21
判断当前目录下是否存在文件a,没有的话就创建
有的话输出,输出文件已存在
1 2 3 4 5 6 7 8 9 10 示例:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 写法1: if [ -f a.txt ]; then echo "文件存在" else touch a.txt fi ------------------------------------------------- 写法2:推荐(类似python的if 三元运算符) [ -f a.txt ] && echo "文件已存在" || touch a.txt
示例2:
编写一个脚本,实现如下功能
==============
1.增加用户并设置密码
2.删除用户
3.查看用户
4.退出
==============
输入的指定不是1-4,给提示给予提醒,并且如果不输入退出的话,可以循环添加。
按1 增加用户,并且设置密码 useradd passwd
按2 删除用户 userdel -r
按3 查看用户 id
按4 退出 exit
&& || 知识点22 类似python的if三元运算符
使用&& || 来实现
·cmd1 && cmd2 如果cmd1执行成 功,或者为真,则执行cmd2
·cmd1 || cmd2 如果cmd1执行不成功,或者为假,则执行cmd2
·cmd1 && cmd2 || cmd3 如果cmd1执行成功,就执行cmd2,不成功就执行cmd3
1 2 3 4 5 6 7 8 9 10 11 12 13 示例:上个练习↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ [ -f a.txt ] && echo "文件已存在" || touch a.txt [[ -f a.txt ]] && echo "文件已存在" || touch a.txt 示例: ------------------------------------------------------------------------------------------- [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] 输出 a<b [root@sanchuang-linux ~] 输出 a<b
[] 、[[]]、 (()) (判断方式) 知识点23 [] 、[[]]、 (()) (判断方式)
会做单词拆分 很多表示都不是很支持, 建议使用[[ ]]判断(2个中括号) 总结: ·建议使用
[[ ]]来比较运算,进行判断
·字符串用
[[ ]] (推荐)·数字用比较用
(( )) 结论:建议使用[[ ]]来比较运算,进行判断
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 示例1:if 判断时 ------------------------------------------------------------------------------------------- [root@sanchuang-linux chenpeng] [root@sanchuang-linux chenpeng] -bash: [: 参数太多 error [root@sanchuang-linux chenpeng] ok [root@sanchuang-linux chenpeng] ok ============================================================================================ 示例2:数值比较 ------------------------------------------------------------------------------------------- [root@mysql-binary shell_test] 10 [root@mysql-binary shell_test] 20 [root@mysql-binary shell_test] error [root@mysql-binary shell_test] ok [root@mysql-binary shell_test] error 示例: -------------------------------------------------------------------------------------------- [root@mysql-binary shell_test] [root@mysql-binary shell_test] [root@mysql-binary shell_test] eroor [root@mysql-binary shell_test] -bash: ((: 10 -eq 20 : 表达式中有语法错误 (错误符号是 "20 ") Eroor ---------------------------------------------------------------------------- [root@mysql-binary shell_test]# c=102 [root@mysql-binary shell_test]# b=20 [root@mysql-binary shell_test]# [[ $c > $b ]] && echo "ok" || echo "eroor" eroor [root@mysql-binary shell_test]# (( $c > $b )) && echo "ok" || echo "eroor" ok 示例3:if 条件判断的2种写法 -------------------------------------------------------------------------------------------- [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] error [root@sanchuang-linux ~] error 示例:字符串比较(( )) 也可以 -------------------------------------------------------------------------------------------- [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] error [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] error [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] ok 结论:建议使用[[ ]]来比较运算,进行判断
SHELL函数 定义 知识点24 Shell函数 定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 示例: add () { echo "两数相加为:$(( $num1 + $num2 ) )" } ------------------------------------------------ 调用的时候 add case $options in 1) add ;; 2)…………………… -------------------------------------------------------------------------------------------- add (){ echo "两数相加为:$(($num1 + $num2) )" } case $options in 1) add ;; 2)…………………………
判断方式 [] [[]] (()) test 知识点25 判断方式 [] [[]] (()) test
1 2 3 4 5 6 7 8 示例:test --------------------------------------------------------------------- [root@sanchuang-linux ~] [root@sanchuang-linux ~] [root@sanchuang-linux ~] ok [root@sanchuang-linux ~] ok