Shell 编程进阶笔记
这几篇博文主要记录博主的Linux 学习之路,用作以后回顾和参考。大家可以选择略过也可以作参考。
(一)Linux 初步笔记
(二)Linux 进阶笔记(一)
(三)Linux 进阶笔记(二)
(四)Shell 编程进阶笔记
Shell 变量
(一)bash 变量与变量分类
变量的分类:
- 用户自定义变量:用户根据自己的需求定义的变量可以根据需求修改
- 环境变量:主要保存的是和系统操作环境相关的数据,对系统生效的环境变量名和变量作用是固定的
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,并且作用是固定的
- 预定义变量:是bash 中已经定义好的变量,变量名不能自定义,并且作用是固定的
用户自定义变量:
[变量名]=[变量值] : -> 注意两边不要有空格,如果变量中有空格需要加双引号
echo $[变量名] : -> 变量调用
[变量名]=“$[变量名]”[叠加值] : -> 变量的叠加
[变量名]=${[变量名]}[叠加值] : -> 变量的叠加
set : -> 所有变量的查看
set -u : -> 执行此命令后如果调用未声明的变量时会报错
unset [变量名] : -> 删除变量
bash 环境变量:
export [变量名]=[变量值] : -> 定义一个环境变量
env : -> 查看环境变量
环境变量与自定义变量的区别:
环境变量时全局变量,而用户自定义变量是局部变量。用户自定义的变量只在当前的Shell 中生效,环境变量会在当前Shell 和这个Shell 的子Shell 中生效。环境变量可以自定义,但是对系统生效的环境变量是固定的。
位置参数变量:
预定义变量:
bash 语系变量:
locale : -> 查看当前系统语系
echo $LANG : -> 输出系统当前语系
(二)接收键盘输入
相关命令:
read [选项] [变量名]
选项:
- -p “提示信息” : -> 在等待输入之前进行信息提示
- -t [秒数] : -> 在等待用户输入的时候,防止一直等待输入
- -n [字符数] : -> read 命令只接收指定的字符数,接收完成便会进行下一步
- -s : -> 隐藏输入的数据,就像终端输入用户密码一样
Shell 运算符
(一)declare 声明变量类型
declare [+/-] [选项] [变量名]=[变量值]
选项:
- -:给变量设定类型属性
- +:取消变量的类型属性
- -a:将变量声明为数组
- -i:将变量声明为Integer 类型
- -x:将变量声明为环境变量,和export 作用类似
- -r:将变量声明为只读属性
declare -p : ->查询所有变量的属性
declare -p [变量名] : -> 查询指定变量的属性
一个简单的小应用实现运算:
[root@localhost ~]# declare -i a=1
[root@localhost ~]# declare -i b=2
[root@localhost ~]# declare -i sum=$a+$b
[root@localhost ~]# echo $sum
3
(二)数值运算的方法
一:如上使用declare 将变量声明为Integer 类型再进行运算
二:使用 expr 或let 进行运算
[root@localhost ~]# a=2
[root@localhost ~]# b=3
[root@localhost ~]# c=$(expr $a + $b)
[root@localhost ~]# echo $c
5[root@localhost ~]# let d=$a+$b
[root@localhost ~]# echo $d
5
三:”((运算式))”或“((运算式))” 或 “$[运算式]”
[root@localhost ~]# e=$(( $a + $b ))
[root@localhost ~]# echo $e
5
Shell 编程之环境变量配置文件
source 相关命令
source [配置文件] : ->修改系统配置文件后,必须注销用户才可以生效,使用source 命令不用注销重新登录用户
. [配置文件]
放张图在这里供以后作参考
Shell 编程之正则
(一)正则表达式
正则表达式与通配符的区别:
- 正则表达式用来在文件中匹配符合条件的字符串,是包含匹配。grep、awk、sed、等命令支持正则表达式
- 通配符用来匹配符合条件的文件名,通配符是完全匹配。
正则匹配规则:
(二)字符串截取
cut 相关命令:
cut [选项] [文件名]
选项:
- -f [列号] : -> 提取第几列的数据
- -d [分隔符] : -> 指定按照指定分隔符截取数据,默认使用制表符截取数据
简单例子:
[root@localhost ~]# grep "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
Jas:x:500:500:Jas Zhang:/home/Jas:/bin/bash[root@localhost ~]# grep "/bin/bash" /etc/passwd | grep -v "root"
Jas:x:500:500:Jas Zhang:/home/Jas:/bin/bash[root@localhost ~]# grep "/bin/bash" /etc/passwd | grep -v "root" | cut -f 1 -d ":"
Jas
awk 相关命令:
awk ‘[条件一]{[动作一]}[条件二]{[动作二]}…’ [文件名]
条件(Pattern ): 一般使用关系表达式作为条件
动作(Action): 一般用于格式化输出
简单示例一(没有执行条件):
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda5 17G 5.2G 11G 33% /
tmpfs 499M 276K 499M 1% /dev/shm
/dev/sda1 194M 28M 156M 16% /boot
/dev/sda2 2.0G 240M 1.6G 13% /home
/dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final
[root@localhost ~]# df -h | awk '{print$1 "\t" $2}'
文件系统 容量
/dev/sda5 17G
tmpfs 499M
/dev/sda1 194M
/dev/sda2 2.0G
/dev/sr0 4.0G
简单示例二(带有执行条件):
[root@localhost ~]# df -h | awk 'BEGIN{print "check begin"} {print$1 "\t" $2} END{print "check end"}'
check begin
文件系统 容量
/dev/sda5 17G
tmpfs 499M
/dev/sda1 194M
/dev/sda2 2.0G
/dev/sr0 4.0G
check end
简单示例三(FS内置对象指定分隔符,并使用BEGIN 条件)
[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {print $1 "\t" $2}'
root:x:0:0:root:/root:/bin/bash
Jas x[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {print $1 "\t" $2}'
root x
Jas x
sed 相关命令:
sed [选项] ‘[动作]’ [文件名]
选项:
- -n :一般sed 命令会把所有的数据都输出到屏幕上,-n 只会把经过sed 命令处理后得到的数据进行输出
- -e :允许对输入数据应用多条sed 命令编辑
- -i :用sed 命令的修改结果直接修改原文件,而不再输出到屏幕
动作:
- a :追加,在当前行后追加一条或多条数据
- c :行替换
- i :插入,在当前行前插入一条或多条数据
- d :删除指定行
- p :打印输出指定的行数据
- s :字符串替换,用一个字符串代替另一个字符串
简单示例:
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda5 17G 5.2G 11G 33% /
tmpfs 499M 276K 499M 1% /dev/shm
/dev/sda1 194M 28M 156M 16% /boot
/dev/sda2 2.0G 240M 1.6G 13% /home
/dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final
[root@localhost ~]# df -h | sed -n '1p'
文件系统 容量 已用 可用 已用%% 挂载点
(三)字符处理
sort排序命令:
sort [选项] [文件名]
选项:
- -f :忽略大小写
- -n :以整型数值排序,默认使用字符串排序
- -r :反向排序
- -t :指定分隔符,默认的分隔符是制表符
- -k “m,n”:按照指定的字段范围进行排序
简单示例:
[root@localhost ~]# df -h | sort
/dev/sda1 194M 28M 156M 16% /boot
/dev/sda2 2.0G 240M 1.6G 13% /home
/dev/sda5 17G 5.2G 11G 33% /
/dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final
tmpfs 499M 276K 499M 1% /dev/shm
文件系统 容量 已用 可用 已用%% 挂载点[root@localhost ~]# df -h | sort -r
文件系统 容量 已用 可用 已用%% 挂载点
tmpfs 499M 276K 499M 1% /dev/shm
/dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final
/dev/sda5 17G 5.2G 11G 33% /
/dev/sda2 2.0G 240M 1.6G 13% /home
/dev/sda1 194M 28M 156M 16% /boot[root@localhost ~]# df -h | sort -n -k "5,5"
文件系统 容量 已用 可用 已用%% 挂载点
tmpfs 499M 276K 499M 1% /dev/shm
/dev/sda2 2.0G 240M 1.6G 13% /home
/dev/sda1 194M 28M 156M 16% /boot
/dev/sda5 17G 5.2G 11G 33% /
/dev/sr0 4.0G 4.0G 0 100% /media/CentOS_6.3_Final
wc 统计命令:
wc [选项] [文件名]
选项:
- -l :只统计行数
- -w :只统计单词数
- -m :只统计字符数
Shell Script
(一)简单if 条件语句
简单用例(一):判断当前用户是不是root
[root@localhost ~]# echo $USER
root
[root@localhost ~]# vim test.sh
#!/bin/bash
test=$USERif [ "$test" == "root" ]thenecho "I'm root"
elseecho "I'm not root"
fi[root@localhost ~]# bash test.sh
I'm root
简单用例(二):判断用户输入的字符串是不是一个目录
[root@localhost ~]# vim test.sh
#!/bin/bash
read -p "please input a dir: " dirif [ -d "$dir" ]thenecho "It's a dir"
elseecho "It's not a dir"
fi[root@localhost ~]# bash test.sh
please input a dir: /root
It's a dir
[root@localhost ~]# bash test.sh
please input a dir: /root123
It's not a dir
(二)case 语句
简单用例:
[root@localhost ~]# vim test.sh#!/bin/#!/bin/bash# 练习 case 语句的使用read -p "Please confirm to formate the disk (Y/N) : " inputcase "$input" in"Y") echo 'Your choosen is Y';;"N") echo 'Your choosen is N';;*)echo 'Error!'
;;esac[root@localhost ~]# bash test.sh
Please confirm to formate the disk (Y/N) : Y
Your choosen is Y
[root@localhost ~]# bash test.sh
Please confirm to formate the disk (Y/N) : N
Your choosen is N
[root@localhost ~]# bash test.sh
Please confirm to formate the disk (Y/N) : a
Error!
(三)for 语句
简单用例(求和):
[root@localhost ~]# vim test.sh#!/bin/#!/bin/bashsum=0for(( i=0;i<=100;i++))dosum=$(( $sum+$i ))doneecho $sum[root@localhost ~]# bash test.sh
5050
(四)while 与 until 语句
while 与 until 语句的区别是while 中的条件判断为真时才进行循环,until 是判断条件为假时进行循环
Shell 编程进阶笔记相关推荐
- [SuperM]Shell编程课堂笔记+PPT总结
[SuperM]Shell编程课堂笔记+PPT总结 转载于:https://www.cnblogs.com/DreamDrive/p/4800818.html
- SHELL编程学习笔记
SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...
- 《Linux Shell编程学习笔记之一》
<Linux Shell编程学习笔记之一> 前言 由于自己一直在Windows上面编程,用linux用的比较少,学习linux还是本科大二学的一点点知识.因此自己就准备花点时间来熟悉下li ...
- Linux Shell编程学习笔记(4)
Linux Shell编程学习笔记(2015-7-20) 分类:linux shell 今天学习了Linux Shell中的控制结构.其实大多数语言的控制结构这一块都是基本类似的,有了C语言的基础 ...
- Linux Shell编程学习笔记(2)
Linux Shell编程学习笔记(2015-7-12) 分类:linux shell Shell变量 一:关于Shell变量 Shell是一种弱类型的语言,变量存储的一切值都是字符串.Shell ...
- Linux Shell编程学习笔记(3)
Linux Shell编程学习笔记(2015-7-19) 分类:linux shell 一:位置参数和特殊变量 什么是位置参数? 位置参数也叫位置变量,是运行shell脚本程序时,命令行she ...
- shell编程进阶技能详细介绍
Shell脚本编程进阶 一.循环 1.for循环 2.while循环 3.until循环 4.循环控制语句continu 5.循环控制语句break 6.循环控制shift命令 7.while特殊用法 ...
- Shell编程进阶篇(完结)
1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或 ...
- 【Linux系统管理】10 Shell 编程进阶篇
六 Shell 编程 6.1 正则表达式 6.1.1 概述 还记得我们在上一章说过正则表达式和通配符的区别(正则表达式用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名)吗?其实这种区别 ...
最新文章
- Hive Serde、Beeline、JDBC
- Java计算一段程序的运行时间
- mysql如果带有换行的处理方式
- GRE Sub math 报名
- 802.1X基本配置
- elasticsearch部署
- 数值计算与优化(共轭梯度法和QR)
- Gartner发布2011十大关键技术
- 项目疑难杂症记录(五):fragment生命周期都回调了,却不见其页面展示
- Python学习心路历程
- java 获得平台编码_关于Java平台的编码
- shell 批量修改文件名字
- div+css中的为什么要设置浮动属性,浮动完了为什么又要清除浮动
- 5006.推荐初学者几本CCNA教程和材料
- 遗传算法基本原理及在互联网中的应用
- C语言求阶乘尾数零的个数
- Hitting the database(Chapter 5 of Spring In Action)
- HIVE修改列顺序中的坑
- 洛谷 P1008三连击 C语言
- 倾斜模型精细化处理_无人机倾斜摄影技术的三维精细模型制作
热门文章
- 十大经典排序算法之选择排序及其优化
- LeetCode 两数之和
- TensorFlow 2——【module ‘tensorflow.compat.v1‘ has no attribute ‘contrib‘】解决方案
- Navicat——连接SQL Server数据库方法
- linux lvm管理实例,Linux系统管理之LVM案例
- RocketMQ 核心
- JavaWeb学习之路——SSM框架之Spring(五)
- 获取json对象的长度
- 数据库系统(二)——数据更新和视图
- 远程命令执行与代码执行(remote command/code execute)漏洞总结