Linux学习-3. Shell Bash

1. 查询系统支持的Shell语言

vi /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

2. Shell脚本的执行方式

所有Linux的命令都可以在Shell中被调用。

echo [-e] [内容] //	输出内容 -e 表示可以识别反斜杠内容。

脚本执行

  1. 一般脚本文件都以 .sh 结尾。
  2. 在脚本文件内容,开头写 #!/bin/bash,表示是使用的bash shell。
  3. 脚本写完之后,赋予执行权限 chmod 755 xxx.sh。
  4. 相对路径或者绝对路径 执行;或者bash xxx.sh(执行权限都不用赋予)。
  5. 对于在windows下写的shell脚本文件,回车符是^M , 但 是 l i n u x 下 是 ,但是linux下是 linux,可以使用dos2unix命令进行格式转换。

3. Bash 的基本功能

3.1 历史命令与补全

history [-c/-w] [存放历史命令的文件]
-c 表示清空历史命令
-w 刷新缓存,存入历史命令
存在~/.bash_history 中

上 下箭头可以取用历史命令

Tab可以实现命令或者文件名/目录名的补全

3.2 快捷键

/

3.3 输出重定向

命令 > 文件名	// 标准输出,覆盖形式
命令 >> 文件名	// 标准输出,追加形式
命令 2> 文件名	// 标准错误输出,覆盖形式
命令 2>> 文件名	// 标准错误输出,追加形式
-------->
命令 &> 文件名	// 标准输出和错误输出一起,覆盖形式
命令 &>> 文件名	// 标准输出和错误输出一起,追加形式
命令 > 文件名1 2>文件名2	// 标准输出到文件1,标准错误到文件2

3.4 多命令顺序执行与管道符

  1. command1; command2; command3… 按不同的顺序执行命令
  2. command1 && command2 && command3… 前一条命令成功,下一条才执行
  3. command1 || command2 || command3… 前一条失败了,下一条才会执行

管道符: command1 | command2 命令1的正确输出作为命令2的操作对象

grep [...] "搜索内容" 文件名	// 输出文件中带有搜索内容的行
-n 显示行号
--color=auto 显示颜色

3.5 通配符

常见的通配符

?	匹配一个任意字符
*	匹配0~n个字符
[]	匹配[]中的任意一个字符,[abc]一定匹配一个字符,a或者b或者c
[-]	同上,但是是一个范围内的,a-d
[^] 匹配一个字符,但是不可以是[]内的

特殊符号

