shell脚本基础

格式要求:首行shebaang机制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

shell脚本用途:

自动化常用命令

执行系统管理和故障排除

创建简单的应用程序

处理文本或文件

bash中变量的种类

局部变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效

环境变量:生效范围为当前shell进程及其子进程

本地变量:生效范围为当前shell进程中某代码片段,通常指函数

位置变量:$1,$2,$3,...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

特殊变量:$?,$0,$,$@,$#,$$,$!

变量赋值:  name=root   变量叠加name="$name"hello

变量引用:  $name 或者 ${name}

弱引用:   " " 其中的变量引用会被替换为变量值

强引用:   ' ' 其中的变量引用不会被替换为变量值,而保持原字符串

set:    显示已定义的所有变量

unset name: 删除变量

例:编写脚本显示当前主机信息

#!/bin/bash

aa=$[RANDOM%7+31]

bb="\e[1;${aa}m"

cc="\e[0m"

ipv4=$(ifconfig|sed -n '2p'|sed -r "s/.inet //"|sed -r "s/ .//")

echo "当前主机系统信息如下:"

echo -e 主机名: $bb$(hostname)$cc

echo -e ipv4地址:$bb$ipv4$cc

echo -e 操作系统版本: $bb$(cat /etc/redhat-release|cut -d. -f1-2)$cc

echo -e 内核版本 $bb$(uname -r)$cc

echo -e CPU型号:$bb$(lscpu |grep "Model name"|tail -n1|tr -s " "|cut -d ":" -f2)$cc

echo -e 内存大小:$bb$(free -mh|head -n2|tail -n1|tr -s " "|cut -d " " -f2)$cc

echo -e 硬盘容量:$bb$(fdisk -l|head -n2|tail -n1|cut -d, -f1|cut -d " " -f2-4)$cc

环境变量的声明、赋值:

export name=VALUE

显示所有环境变量:

env、printenv、export、declare -x

删除变量:

unset name

BASH内建的环境变量:

PATH、SHELL、USER、UID、HOME、PWD、SHLVL、LANG、MAIL、HOSTNAME、HISTSIZE、_下划线

只读变量:只能声明,但不能修改和删除

声明只读变量:

readonly name 、declare -r name

查看只读变量:

readonly -p

$1,$2,$3,..对应第1、第2、第3的参数

$0,   代表命令本身

$,   传递给脚本的所有参数,全部参数合为一个字符串

$@,  传递给脚本的所有参数,每个参数为独立字符串

$#,    传递给脚本的参数的个数

set --   清空所有位置变量

$?     进程使用退出状态来报告成功或失败,0代表成功,1-255代表失败

bash有内建的随机数生成器变量:$RANDOM(0-32767)

例:计算/etc/passwd文件中第10和第20个用户的uid之和

##!/bin/bash

id1=$(cat /etc/passwd|head -n10|tail -n1|cut -d: -f3)

id2=$(cat /etc/passwd|head -n20|tail -n1|cut -d: -f3)

sum=$(($id1+$id2))

echo $sum

逻辑运算

true 1 , false 0

与:

1 与 1 = 1

1 与 0 = 0

0 与 1 = 0

0 与 0 = 0

1 或 1 = 1

1 或 0 = 1

0 或 1 = 1

0 或 0 = 0

!

测试命令: test EXPRESSION、[ EXPRESSION ] 、[[ EXPRESSION ]]

bash的数值测试

-v VAR 变量VAR是否设置

-gt 是否大于

-ge 是否大于等于

-eq 是否等于

-ne 是否不等于

-lt 是否小于

-le 是否小于等于

bash的字符串测试

= 是否等于

> ascii码是否大于ascii码

< 是否小于

!= 是否不等于

=~ 左侧字符串是否能够被右侧的PATTERN,此表达式一般用于[[]]中;扩展的正则表达式。

-z 字符串是否为空,空为真

