2.1. 若果想输出空格需要加“”,echo "111 222" 7
5.1. 作用:减少代码量,提高代码利用率,使脚本更加清晰可读 24
shell的基本介绍
作用:用户与内核沟通的桥梁
分类:
第一类
bash
sh
csh
第二类
ksh
cat /etc/shells 查看当前系统中支持哪些shells
shell脚本
作用:将命令保存到文件中,统一执行
三p语言(解释型)
perl 解决问题的写法过多,不便于后期的团队协作,后缀.pl
python 后缀 .py
php 后缀.php
shell语言:
语言的分类
面向过程,面向对象
面向过程:shell、c
面向对象:python、java、c++
解释型、编译型
编译型:先编译,后运行 解释性:边翻译边运行
解释型语言:shell、python
编译型语言:c
强类型、弱类型
强类型语言是一种强制类型定义的语言,一旦某一个变量被定义类型,如果不经过强制转换,则它永远就是该数据类型了,强类型语言包括Java、.net 、Python、C++等语言。
弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。弱类型语言包括vb 、PHP、javascript等语言。
动态语言,静态语言
动态:在运行时定义数据类型
静态:提前定义数据类型,整个过程中不能随意转换变量类型
shell脚本编写的实现方式:编译并输出脚本全部都在子shell下执行,输出结果后重新返回父shell,所以再脚本中定义的变量并不会再当前环境下输出
shell最基础脚本以及执行环境
脚本过程
vim hello.sh
第一行:#!/bin/bash (幻数,指定解释器)
执行方法
如果想要以路径执行,赋予执行权限chmod +x hello.sh,./hello.sh 或者/root/hello.sh
或者不赋予权限,直接 bash hello.sh或者sh hello.sh
当前shell环境执行shell脚本
此执行脚本方式不会退出当前环境变量,而是直接在当前环境变量中执行脚本
实例:
注释
起到了解释说明的效果
echo输出命令
若果想输出空格需要加“”,echo "111 222"
echo -n 输出之后不换行
echo -e 支持控制字符
echo -e "\\"输出反斜杠(转义反斜杠)
\a 输出提示音(在etc/inputrc下setbell style-none注释删掉可以选择消除提示音)
\t 制表符隔开
\n 换行符
\v 垂直制表符
\x61八进制的61 输出a
字体操作
echo -e "\e[字体控制;字体背景颜色;文字颜色m 字符串 \e[0m"
字体控制:1高亮 4下划线 5闪烁 7背景字体颜色反转
字体颜色 其中30m黑色 31m红色 32m绿色 33m黄色 34m蓝色 45m洋红 36m青色 37m白色,如果相加背景颜色。41m-47m为相应的背景颜色
Bash知识点
Bash常用快捷键
ctrl+a 光标迅速移动到开头
ctrl+e 把光标移动到命令行尾
ctrl+c终止当前的进程
ctrl+d 退出当前终端
ctrl+l清屏
ctrl+u删除光标之前的内容
ctrl+w删除光标前一个单词
ctrl+k删除或剪切光标之后的内容
ctrl+y粘贴ctrl+u或者ctrl+k或者ctrl+w的内容
ctrl+r 进入历史命令搜索界面
文件描述符
内核(kernel)利用文件描述符(file descriptor)来访问文件
lsof -i :22
查看使用22端口号的进程和PID,FD中的”u“代表进程对指定的文件可读可写,如果是“r”则只可读
ulimit -n 查看用户最多可以使用的文件数(默认1024)
sysctl -a|grep "fs.file-max"显示系统级别最多能打开的文件数,僵尸进程就是占这个
输出输入重定向
设备文件名
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /etc/stderr 2 标准错误输出
输出重定向(输入输出都是以当前环境为基准)
决定输入输出的文件位置
stdin 文件描述符为0
stdout 文件描述符为1
stderr 文件描述符为2
命令 > 文件 覆盖 (标准重定向)
命令 > 文件 追加 (追加重定向)
命令 2> 文件 覆盖的方式将命令的错误输出到文件
qwe 2> abc
命令 2>> 文件 追加的方式将命令的错误输出到文件
命令 &>文件 覆盖的方式吧正确输出和错误输出都保存到同一个文件中(重要)
ls &>> abc
sdf &>> abc
命令 &>>文件 追加的方式吧正确输出和错误输出都保存到同一个文件中
命令>>文件1 2>>文件2
把正确的输出追加到文件1中,把错误的输出追加到文件2中(重要)
ls >>ok 2>>err
qwer >>ok 2>>err
快速清空文件 >a.txt
出入重定向
cat <<final>> a.txt 将cat的东西输出,当在输入final时再追加到a.txt文件中(盯着final,以final为终止)
当输入到文件使用<<>>遇到final停止进程
echo 123 | passwd --stdin user1
wc
-l 统计行数
-L 统计最长那一行的长度
-c 统计字节数
-m 统计字符
-w 统计单词数
执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!
这个时候,就可以使用EOF结合cat命令进行行内容的追加了。
通配符
‘ ’
在单引号中所有特殊符号都没有特殊含义,所见即所得
“”
$(美元符号)、\(反斜杠)、’(单引号)、和”(双引号)依然可以保留其特殊功能
`` 反引号括起来的内容是系统命令
$() 和反引号作用一样,优先执行命令
a=$(ls) echo $a 相当于输出了ls
当出现$()中再次出现引用变量,通常用$()
() 和 {}
()
name=sc
(name=1m;echo $name)
输出结果为1m,输出后与上下两条命令再无关联会退出子shell
echo $name
输出结果为sc
{ ;}和不写差不多,不常用
有时候大括号可以起到区分作用
连着写整体会被识别为变量
方法一加空格
方法二大括号
[] 用于变量的测试
#注释
$调用变量值
\转义符
name=1
echo "\$name"
输出为$name,此时$的作用被视为普通字符
变量和运算符
bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
变量名称可以由字母、数字和下划线组成,但是不能以数字开头
等号两侧不能有空格(命令格式所决定)
变量的值如果有空格,需要加双引号,没有空格的话加不加无所谓,$ ` \ 在双引号中都有其特殊含义,而单引号中的内容都是字符
变量的叠加:叠加时变量需要用双引号包含变量名
test=123
test="$test"456
echo $test
输出为123456
常用于增加变量
命令的结果赋予需要使用 `` 或$()
test=$(date)
echo $test
可以输出时间
变量分类(下一章详解)
其他语言有int char boolean型等等,而shell全是字符型
变量分类
用户自定义变量: 名称自定义 作用自定义 内容自定义
环境自变量(建议都写成大写,避免和命令冲突)
用户自定义环境自变量:名称自定义 作用自定义 内容自定义
系统自带环境变量: 命令确定 作用确定 内容自定义
位置参数变量
名称确定 作用确定 内容自定义
预定义变量
名称确定 作用确定 内容自定义
脚本数组和内置变量
数组
增
初始定义: 变量名=(值1 值2 值3)
例:array=(xiaoming xiaohong xiaogang)
单个加入array[4]=newstudent
改
删
删除单个角标
unset array[1],删除第二个
剩下的索引值不会改变
查
使用grep -w 查看是否有这个值
只要指定的内容,其他不输出方式
输出方法(大括号+中括号)
打印所有的值(可以写入循环)
打印单个值(角标形式)
求数组长度
输出数组最后一个值(赋值法)
eval
作用:,二次解释,用于调用最后一个参数
可以尝试依次输出,不行的话再用eval
例如有一个ls -l /root/a.txt,如果判断一下第三个位置参数/root/.txt不存在,就可以不执行
函数
作用:减少代码量,提高代码利用率,使脚本更加清晰可读
function 函数名(){}
可以不使用function,但是需要加括号,不建议
调用方式:直接调用行数名,先定义再调用
有参函数和无参函数
在调用时,需要传参数的叫做有参函数,不需要传参的函数叫做无参函数,有参函数用位置变量传参
有参数传递的过程
脚本里的位置参数和函数里的位置参数变量没关系
1
2
在脚本中默认情况下,脚本和函数是可以共用变量的,但是变量一定要在调用前定义
脚本中可以使用函数的变量,但是一定要先调用函数,才可以调用函数中的变量
局部变量local定义
如果函数中的变量使用local进行定义,此时改变量为函数的局部变量,脚本不可以调用
其他位置参数变量依然是各自传各自的
关于函数的返回值(return 返回状态码)
如果函数中有return,当函数遇到return,函数结束
当函数有return
如果函数中没有return,将行数中最后执行的最后一条命令的返回值作为函数的返回值
案例1
案例二
shell调试知识点
bash +选项
bash -n 将脚本读取一次,用于检测,不执行
bash -x 执行每一条命令和执行结果依次打印
参数-x会列出shell执行语句的顺序并将其打印。
bash -v 一边执行检测,一边打印
对脚本某个部分进行调试
其他
echo 打印变量
trap 调用
exit err 执行状态码非0 debug
bashdb 第三方调试工具
发布者:LJH,转发请注明出处:https://www.ljh.cool/35093.html