Shell学习

一,Shell基础知识:
1.简介:
Shell是由C语言编写的一个脚本语言,是用户和Linux的桥梁,用户将命令发送给Shell处理,Shell将相应的操作传递给内核进行执行,然后内核将结果输出给用户。
2.分类:
主要分为两大类:图形界面Shell(GUI Shell)和命令行Shell(GLI Shell)。
在 Linux 系统上主流的 CLI 实现是 Bash。
3.Shell脚本的执行方式:
1)使用bash执行:输入命令:bash test.sh
2) 赋予可执行的权力:输入命令:chmod +x test.sh ; ./test.sh
3)使用命令source执行:输入命令:source test.sh
4.Shell变量:
1)系统变量:
在命令行提示符直接执行 env、set 查看系统或环境变量。env 显示用户环境变量,set 显示 Shell预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。
常用系统变量:$SHELL 默认 Shell
$HOME 当前用户家目录
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 当前用户 ID
U S E R 当 前 用 户 2 ) 普 通 变 量 与 临 时 环 境 变 量 普 通 变 量 定 义 : V A R = v a l u e 临 时 环 境 变 量 定 义 : e x p o r t V A R = v a l u e 当 前 S h e l l 进 程 以 及 子 S h e l l 进 程 可 以 使 用 , 退 出 终 端 后 会 自 动 清 除 变 量 引 用 : USER 当前用户 2)普通变量与临时环境变量 普通变量定义:VAR=value 临时环境变量定义:export VAR=value 当前Shell进程以及子Shell进程可以使用,退出终端后会自动清除 变量引用: USER2VAR=valueexportVAR=valueShellShell使退{VAR}
3)位置变量
是指函数或脚本后的跟的参数;例如命令sh test,sh 1 2 3,位置变量未a b c,$1为a,$2为b,$3为c;
shift命令可对位置变量控制,每执行一次 shift,位置变量个数就会减一,而变量值则提前一位。shift n,可设置向前移动n 位。
4)特殊脚本
$0 脚本自身名字
$? 返回上一条命令是否执行成功,0 为执行成功,非 0 则为执行失败
$# 位置参数总数
$* 所有的位置参数被看做一个字符串
$@ 每个位置参数被看做独立的字符串
$$ 当前进程 PID
! 上 一 条 运 行 后 台 进 程 的 P I D 5. 变 量 的 定 义 和 引 用 1 ) 自 定 义 变 量 及 引 用 : = : 直 接 赋 值 ; + = : 两 个 变 量 相 加 ; 引 用 使 用 ! 上一条运行后台进程的 PID 5.变量的定义和引用 1)自定义变量及引用: =:直接赋值;+=:两个变量相加;引用使用 !PID5.1=+=使{};
例如:#VAR=123 #echo ${VAR} #123
#VAR=123 #VAR+=456 #echo ${VAR} #123456
2)将命令结果作为变量值
例如:#VAR=echo 123 #echo KaTeX parse error: Expected 'EOF', got '#' at position 8: {VAR} #̲123 #V…(echo 123) #echo KaTeX parse error: Expected 'EOF', got '#' at position 9: {VAR} #̲123 注意:这里的…(),都是用于执行 Shell 命令。
6.双引号和单引号
在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令:
# VAR=1 2 3
-bash: 2: command not found
# N=3
# VAR=“1 2 $N”
# echo $VAR
1 2 3
# VAR=‘1 2 $N’
# echo $VAR
1 2 N 单 引 号 是 告 诉 S h e l l 忽 略 特 殊 字 符 , 而 双 引 号 则 解 释 特 殊 符 号 原 有 的 意 义 二 , S h e l l 字 符 串 处 理 之 N 单引号是告诉 Shell 忽略特殊字符,而双引号则解释特殊符号原有的意义 二,Shell字符串处理之 NShellShell{}
1.获取字符串长度
#VAL=“hello w”
#echo “lenth=${#VAL}”
lenth=7
2.字符串切片
格式:
${parameter:offset}
p a r a m e t e r : o f f s e t : l e n g t h 截 取 从 o f f s e t 个 字 符 开 始 , 向 后 l e n g t h 个 字 符 。 o f f s e t = − n 时 表 示 倒 数 第 n 个 , o f f s e t 可 以 为 0 , 表 示 第 一 个 字 符 。 3. 字 符 串 替 换 格 式 : {parameter:offset:length} 截取从 offset 个字符开始,向后 length 个字符。offset=-n时表示倒数第n个,offset可以为0,表示第一个字符。 3.字符串替换 格式: parameter:offset:lengthoffsetlengthoffset=nnoffset0,3.{parameter/pattern/string}
# VAR=‘hello world world!’
将第一个 world 字符串替换为 WORLD: # echo ${VAR/world/WORLD}
hello WORLD world!
将全部 world 字符串替换为 WORLD: # echo ${VAR//world/WORLD}
hello WORLD WORLD!
patterm 前面开头一个正斜杠为只匹配第一个字符串,两个正斜杠为匹配所有字符
4.字符串截取
格式:
1)去掉左边:#,##
${parameter#word} #去掉最短的字符串
${parameter##word} ##去掉最长的字符串
2)去掉右边:%,%%
${parameter%word
} %去掉最短的字符串
${parameter%%word
} %%去掉最长的字符串
5.变量状态赋值
1)格式:
${VAR:-string} 如果 VAR 变量为空则返回 string
${VAR:+string} 如果 VAR 变量不为空则返回 string
${VAR:=string} 如果 VAR 变量为空则重新赋值 VAR 变量值为 string
${VAR:?string} 如果 VAR 变量为空则将 string 输出到 stderr
2)例如:
如果变量为空就返回 hello world!: # VAR=
# echo ${VAR:-‘hello world!’}
hello world!
如果变量不为空就返回 hello world!: # VAR=“hello”
# echo ${VAR:+‘hello world!’}
hello world!
如果变量为空就重新赋值:
# VAR=
# echo ${VAR:=hello}
hello
# echo $VAR
hello
如果变量为空就将信息输出 stderr: # VAR=
# echo ${VAR:?value is null}
-bash: VAR: value is null
6.字符串颜色
1)字体颜色: 30-37(黑红绿黄 蓝色 紫色 深绿 白色)
2)字体背景颜色 40-47 (黑 深红 绿黄蓝紫 深绿 白色)
3)显示方式 :
0:终端默认设置
1:高亮显示
4:下划线
5:闪烁
7:反白显示
8:隐藏
4)格式:
\033[1;31;40m # 1 是显示方式,可选。31 是字体颜色。40m 是字体背景颜色。
\033[0m # 恢复终端默认颜色,即取消颜色设置。
例如:
echo -e “\033[4;31;40mHello world!\033[0m”
echo -e 处理特殊字符 echo -n 不换行输出
三,判断,循环,选择
1.判断
1) 格式:
if [ 条件 ];then
执行体
elif
执行体
else
执行体
fi
2)例如:
#!/bin/bash
N=$1
if [ $N -eq 3 ]; then
echo “eq 3”
elif [ $N -eq 5 ]; then
echo “eq 5”
elif [ $N -eq 8 ]; then
echo “eq 8”
else
echo “no”
fi
2.循环
2.1 for循环
1)格式
for 变量名 in 取值列表; do
命令
done
2)例如
#!/bin/bash
for i in {1…3}; do
echo $i
done
2.2 while循环
1)格式
while 条件表达式; do
命令
done
2)例如
#!/bin/bash
N=0
while [ $N -lt 5 ]; do
let N++
echo $N
done
3.选择
3.1 case
1)格式
case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
)
不符合以上模式执行的命令
esac
3.2 select
1)格式
select 变量 in 选项 1 选项 2; do
break
done
2)例如
#!/bin/bash
select mysql_version in 5.1 5.6; do
echo $mysql_version
done
用户输入编号会直接赋值给变量 mysql_version。
四,函数与数组
1.函数
1)格式:
func() {
command
}
function 关键字可写,也可不写。
2)示例
#!/bin/bash
func()
{
val=1
echo “hello ${1}”
echo “This is a function.”
return ${val}
}
func #调用
fun world #传参
fun
echo KaTeX parse error: Expected 'EOF', got '#' at position 3: ? #̲取返回值 2.数组 …(command))
2)示例:
获取所有元素: # echo ${array[
]} # 和@ 都是代表所有元素
a b c
获取元素下标: # echo ${!a[@]}
0 1 2
获取数组长度: # echo ${#array[
]}
3
获取第一个元素: # echo ${array[0]}
a
获取第二个元素: # echo ${array[1]}
b
获取第三个元素: # echo ${array[2]}
c
添加元素: # array[3]=d
# echo ${array[]}
a b c d
添加多个元素: # array+=(e f g)
# echo ${array[
]}
a b c d e f g
删除第一个元素: # unset array[0] # 删除会保留元素下标
# echo KaTeX parse error: Expected 'EOF', got '#' at position 48: … 删除数组: #̲ unset array …结尾
4)tac
功能:连接文件和倒序打印文件
5)ver
功能:反向打印文件每一行
6)wc
功能:统计文件行数、字节、字符数
常用选项:
-c 打印文件字节数,一个英文字母 1 字节,一个汉字占 2-4 字节(根据编码)
-m 打印文件字符数,一个汉字占 2 个字符
-l 打印多少行
-L 打印最长行的长度,也可以统计字符串长度
7)cp
功能:复制文件或目录
常用选项:
-a 归档
-b 目标文件存在创建备份,备份文件是文件名跟~ -f 强制复制文件或目录
-r 递归复制目录
-p 保留原有文件或目录属性
-i 覆盖文件之前先询问用户
-u 当源文件比目的文件修改时间新时才复制
-v 显示复制信息
8)mkdir
功能:创建目录
常用选项:
-p 递归创建目录
-v 显示创建过程
9)mv
功能:移动文件或重命名
常用选项:
-b 目标文件存在创建备份,备份文件是"文件名后跟~" -u 当源文件比目的文件修改时间新时才移动
-v 显示移动信息
10)rename
功能:重命名文件,支持通配符
常用选项:
示例:批量命名文件
将 foo1-foo9 替换为 foo01-foo09: # rename foo foo0 foo?
将以.htm 后缀的文件替换为.html: # rename .htm .html *.htm
11)dirname
功能:去除路径的最后一个名字
常用选项:
示例:
# dirname /usr/bin/
/usr
# dirname dir1/str dir2/str
dir1
dir2
# dirname stdio.h
12)basename
功能:打印路径的最后一个名字
常用选项:
-a 支持多个参数
-s 删除后面的后缀
示例:
# basename /usr/bin/sort
sort
# basename include/stdio.h .h
stdio
# basename -s .h include/stdio.h
stdio
# basename -a any/str1 any/str2
str1
str2
13)du
功能:估算文件磁盘空间使用
常用选项:
-h 易读格式显示(K,M,G) -b 单位 bytes 显示
-k 单位 KB 显示
-m 单位 MB 显示
-s 只显示总大小
–max-depth=<目录层数>,超过层数的目录忽略
–exclude=file 排除文件或目录
–time 显示大小和创建时间
14)cut
功能:选取文件的每一行数据
常用选项:
-b 选中第几个字符
-c 选中多少个字符
-d 指定分隔符分字段,默认是空格
-f 显示选中字段
示例:
打印 b 字符:
# echo “abc” |cut -b “2”
b
截取 abc 字符:
# echo “abcdef” |cut -c 1-3
abc
以冒号分隔,显示第二个字段:
# echo “a🅱️c” |cut -d: -f2
b
15)tr
功能:替换或删除字符
格式:Usage: tr [OPTION]… SET1 [SET2]
常用选项:
-c 替换 SET1 没有 SET2 的字符
-d 删除 SET1 中字符
-s 压缩 SET1 中重复的字符
-t 将 SET1 用 SET2 转换,默认
示例:
替换 SET1 没有 SET2 的字符:
# echo “aaabbbccc” | tr -c c 1
111111ccc
去重字符:
# echo “aaacccddd” | tr -s ‘[a-z]’
acd
删除字符:
# echo “aaabbbccc” | tr -d bbb
aaaccc
删除换行符:
# echo -e “a\nb\nc” | tr -d ‘\n’
abc
替换字符:
# echo “aaabbbccc” | tr ‘[a-z]’ ‘[A-Z]’
AAABBBCCC
16)stat
功能:显示文件或文件的系统状态
常用选项:
-Z 显示 selinux 安全上下文
-f 显示文件系统状态
-c 指定格式输出内容
-t 以简洁的形式打印
示例:
显示文件信息:
# stat file
只显示文件修改时间:
# stat -c %y fil
17)seq
功能:打印序列化数字
常用选项:
-f 使用 printf 样式格式
-s 指定换行符,默认是\n
-w 等宽,用 0 填充
示例:
数字序列:
# seq 3 123带 0 的数字序列:
# seq -w 03
01
02
03
范围数字序列:
# seq 2 5 2345
步长序列:
# seq 1 2 5 # 2 是步长
135
以冒号分隔序列:
# seq -s “+” 5
1+2+3+4+5
等宽并在数字前面加字符串:
# seq -f “str%02g” 3 # %g 是默认数字位数,02 是数字不足 2 位时用 0 填充。
str01
str02
str03
18)shuf
功能:生成随机序列
常用选项:
-i 输出数字范围
-o 结果写入文件
示例:
输出范围随机数:
# seq 5 |shuf
2 1 5 4 3
# shuf -i 5-10
8
10
7 9 6 5
19)uniq
功能:去除重复行,只会统计相邻的
常用选项:
-c 打印出现的次数
-d 只打印重复行
-u 只打印不重复行
-D 只打印重复行,并且把所有重复行打印出来
-f N 比较时跳过前 N 列 -i 忽略大小写
-s N 比较时跳过前 N 个字符
-w N 对每行第 N 个字符以后内容不做比较
20)tee
功能:从标准输入读取写到标准输出和文件
常用选项:
-a 追加到文件
21)head
功能:输出文件的前几行
常用选项:
-c 打印前多少 K,M
-n 打印前多少行
22)tail
功能:输出文件的后几行
常用选项:
-c 打印后多少 K,M -f 实时读文件,随着文件输出附加输出
-n 输出最后几行
–pid 与-f 一起使用,表示 pid 死掉后结束
-s 与-f 一起使用,表示休眠多少秒输出
23)find
功能:搜索文件目录层次结构
格式:find path -option actions
24)wget ***
功能:非交互式网络下载,类似于 HTTP 客户端
常用选项:
-b, --background 后台运行
日志记录和输入文件:
-o, --output-file=FILE 日志写到文件
-a, --append-output=FILE 日志追加到文件
-d, --debug 打印 debug 信息,会包含头信息
-q, --quiet 退出,不输出
-i, --input-file=FILE 从文件中读取 URL 下载
下载选项:
-t, --tries=NUMBER 设置链接重试次数
-O, --output-document=FILE 写入内容到文件
-nc, --no-clobber 跳过下载现有的文件
-c, --continue 断点续传
–progress=TYPE 设置进度条(dot 和 bar) -S, --server-response 打印服务器响应头信息
–spider 不下载任何内容
-T, --timeout=SECONDS 设置相应超时时间(还有–dns-timeout、–connect-timeout 和
–read-timeout) -w, --wait=SECONDS 两次重试间隔等待时间
–bind-address=ADDRESS 设置绑定地址
–limit-rate=RATE 限制下载速度
–user=USER 设置 ftp 和 http 用户名
–password=PASS 设置 ftp 和 http 密码
目录:
-P, --directory-prefix=PREFIX 保存文件目录
HTTP 选项:
–http-user=USER 设置 http 用户名
–http-password=PASS 设置 http 密码
–proxy-user=USER 设置代理用户名
–proxy-password=PASS 设置代理密码
–referer=URL 设置 Referer
–save-headers 保存头到文件
–default-page=NAME 改变默认页面名字,默认 index.html
-U,–user-agent=AGENT 设置客户端信息
–no-http-keep-alive 禁用 HTTP keep-alive(长连接)
–load-cookies=FILE 从文件加载 cookies
–save-cookies=FILE 保存 cookies 到文件
–post-data=STRING 使用 POST 方法,发送数据
FTP 选项:
–ftp-user=USER 设置 ftp 用户名
–ftp-password=PASS 设置 ftp 密码
–no-passive-ftp 禁用被动传输模式
递归下载:
-r, --recursive 指定递归下载
-l, --level=NUMBER 最大递归深度
-A, --accept=LIST 逗号分隔下载的扩展列表
-R, --reject=LIST 逗号分隔不被下载的扩展列表
-D, --domains=LIST 逗号分隔被下载域的列表
–exclude-domains=LIST 排除不被下载域的列表
示例:
下载单个文件到当前目录:
# wget http://nginx.org/download/nginx-1.11.7.tar.gz
放到后台下载:
# wget -b http://nginx.org/download/nginx-1.11.7.tar.gz
对于网络不稳定的用户使用-c 和–tries 参数,保证下载完成,并下载到指定目录:
# wget -t 3 -c http://nginx.org/download/nginx-1.11.7.tar.gz -P down
不下载任何内容,判断 URL 是否可以访问:
# wget --spider http://nginx.org/download/nginx-1.11.7.tar.gz
下载内容写到文件:
# wget http://www.baidu.com/index.html -O index.html
从文件中读取 URL 下载:
# wget -i url.list
下载 ftp 文件:
# wget --ftp-user=admin --ftp-password=admin ftp://192.168.1.10/ISO/CentOS-6.5-i386-
minimal.iso
伪装客户端,指定 user-agent 和 referer 下载:
# wget -U “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/44.0.2403.157 Safari/537.36” --referer “http://nginx.org/en/download.html”
http://nginx.org/download/nginx-1.11.7.tar.gz
查看 HTTP 头信息:
# wget -S http://nginx.org/download/nginx-1.11.7.tar.gz
# wget --debug http://nginx.org/download/nginx-1.11.7.tar.gz
25)curl
功能:发送数据到 URL,类似于 HTTP 客户端
常用选项:
-k, --insecure 允许 HTTPS 连接网站
-C, --continue-at 断点续传
-b, --cookie STRING/FILE 从文件中读取 cookie
-c, --cookie-jar 把 cookie 保存到文件
-d, --data 使用 POST 方式发送数据
–data-urlencode POST 的数据 URL 编码
-F, --form 指定 POST 数据的表单
-D, --dump-header 保存头信息到文件
–ftp-pasv 指定 FTP 连接模式 PASV/EPSV
-P, --ftp-port 指定 FTP 端口
-L, --location 遵循 URL 重定向,默认不处理
-l, --list-only 指列出 FTP 目录名
-H, --header 自定义头信息发送给服务器
-I, --head 查看 HTTP 头信息
-o, --output FILE 输出到文件
-#, --progress-bar 显示 bar 进度条
-x, --proxy [PROTOCOL://]HOST[:PORT] 使用代理
-U, --proxy-user USER[:PASSWORD] 代理用户名和密码
-e, --referer 指定引用地址 referer
-O, --remote-name 使用远程服务器上名字写到本地
–connect-timeout 连接超时时间,单位秒
–retry NUM 连接重试次数
–retry-delay 两次重试间隔等待时间
-s, --silent 静默模式,不输出任何内容
-Y, --speed-limit 限制下载速率
-u, --user USER[:PASSWORD] 指定 http 和 ftp 用户名和密码
-T, --upload-file 上传文件
-A, --user-agent 指定客户端信息
示例:
下载页面:
# curl -o badu.html http://www.baidu.com
不输出下载信息:
# curl -s -o baidu.html http://www.baidu.com
伪装客户端,指定 user-agent 和 referer 下载:
# curl -A “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/44.0.2403.157 Safari/537.36” -e “baike.baidu.com” http://127.0.0.1
模拟用户登录,并保存 cookies 到文件:
# curl -c ./cookies.txt -F NAME=user -F PWD=123 http://www.example.com/login.html
使用 cookie 访问:
# curl -b cookies.txt http://www.baidu.com
访问 HTTP 认证页面:
# curl -u user:pass http://www.example.com
FTP 上传文件:
# curl -T filename ftp://user:pass@ip/a.txt
# curl ftp://ip -u user:pass-T filename
FTP 下载文件:
# curl -O ftp://user:pass@ip/a.txt
# curl ftp://ip/filename -u user:pass -o filename
FTP 下载多个文件:
# curl ftp://ip/img/[1,3,5].jpg
查看 HTTP 头信息:
# curl -I http://www.baidu.com
26)nohup
功能:运行程序,忽略挂起信号
示例:
后台运行程序,终端关闭不影响:
# nohup bash test.sh &>test.log &
27)iconv
功能:将文件内容字符集转成其他字符集
常用选项:
-l 列出所有已知的字符集
-f 原始文本编码
-t 输出编码
-o 输出到文件
-s 关闭警告
示例:
将文件内容转换 UTF8:
# iconv -f gbk -t utf8 old.txt -o new.txt
将 csv 文件转换 GBK: # iconv -f utf8 -t gbk old.txt -o new.txt
解决邮件乱码:
# echo ( e c h o " c o n t e n t " ∣ i c o n v − f u t f 8 − t g b k ) ∣ m a i l − s " (echo "content" | iconv -f utf8 -t gbk) | mail -s " (echo"content"iconvfutf8tgbk)mails"(echo “title” | iconv -f
utf8 -t gbk)" example@mail.com
28)uname
功能:输出系统信息
常用选项:
-a 输出以下所有信息
-s 输出内核名称
-n 输出主机名
-r 输出内核发行版
-v 输出内核版本
-m 输出主机的硬件架构名称
-p 输出处理器类型或"unknown"
-i 输出硬件平台或"unknown
-o 输出操作系统名称
29)tar
功能:归档目录或文件
常用选项:
-c 创建新归档
-d 比较归档和文件系统的差异
-r 追加文件到归档
-t 存档的内容列表
-x 提取归档所有文件
-C 改变解压目录
-f 使用归档文件或设备归档
-j bzip2 压缩
-z gzip 压缩
-v 输出处理过程
30)ps
功能:报告当前进程的快照
常用选项:
-a 显示所有进程
-u 选择有效的用户 ID 或名称
-x 显示无控制终端的进程
-e 显示所有进程
-f 全格式
-r 只显示运行的进程
-T 这个终端的所有进程
-p 指定进程 ID
–sort 对某列排序
-m 线程
-L 格式化代码列表
-o 用户自定义格式
31)top
功能:动态显示活动的进程和系统资源利用率
常用选项:
-d 信息刷新时间间隔
-p 只监控指定的进程 PID
-i 只显示正在使用 CPU 的进程
-H 显示线程
-u 只查看指定用户名的进程
-b 将输出编排成易处理格式,适合输出到文件处理
-n 指定最大循环刷新数
交互命令:
f 添加或删除显示的指标
c 显示完整命令
P 按 CPU 使用百分比排序
M 按驻留内存大小排序
T 按进程使用 CPU 时间排序
1 显示每个 CPU 核心使用率
k 终止一个进程
32)free
功能:查看内存使用率
常用选项:
-b bytes 显示
-k KB 显示
-m M 显示
-g G 显示
-h 易读单位显示
-s 每几秒重复打印
-c 重复打印几次退出
33)df
功能:查看文件系统的磁盘空间使用情况
常用选项:
-a 包含虚拟文件系统
-h 可易读单位显示
-i 显示 inode 信息而非块使用量
-k 1K 块的数量
-t 只显示指定文件系统为指定类型的信息
-T 显示文件系统类型
34)time
功能:执行脚本时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值