-n 字符串是否不为空,不空为真 (用于字符串比较时用到的操作都应该使用引号)

bash的文件测试

-e 判断文件是否存在,存在为真

-b 判断是否为块设备文件

-c 判断是否为字符设备文件

-d 判断是否为目录文件

-f 判断是否为普通文件

-L或-h判断是否为符号连接文件

-p 判断是否为管道文件

-S 判断是否为套接字文件

bash的文件权限测试

-r 判断是否可读

-w 判断是否可写

-x 判断是否可执行

-u 判断是否拥有suid权限

-g 判断是否拥有sgid权限

-k 判断是否拥有sticky权限

bash的文件属性测试

-s 是否存在并且非空

-t 文件描述符是否在某终端已经打开

-N 文件自从上一次被读取之后是否被修改过

-O 当前有效用户是否为文件属主

-G 当前有效用户是否为文件属组

file1 -ef file2   file1是否是file2的硬链接

file1 -nt file2   file1是否比file2新

file1 -ot file2   file1是否比file2旧

bash的组合测试条件

EXPRESSION1 -a EXPRESSION2  并且

EXPRESSION1 -o EXPRESSION2  或者

COMMAND1 && COMMAND2  并且,短路与

COMMAND1 || COMMAND2  或者,短路或

!COMMAND 非

如 :[ -f "$FILE" ]&&[[ "$FILE" =~ .*.sh$ ]]

read输入命令

-p 指定要显示的提示

-s 静默输入,一般用于密码

-n 指定输入的字符长度

-d ‘字符’ 输入结束符

-t 等待输入的时间

echo abc | { read x y z;echo $x$y$z;}  使用管道 read会开启子shell

条件选择if语句

单分支

if 判断条件;then

条件为真的分支代码

fi

例:

#!/bin/bash

sda5=$(df -h|grep /dev/sda5|awk '{print$5}'|tr -d "%")

if [ $sda5 -ge 80 ]

then

echo "warning! /dev/sda5 is full"

fi

双分支

if 判断条件;then

条件为真的分支代码

else

条件为假的分支代码

fi

例:

#!/bin/bash

date=$(date "+%y%m%d")

size=$(du -sh /etc)

if [ -d /tmp/back ]

then

echo "date:$date">/tmp/back/info.log

echo "size:$size">>/tmp/back/info.log

cd /tmp/back

tar -zcvf etc-$date.tar.bz2 /etc info.log &>/dev/null

rm -rf /tmp/back/info.log

else

mkdir /tmp/back

echo "date:$date">/tmp/back/info.log

echo "size:$size">>/tmp/back/info.log

cd /tmp/back

tar -zcvf etc-$date.tar.bz2 /etc info.log &>/dev/null

rm -rf /tmp/back/info.log

fi

多分支

if 判断条件1;then

条件为真的分支代码

elif 判断条件2;then

条件2为真的分支代码

elif 判断条件3;then

条件3为真的分支代码

else

以上条件都为假的分支代码

fi

条件判断;case语句

case $变量 in

"选项1")

命令1

;;

"选项2")

命令2

;;

*)

命令3

;;

esac

bash的配置文件

全局配置:

/etc/profile

/etc/profile.d/.sh

/etc/bashrc

个人配置:

~/.bash_profile

~/.bashrc

shell 登录两种方式

交互式登录:

执行顺序:/etc/profile --> /etc/profile.d/.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录:

