Shell编程

本文详细介绍了Shell编程,包括Shell的作用、脚本编写规范、环境变量、字符串变量、内置命令、流程控制语句,以及常用的Shell工具如cut、sed、awk和sort。学习Shell能有效提高Linux系统的管理效率,文章还涵盖了重定向输入输出和一些实用的命令,如xargs。


一. 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
	命令2continue;
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值