文章目录
一. Shell介绍
1. Linux系统是如何操作计算机硬件CPU, 内存,磁盘,显示器等
使用Linux的内核操作计算机的硬件
2. Shell和计算机硬件的关系
通过编写shell命令发送给Linux内核去执行,操作就是计算机硬件所以shell命令是用户操作计算机硬件的桥梁
3. Shell是什么
Shell是命令,类似于window系统dos命令
Shell是一个门程序设计语言,shell里面含有变量,函数,逻辑控制语句等
4. Shell脚本是什么
是一个文本文件,里面可以编写shell命令或进行编程,形成一个可重用执行的脚本文件
5. 为什么学习shell
通过shell命令与编程语言来提高Linux系统的管理工作效率
6. Shell的运行过程
当用户下达指令给操作系统的时候,实际上是把指令告诉shell,经过shell解释,处理后让内核做出相应的动作。系统的回应和输出的信息也由shell处理,然后显示在用户的屏幕上
7. Shell解析器
cat /etc/shells 查看有那么shell解析
/bin/bash 是LinuxOS默认shell
echo $SHELL 打印输出当前系统环境使用的shell解析器类型
二. Shell脚本文件编写规范
首行需要设置shell解析器的类型
#!/bin/bash
注释格式
单行注释# 注释内容
三. 环境变量
1. 系统环境变量
是系统提供的共享变量,是Linux系统加载shell的配置文件中定义的变量共享给所有的shell程序使用
2. Shell的配置文件分类
a. 全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
b. 个人配置文件
当前用户/.bash_profile
当前用户/.bashrc
一般情况下,我们都是直接针对全局配置进行操作
3. 环境变量分类
在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量
系统级环境变量:Shell环境加载全局配置文件中的变量共享给所用用户所有shell程序使用,全局共享
用户级环境变量:shell环境加载个人配置文件中的变量共享给当前用户的shell程序使用,登录用户使用
查看当前shell系统环境变量
env 查看系统
set 查看所有
自定义变量
自定义局部变量
就是定义在一个脚本文件中的变量,只能在这个脚本文件中使用的变量,就是局部变量
var_name=value
1.变量定义规则
a. 变量名称可以有字母数字下划线组成,但是不能以数字开头
b. 等号两侧不可以有空格
c. 在bash环境中,变量的默认类型都是字符串类型,无法直接进行数值运算
d. 变量的值如果有空格,必须使用双引号括起来
e. 不能使用shell关键字作为变量名称
2.查询变量值语法:
$var_name直接使用变量名查询
${var_name}
区别:花括号方式适合拼接字符串
3.变量删除:
unset var_name
4.特殊符号变量
$n 用于接收脚本文件执行时传入的参数
$0 用户获取当前脚本文件名称
$1~$9,代表获取第一个输入参数到第九个输入参数
第10个参数以上获取参数格式:${10}
$#获取所有输入参数的个数
$*$@获取所有输入参数,用于以后输出所有参数
不使用双引号括起来,功能一样\$*和\$@ 获取所有输入参数,格式为:$1 $2 … $n
使用双引号括起来
$*获取的所有参数拼接为一个字符串,格式为:“$1$2 … $n“
$@获取一组参数列表对象,格式为:”$1”,“$2”… “$n”
$?用于获取上一个shell命令的退出状态码,或者函数的返回值
$$用于获取当前Shell环境的进程id号
5. 自定义常量
就是变量设置值以后不可以修改的变量叫常量,也叫只读变量
6. 全局变量语法
export var_name1var_name2
7. 自定义系统环境变量
a. 系统级全局配置文件:/etc/profile
b. 设置环境变量:export VAR_NAME=xxx,变量名建议全部大写
c. 修改了/etc/profile文件后,要立刻加载修改的数据需要重载配置文件:source /etc/profile
8. Shell环境变量初始化加载原理过程
Shell登录环境初始化过程:
/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrcà/etc/bashrc
Shell 非登录环境初始化过程:
~/.bashrc -> /etc/bashrc ->~/etc/profile.d/*.sh
$0用于获取当前shell环境类型,bash代表非登录环境,-bash代表shell登录环境
四.shell字符串变量
1. 三种方式单引号,双引号,无引号
区别:单引号:原样输出,双引号:会解析变量,无引号:空格之后的字符会认为是命令**
输出字符个数:${#变量名}
2. 字符串截取
a. ${变量名:start:length}
${var1:0:2} 从左侧第0个开始,向左截取2个字符
b. ${变量名:start} 从左边start位置开始截取到最后所有字符
c. ${变量名:0-5,2} 从右侧第五个字符,截取2右侧两个
d. ${变量名#*e} 从左侧第一个e开始截取后面所有字符
e. ${变量名##*e} 从左侧最后一个e开始截取后面所有字符
f. ${变量名%e*} 从右侧第一个e开始截取前面所有字符
g. ${变量名%%e*} 从右侧最后一个e开始截取前面所有字符
**
3. 数组赋值,获取,拼接,删除**
nums=(100 2 3 hhhh)
echo ${nums[0]} 获取第一个值
echo ${nums[@]} ${nums[*]}获取所有的值
echo${#nums[@]}获取数组的长度和个数
echo${#nums[0]}获取指定元素的长度
数组拼接
arr1=(1 2 3) arr2=(45 6) arr3=(${nums[@]} ${arr2[*]}
数组删除
unset array_name[index]删除数组的某个字符
unset arrary_name 删除数组
五.Shell内置命令
alias 别名=“命令”
unalias 删除别名
echo -n 输出不换行
echo -e 解析传义字符
1. read
用于读取标准输入(终端控制台用户输入的数据)
多个变量赋值
read -p “提示信息”var1 var2…
read读取一个字符
read -n 1 var1
read限制时间输入
read -t 秒数var1
read -s 静默输入
2. exit
用于退出当前shell环境进程结束运行,并且可以返回一个状态码,一般使用$?可以退出当前状态码
exit #默认返回状态码0,表示命令执行成功
exit 非0数字,表示命令执行失败
[if !supportLists]5. [endif]declare
[if !supportLists]a. [endif]设置变量的属性
3. declare [+/-]
+/- “-”可用来指定变量的属性,“+”则是取消变量所设的属性
declear
declear -f 查询所有函数的定义
declear -F 查询所有函数的名称列表
declare -a array1=(100 1 0 aa)
declare -A array2=(["one"]=100["two"]=abc ["itest"]="itheima")
4. expr
expr整数运算表达式
expr length 字符串 获取字符的长度
expr substr 字符串 start end 截取字符串
expr index 被查找字符
expr match 字符串 正则表达式
expr 字符串 : 正则表达式
六.布尔运算符
!取反-o or 或者-a and 并且
七. 逻辑运算符
!逻辑非&&逻辑与|| 逻辑非
八.文件测试运算符
-w 可写-r 可读-x可执行-f 普通文件-d 目录文件-s 不为空-e 存在-nt新
九.命令详解
((a=1+3))括号内赋值
a=$((1+3))括号外赋值
((a=1+3, b=a+3))多表达式赋值
if ((a>2 && b==3))与if条件句配合使用
1. let
最简单的整数运算赋值命令
let a=1+6 b=2+3 c=a+b
2. $[] 命令
a=$[1+2]
3. bc命令
任意精度计算器
bc -q不显示欢迎信息
bc -ql使用标准属数学库
scale=2;10/3保留两位小数
last显示上一次结果
obase=2;7把7转换成2进制
ibase=2;111输入2进制,输出10进制
第一种:
var_name=`bc << EOF
第一行表达式
第二行表达式
…
EOF
`
第二种:
var_name=$(bc << EOF
第一行表达式
第二行表达式
…
EOF
)
4. Test 命令
对数字比较测试test 1 options 2 options: lt le gt ge eq ne
对字符串比较测试 test a options b options: > < != == <>需要转义
对文件测试 test options 文件路径字符串options: -w -r -e -x-s -d
test命令与[] 功能一样
十. 流程控制语句
1. If else语法
if
then
elif
then
else
fi
2.case语法:
case值in
匹配模式1)
命令1
…
;;
匹配模式2)
命令1
…
;;
*)
命令1
…
;;
esac
3. while语法
while条件
do
命令1
命令2
…
continue;
break;
done
4. until语句
until条件
do
命令
done
5. for语句
for var in item1 item2 … itemN
do
命令1
命令2
…
done
6. select语法
select var in menu1 menu2 …
do
命令
done
十一. Shell函数
1. bname
basename获取文件名
dirname 从指定的文件绝对路径中,获取文件目录
函数定义
[ function ] funname ( )
{
命令
[return 返回值]
}
调用函数
funname传递参数1 传递参数2 …
十二. Shell 重定向输入输出
输出重定向
命令> log.txt
命令 >> log.txt 追加
命令2>> log.txt 把错误的信息也输出文件里
命令>> log.txt 2>&1
输入重定向
wc -l统计行数
十三. Shell工具
1.cut
cut [options]filename
cut 文件或者数据 -d 分隔符-f 提取第x列
ps -aux | grep bash | head -n 1 | cut -d “ “-f 7
-d “ “ 以空格切割
-f 7 取第7列
cut 文件或者数据-c 提取数字范围
cut 文件或者数据-nb 提取直接范围
2. sed
sed -i‘3ahello’a.txt 在a.txt文件中,第3行下一行添加hello
sed -i‘3ihello’a.txt 在a.txt文件中,第3行上一行添加hello
sed -i ‘/a/ihhh’a.txt在a.txt文件中,a前一行添加hhh
sed -i ‘/a/ahhh’a.txt在a.txt文件中,a后一行添加hhh
sed -i ‘$alast’a.txt 在a.txt文件中,最后一行后面添加last
sed -i ‘$ilast’a.txt 在a.txt文件中,最后一行前面添加last
sed‘2d’a.txt删除第二行
sed‘1~2d’a.txt删除奇数行
sed‘1,3d’a.txt删除1-3行数据
sed‘1,3!d’a.txt保留前三行
sed ‘/itheima/d’a.txt删除有itheima的行
sed ‘/itheima/,$d’a.txt删除匹配行之后的行
sed ‘/itheima/,+1d’a.txt删除匹配行和后面一行
sed ‘itheima\|itcast/!d a.txt 删除不匹配的行
sed ‘1chello’a.txt 把第一行修改为hello
sed ‘/itheima/chhh’a.txt 把itheima修改为hhh
sed ‘$chhh’a.txt 把最后一行修改为hhh
3. awk
用来分割字符串
awk 'print $3' 以空格为分隔符,获取第三个字段


4. sort
十四. shell常用的一些命令
1. 删除指定文件或者文件夹之外的其它文件或者文件夹
shopt -s extglob
rm -rf -v !(abc|*_abc*)
shopt -s extglob
shopt命令可以不用输入
2. xargs命令
xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行空白,不过通过 xargs 的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了 xargs 命令
rpm -qa|grep xxx | xargs rpm -e
find . -type f -name "*.log" -print0 | xargs -0 rm -f
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
本文详细介绍了Shell编程,包括Shell的作用、脚本编写规范、环境变量、字符串变量、内置命令、流程控制语句,以及常用的Shell工具如cut、sed、awk和sort。学习Shell能有效提高Linux系统的管理效率,文章还涵盖了重定向输入输出和一些实用的命令,如xargs。

400

被折叠的 条评论
为什么被折叠?