执行顺序:/etc/profile.d/*.sh --> /etc/bashrc --> ~/.bashrc

profile类:为交互式登录的shell提供配置

bashrc类:为非交互式和交互式登录的shell提供配置

local命令

-i 不区分大小写的搜索

-n N 只列举前N个匹配项目

-r 使用基本正则表达式

find 路径 条件 动作

-maxdepth 最大搜索深度

-mindepth 最小搜索深度

-depth 先处理目录里文件,再处理目录

-regex 正则表达式

-path 不搜索目录里文件

-perm 600 精准权限查找

-perm -444 u g o 三者都有读权限

-perm + centos7改为/

-perm /222 u g o 三者有一个有写权限就可以

-ok-exec {} \; 对查找的结果进行处理

-empty 空

参数替换 xargs

echo {1..100}|xargs -n1

echo user{1..10}|xargs -n1 useradd

压缩、解压缩

compress

-d 解压缩

-c 结果输出至标准输出,不删除源文件

-v 显示详情

zcat file.z  zcat file.gz  bzcat file.bz2  xzcat file.xz  不显示解压缩的前提下查看文本文件内容

cat m | gzip > m.gz

lscpu | gzip > cpu.gz

bzip2 -k 保留原文件

tar -zcvf   .tar.gz

tar -jcvf   .tar.bz2

tar -Jcvf   .tar.xz

split 分割一个文件为多个文件

rpm2cpio 包路径 | cpio -idv ./路径

-t预览

ldd 查看依赖的库

文本处理工具sed

选项:

-n 不输出模式空间内容到屏幕,即不自动打印

-e 多点编辑

-r 支持使用扩展正则表达式

-i 原文编辑

-i.bak 备份文件并原处编辑

编辑命令:

d 删除模式空间匹配的行,并立即启用下一轮循环

p 打印当前模式空间内容,追加到默认输出之后

a\ 在指定行后面追加文本,

i\ 在前面插入文本

c\ 替换行为单行或多行文本

w 保存至指定文件

s/// 替换查找  g 行内全局替换  p显示替换成功的行   w将替换成功的行保存至文件中

rpm包管理

rpm -ivh 安装并显示详细信息

rpm -qa 显示所有包

rpm -qf 查询指定文件在哪个包里

rpm -ql 查询安装位置

rpm -qR 查询依赖

rpm -e 卸载

rpm -V 包校验

yum 管理rpm包

yum源支持文件服务器 http、https、ftp、file

yum配置文件 /etc/yum.repos.d/.repo

yum -y install 包名  安装软件

yum search 包名   查询软件

yum -y reinstall 重新安装

yum repolist 显示仓库列表

yum remove 卸载程序包

yum update 升级程序包

yum info 查看程序包

yum clean all 清除缓存

ym history 查看安装历史

yum history info

yum history undo 撤销

yum history redo 重装

createrrepo 生成repodate

curl IP 查看网页内容

yum groupinstall......

dnf 新一代rpm软件包管理器

安装所需软件包

dnf-conf-0.6.4-2.sdl7.noarch.rpm

dnf-0.6.4-2.sdl7.noarch.rpm

python-dnf-0.6.4-2.sdl7.noarch.rpm

配置文件:/etc/dnf/dnf.conf

仓库文件:/etc/yum.repos.d/.repo

日志:/var/log/dnf.rpm.log

编译安装

C语言源代码编译安装三步骤:

1、./configure

2、make 根据Makefile文件,构建应用程序

3、make install 复制文件到相应路径

开发工具:

autoconf: 生成configure脚本

automake:生成Makefile.in

linux字符雨,linux周记相关推荐

  1. ()shi linux字符设备,Linux字符设备驱动基础(三)

    Linux字符设备驱动基础(三) 6 创建设备节点 6.1 手动创建设备节点 查看申请的设备名及主设备号: cat /proc/devices # cat /proc/devices Characte ...

  2. linux 字符分隔符,Linux运维知识之awk,分隔符编辑截取字符

    本文主要向你们介绍了Linux运维知识之awk,分隔符编辑截取字符,通过详细的内容向你们展现,希望对各位学习Linux运维知识有所帮助. 输入数组分隔符:awk的内嵌数组FS中储存了输入数组分隔符的值 ...

  3. linux设备模型 字符设备,Linux 字符设备驱动模型之框架解说

    一.软件操作硬件设备模型 在进行嵌入式开发的过程中,在常做的事情就是驱动配置硬件设 备,然后根据功能需求使用硬件设备,实现功能的逻辑.如下图为其 相互之间的关系. 如上图所示: 驱动程序:主要作为操作 ...

  4. Linux字符界面操作进阶

    字符界面最重要的内容当然还是要记住各种命令了!下面我们来介绍一个字符界面下各种常用的操作命令. 常用的文本目录操作命令: ls显示文件和目录 touch创建一个空文件或改变文件的创建时间 cp复制文件 ...

  5. Linux字符驱动开发学习总结

    linux驱动编写(虚拟字符设备编写) 昨天我们说了一些简单模块编写方法,但是终归没有涉及到设备的编写内容,今天我们就可以了解一下相关方面的内容,并且用一个实例来说明在linux上面设备是如何编写的. ...

  6. linux内核定义注册设备,linux字符型设备驱动 一.注册设备并创建设备文件

    1.字符设备 字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系 Linux内核中: a -- 使用cdev结构体来描述字符设备; b -- 通过其成员dev_t来定义设备号(分为主.次设 ...

  7. linux字符设备文件的打开操作,Linux字符设备驱动模型之字符设备初始化

    因为Linux字符设备驱动主要依赖于struct cdev结构,原型为: 所以我们需要对所使用到的结构成员进行配置,驱动开发所使用到的结构成员分别为:[unsigned int count;].[de ...

  8. linux生成驱动编译的头文件,嵌入式Linux字符设备驱动——5生成字符设备节点

    嵌入式Linux字符设备驱动开发流程--以LED为例 前言 留空 头文件 #include 查看系统设备类 ls /sys/class 设备类结构体 文件(路径):include/linux/devi ...

  9. linux字符设备驱动的 ioctl 幻数

    在Linux字符设备驱动入门(一)中,我们实现了字符设备的简单读写字符功能,接下来我们要在这个基础上加入ioctl功能.首先,我们先来看看3.0内核下../include/linux/fs.h中fil ...

最新文章

  1. Linux常用命令笔记2---文件管理4
  2. linux 内核编译错误 undefined reference to '__mutex_lock_slowpath'
  3. MyBatisPlus条件构造器带条件删除delete使用
  4. 转录组差异表达分析工具Ballgown
  5. Service worker 的概念和用法
  6. Beetle简单构建TCP服务
  7. Matlab 画图函数
  8. 关于注册苹果开发者账号时登录遇到的提示未知错误
  9. jeecg ajax验证,jeecg权限模块学习
  10. 10分钟默写快速排序
  11. 基于模型的软件开发方法综述
  12. 【不三不四的脑洞】大龄程序猿 “奇葩” 相亲记 | 年中总“劫”
  13. html的ul和li元素
  14. 彻底解决The last packet successfully received from the server was * milliseconds ago问题
  15. http://myproducts.ca/here.php,外研(新标准)版
  16. mysql中 回滚事务是什么_什么是事务?什么是回滚事务,以及四种事务的隔离级别...
  17. 使用openssl的EVP接口使用sm2算法加解密等操作
  18. Dirac HD Sound介绍
  19. 郭明錤:2018年苹果将保留iPhone X镜头设计
  20. NLP(五十三)在Keras中使用英文Roberta模型实现文本分类

热门文章

  1. jsf 自定义属性_如何在JSF中实现自定义密码强度指示器
  2. activemq 持久订阅_ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力
  3. Kafka REST Proxy for MapR Streams入门
  4. netbeans代码提示_Java代码现代化的七个NetBeans提示
  5. java概述_Java 7功能概述
  6. 收到有关RabbitMQ集群分区的通知
  7. 开发人员需要了解的有关xPaaS的一切
  8. 红帽正式宣布发布JBoss BPM Suite 6和JBoss BRMS 6
  9. Java中已检查和未检查的异常
  10. 使用Spring 3 MVC处理表单