\	转义符,跟在\后面的特殊符号将失去特殊含义,变成普通字符
$	调用变量的值,调用变量name的值,使用$name
$()	引用系统命令,在bash中会先执行它,`` 反引号同样的功能
#	在shell脚本中,#开头的行表示注释
' '	单引号,特殊符号无特殊含义
“ ” 双引号,同上,但是例外 $ ` \三个拥有特殊含义

例子1

name=rc
echo $name
rc
echo '$name'
$name
echo "$name"
rc

例子2

a=$date()
echo a
今天的日期。。。。。

4. Bash 变量

4.1 用户自定义变量

  1. 变量命名规则:由字母、数字和下划线构成,但是不能用数字开头。
  2. bash中,变量默认是字符串型,如果要进行数值运算,必须指定变量类型为数值型。
  3. 变量用等号连接值,但是等号两边不可以为空格。如果变量的值有空格,则用“”或者’‘
name='Justin Ye'

变量叠加

aa=123
aa="$aa"456	// 或者 aa=${aa}456
echo $aa
123456

set 命令 可以查看系统所有的变量
unset … 删除变量

4.2 环境变量

用户自定义变量 只在当前的shell当中生效
环境变量 在当前shell和这个shell的子shell中生效,如果写入相应的配置文件,则可以在所有的shell中生效。

  1. 系统环境变量,一般大写,重点两个PATH
PATH	// 系统查找命令的路径,一般寻找的是可执行文件
		// 插一嘴,实际上Linux的命令是一种可执行文件,保存在PATH下的绝对路径中,而执行可执行文件,需要相对路径或者绝对路径才可以执行。
PATH="$PATH":....绝对路径	// 增加PATH
PS1	// 定义系统提示符的变量

在这里插入图片描述
2. 用户自定义环境变量
pstree 显示 shell 间的关系
export 自定义环境变量
env 查看环境变量
unset 删除变量

4.3 位置参数变量

向程序中传递需要的参数

$n :n 表示数字,$0 表示命令本身, 1 − 1- 1…表示传入的参数
$* :将传入的参数看作一个整体
$@ :将传入的参数,每个独立对待
$# :代表命令行所有参数个数

// test.sh
for i in "$*"
	do
		echo $i
	done
for j in "$@"
	do
		echo $j
	done

./test.sh 1 2 3 4 
1 2 3 4
1
2
3
4

4.4 预定义变量

  1. $? 判断上一条命令成功与否,0 表示成功,非 0 表示失败
  2. $$ 当前进程的进程号 PID
  3. $! 后台运行的最后一个进程的进程号 PID
  4. read 接受键盘输入
read -s -t 30 -p "......." name
-s 隐藏输出的信息
-t 系统等待时间
-p 输出到屏幕的内容(一般用于提示用户输入)
对于用户输入的内容,复制给 name
-n num 只允许输入 num 个字符,都不用回车

5 数值运算与运算符

declare 声明变量类型

declare [+/-][选项]	变量名
+ 取消属性
- 设定属性
-i 整数型
-x 环境变量	(一般还是用export-p 显示指定变量的被声明类型

例子

aa=11
bb=22
// 1
cc=$aa+$bb
cc=11+22
// 2
declare -i cc=$aa+$bb
cc=33
// 3
cc=$(expr $aa + $bb)
cc=33
// 4
cc=$(($aa+$bb))
cc=$[$aa+$bb]

变量测试在这里插入图片描述
通过判断 x 的值,可以知道 y

6. 环境变量配置文件

环境变量配置文件存放位置:
// /etc 对所有用户生效
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
// 只对home 拥有者生效 /.表示隐藏文件或者目录
~/.bash_profile
~/.bashrc

优先级:????没看懂啊

其他配置文件和登录信息

  1. 注销时生效的环境变量配置文件
    ~/.bash_logout
  2. 其它配置文件
    ~/bash_history // 可以帮助系统查错
  3. Shell 登录信息
    本地终端登录信息 /etc/issue
    远端登录信息 /etc/issue.net

7. Shell 编程

7.1 正则表达式

正则表达式:用于匹配文本中的字符串;

基础正则表达式
在这里插入图片描述

7.2 字符截取命令

  1. cut 截取某一列的字符
    -f num 截取第几列 列之间需要用制表符分开(Tab)
    -d “:” 可以规定列之间的分割方式,":" 表示为分隔
    eg: cut -d “:” -f 1,3

  2. awk ‘条件1{动作1} 条件2{动作2}。。。’ 文件名
    在这里插入图片描述
    BEGIN END
    FS=“:” 指定分隔符

awk 'BEGIN{FS=":"} {printf $1"\t" $6"\n"}' /etc/passwd
BEGIN 表示在读取/etc/passwd先执行{}
END 同理在读取完/。。。之后再执行 

关系运算符

cat student.txt | grep -v Name | awk '$6>=87 {printf $2 "\n"}'
  1. sed : 轻量级流编辑器。主要用来将数据进行选取、替换、删除、新增的命令(一般用于屏幕输出的处理,对于文件的编辑最好还是使用vi,vim)
sed [选项] '动作' 文件名
-n 默认的sed输出全部内容到屏幕,-n 只输出经过 sed 处理的内容
-e 允许对输入数据应用多条 sed 命令编辑
-i 用sed修改的结果,直接修改读取数据的文件,而不是屏幕输出
a\ 追加 在当前行后添加一行或多行
c\ 行替换 用c后面的字符串替换原数据行
i\ 插入 在当前行前面插入一行或者多行
d 删除指定行 24d 删除234行
p 打印指定行
s 字符替换 


// 行操作
sed -n '2p' student.txt
-n	表示只输出经过 sed 处理的内容
p	表示动作,打印输出; 2p 打印第二行

7.3 字符处理命令

  1. sort 排序命令
sort [选项] 文件名
-f 忽略大小写
-n 以数值型排序,sort 默认是字符串型排序
-r 反向排序
-t 指定分隔符,默认是Tab
-k n[,m] 指定范围排序

例子

sort -n -t ':' -k 3,3 /etc/passwd
将文件中每行的第三列数作为排序的标准
  1. wc 统计命令
-l 统计行数
-w 统计单词数
-m 统计字符数

7.4 条件判断

  1. 判断文件类型
    -d 目录文件
    -e 是否存在
    -f 普通文件
test -e ...txt	// [-e ...txt]	0真 1假
echo $?	// 返回上一条命令的结果

[-d ...] && echo "yes" || echo "no"
  1. 判断文件的权限
    -r
    -w
    -x

  2. 两个文件之间进行比较
    文件1 -nt 文件2 判断1比2是不是修改时间更新
    文件1 -ot 文件2 判断1比2是不是修改时间更旧
    文件1 -ef 文件2 判断1是否为硬链接

ln /root/student.txt /tmp/stu.txt
[(一定要有空格)/root/student.txt -ef /tmp/stu.txt && echo yes || echo no(一定要有空格)]
  1. 两个整数之间比较
    在这里插入图片描述
  2. 字符串之间判断
    在这里插入图片描述
name=sr
[ -z "$name" ]
  1. 多重条件判断
    在这里插入图片描述

7.5 流程控制(if case for while until等)

7.5.1 if

if [  条件判断式 ];then
	程序
fi
// 或者
if [ 条件判断式 ]
	then
		程序
	elif [ ... ]
		then
			程序
			(exit 2)	// 如果不进行下面的操作,就exit
	else
		...
fi

例子

#!/bin/bash
# 统计根分区使用率

rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 80 ]
	then
		echo "WARNING !!!"
fi

例子

#!/bin/bash
#备份mysql数据库

#同步系统时间
ntpdate asia.pool.ntp.org &>/dev/null
#把当前系统时间按照 "年月日" 格式赋予变量date
date=$(date +%y%m%d)
#统计mysql数据库的大小,并把大小赋予size变量
size=$(du -sh /var/lib/mysql)

if [ -d /tmp/dbbak ]
	then
		# 输出重定向,覆盖
		echo "Date : $date!" >/tmp/dbbak/dbinfo.txt
		# 输出重定向,追加
		echo "Data size : $size" >>/tmp/dbbak/dbinfo.txt
		cd /tmp/dbbak
		# 打包并压缩 生成新文件,并将输入输出送去null
		tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
		rm -rf /tmp/dbbak/dbinfo.txt
	else
		mkdir /tmp/dbbak
		echo ""
		echo ""
		cd /tmp/dbbak
		tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
		rm -rf /tmp/dbbak/dbinfo.txt
fi

例子

#!/bin/bash
#判断 apache 是否启动

# 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')

if [ "$port" == "open"]
	then
		echo "..."
	else
		echo "..."
fi

7.5.2 case

case $变量名 in
	"值1")
		程序1
		;;
	"值2")
		程序2
		;;
	*)
		程序。。。
		;;
esac

7.5.3 for

for 变量 in 值123
	do
		...
	done

例子:批量解压缩脚本

#!/bin/bash

#进入压缩包所在的目录
cd /lamp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
	do
		tar -zxf $i &>/dev/null
	done
# 删除/lamp/ls.log所有内容
rm -rf /lamp/ls.log

例子:1 加到 100

#!/bin/bash
s=0
for((i=1;i<=100;i=i+1))
	do
		s=$(($s+Si))
	done
echo "the sum is $s"

综合点的例子

#!/bin/bash
#批量添加指定数量的用户

read -p "....." -t 30 name
read...

if [ !-z "$name" -a !-z "$num" -a ! -z "$pass" ]
	then
	y=$(echo $num | sed 's/[0-9]//g')
		if[ -z "$y" ]
			then
			for((i=1;i<=$num;i=i+1))
				do
					/usr/sbin/useradd $name $i &>/dev/null
					echo $pass | /usr/bin/passwd --stdin $name $i &>/dev/null
				done
		fi
fi

7.5.4 while until

while [ 条件判断式 ]
   do
   	程序
   done

until [ 条件判断式 ]
   do
   	程序
   done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值