shell_基础_1

正则表达式

特殊字符含义
. 匹配任意字符(汉字也行)
* 匹配任意012次数
	(wang)*  单词重复任意012次数
+ 重复一次以上
	x{n} 精确匹配n次,
    x{n,} 最少匹配n次
    x{n,m} 匹配n到m次
    x{,m}最多匹配m次
?匹配01次(非贪婪模式)
^ 脱字符,匹配行首
$ 匹配行尾

\< , \b 以..首个字母或数字开始匹配(词首)
\> , \b 以..为结尾匹配(词尾)

[^,] 除了...
[:alpha:] 匹配字母
[:alnum:] 匹配字母和数字
                 
a|b xy :a或b ,xy
(a|b)xy: axy或bxy
匹配规则组合
(expr1) (expr2) \1(第一次匹配得到的规则) \2(第二次匹配得到的规则)

vim中
	:%s /xyz/&er/g 
 在vim中将xyz逐行替换成xyzer
 
vim中几种常见的模式
命令模式: 
以vi打开一个文件就直接进入一般模式了(这是默认的模式)。在这个模式中, 你可以使用上下左右按键来移动光标,你可以使用**删除字符或删除整行**来处理文件内容, 也可以使用复制、粘贴来处理你的文件数据。  

输入模式: 
在命令模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,只有当到你按下【i, I, o, O, a, A, r, R】等任何一个字母之后才会进入输入模式。这时候屏幕的左下方会出现【INSERT或 REPLACE】的字样,此时才可以进行编辑。而如果要回到命令模式时, 则必须要按下【Esc】即可退出编辑模式。  

底线命令行模式:

输入【 : / ? 】三个中的任何一个,就可以将光标移动到最底下那一行。在这个模式中, 可以提供查找、读取、存盘、替换字符、离开vi、显示行号等的动作则是在此模式中完成的!

ifconfig的用法
ifconfig ens33 |grep -o
-o : 表示的只输出符合re规则的字符串
egrep=grep -E 用于显示文件中符合条件的字符串

匹配ip地址及网卡?
192.168.30.100
255.255.255.0
192.168.30.123

解析:其中有123位的数字
[0-9]                      0-9 
[1-9][0-9]                 10-99
1[0-9][0-9]                100-199
2[0-4][0-9]                200-249
25[0-5]                    250-255


>ifconfig ens33|grep -o"(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5])\.{3}([0-9]|[1-9][0-9]|1[0-9][0-9]|[2[0-4][0-9]|25[0-5])\>)"

其中[0-9]|[1-9][0-9]可以简化成[1-9]?[0-9]

执行脚本的几种方式
1.按照绝对路径执行(执行前脚本必须要有执行权限 chmod +x xx.sh)
./xx.sh
2.bash 或 cat xx.sh|bash
3.将脚本放在	PATH环境变量对应的任意路径下直接运行
注意 :
	echo $PATH
	mv xx.sh /root/bin
    xx.sh
    第一次执行就按照PYTH中的路径查找,一但找到就把路径hash到内存中了
    >hash(查看)
    若 mv /root/bin/hello.sh /usr/local/bin
    hello.sh找不到脚本文件了
    hash -d hello.sh(脚本的名字)
    hello.sh 再次执行就又hash到内存中了
cmd : command命令提示符

补充:Hash
	Hash,一般翻译做“散列”
    也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

vim配置文件自动设置脚本文件头
  • case : 事实,具体情况
  • indent : 空格
#! /bin/bash
set nu
set ignorecase#(忽略大小写)
set cursorline#(设置光标行对齐)
set autoindent#(设置自动行对齐)
autocmd BufnewFile *.sh exec ":call SetTitle()"
func SetTitle()
	if &filetype=="sh"
    call setline(1,"#!/bin/bash")
    call setline(2,"#***************")
    call setline(3,"Author : xzw")
    call setline(4,"#Date: "  .strftime("%y-%m-%d"))
    call setline(5,"#***************")
    endif
endfunc

补充:
	1.&
    & 放在启动参数后面表示设置此进程为后台进程
默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。然后可以用ctrl + c键结束进程
	ctrl + c :linux中结束进程
    ctrl + z :linux中将进程挂起
    
    2.
脚本调试
1.命令错误
hostnam   :命令继续向下执行
2.语法错误
syntax error :默认不会继续执行下去

脚本调试
bash -n file.sh 来检测脚本中的语法错误
bash -x file.sh 跟踪脚本中执行的命令
注意:
	echo $HOSTNAME
	显示的+表示执行的命令,
	echo `hostname`
	++表示的是嵌套的命令(两层)
	

变量

引用变量加$与不加$
#能区分字符串的命令则不用加,
echo 默认打印的是字符串所以要加 $

系统自带的环境变量
PATH
HOME
UID
PWD
PS1

1.变量赋值

name="Mage"  
等号两边无空格
name="wang"
注意:
	重新赋值变量,会重新开辟一个空间存放wang,不会立即删除Mage,删除也会消耗资源,标记等待回收,下次内容会覆盖

2.命令赋值

name=`hostname`

3.变量内存放多行内容

name=`cat /etc/fstab`
echo "$name"
加双引号可以保留原来多行内容的格式

4.变量引用变量

name1="wang"
name2=name1

name1="li"

#>echo $name1
>li

#>echo $name2
>wang

name1重新赋值会重新开辟空间存放赋值内容,name2的原指向不变
shell语言的特点
shell的变量类型不需要声明,不检查变量存放的数据类型
例如:
i=100
默认存放的是字符串
强类型语言

定义变量需要指定类型

Java c c#


弱类型语言

不需要指定数据的类型

python php bash

bash 不支持浮点数,只支持小数


命名规则

StudentName : 大驼峰命名法
studentFirstName :小驼峰命名法(第一个单词的首字母不大写)


局部变量
echo $$查看当前的进程编号
echo $PPID查看父进程的进程编号
pstree -p :查看进程树

bash 另开一个进程
exit 退出进程

父子进程间的变量不会相互影响,不可相互传递
全局变量
export name="haha"
或者
declare -x name='haha'

全局变量中,子进程可以使用,修改父进程的变量,但是不会影响父进程的变量

HOSTNAME       主机名称
SHLVL          shell的嵌套深度
PATH           
				1.储存各种工具,命令的路径
    			2.当使用工具及命令(运行脚本)的时候,系统会去PATH中查找对应的工具及命令
        		3.若不想用绝对路径执行脚本,可以将脚本添加到PATH中(hash查看)
           
SHELL
USER            当前的用户
UID             用户的id
HOME            用户的家目录
PWD             用户的当前目录
LANG            当前使用的语言
MALL           
HISTSIZE

ls /bin/ /dev/ /etc/
ls可以同时显示多个目录
$_             上一个命令的最后一个参数
># echo $_ 
># /etc

删除变量
unset + 变量名
查看变量
export 查看目前环境变量
env    查看系统自带的环境变量
set    显示最全的变量(全局、局部变量)
declare -x 

练习

1.编写脚本/root/bin/systeminfo.sh, 显示当前主机系统信息,包括主机名,Ipv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
主机名 :           hostname
Ipv4地址 :        ifconfig ens33 | grep ""
操作系统版本:       cat /etc/centos-release
                  cat /etc/redhead
        
内核版本            uname -r
CPU型号            lscpu
内存大小            cat /proc/meminfo
硬盘大小            lsblk
查看分区            df -h

tr - ( c d s)
tr - translate or delete characters 主要用于转换和删除字符

1.去除重复的字符
	tr -s "[a-z]"
    tr -s " " 去除重复的空格
    tr -s "[\n]"
2.替换大小写
	tr "[a-z]" "[A-Z]"
3.删除
	tr -d "[0-9][:]" 删除所有数字及空格
    
awk 文本处理工具
通过扫描文本的每一行,匹配符合规则的数据
-F        指定分隔符
$0        整行
$n        第n列
NF        当前行的列数
$NF       最后一列

{}            命令代码块,包含一条或多条命令,多条命令用 ;  隔开
cut -(d f)
-d 指定字段分割符,默认为tab
-f 显示指定字段的内容

># echo "/home/lxy/hhhhh-a.bbb.cc.d" |awk -F/ '{print $NF}'| cut -d'.' -f2 
># bbb

cut -d"" -f2
2.编写脚本/root/bin/backup.sh,可以实现每日将/etc/目录备份到/root/rtcYYY-mm-dd中
cp
-a                 
尽可能将源文件状态、权限等资料都照原装予以复制,并且是递归copy; 

-r
表示递归copy,若source中含有目录名,则将目录下之档案亦皆依序拷贝至目的地; 

-f 
若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制; 

-v
复制的时候显示详细信息


echo -e(颜色)
支持控制字符

>#  echo -e "\e[1;31m abed \e[0m"

这条命令会把 abcd 按照红色输出。
\e[1 是标准格式,代表颜色输出开始,
; 注意封号后面是颜色
\e[0m 代表颜色输出结束,
31m 定义字体颜色是红色。

echo 命令能够识别的颜色如下:
   30m=黑色,31m=红色,32m=绿色,33m=黄色,34m=蓝色,35m=洋红,	36m=青色,37m=白色。
umask
用于设置用户在创建文件时的默认权限
root用户默认umask是0022 ,普通用户默认的是0002
drwxr-xr-x 
755

默认情况下,
目录,用户所能拥有的最大权限是777;
文件,用户所能拥有的最大权限是目录的最大权限去掉执行权限,即666666-022若是得到奇数,再加一
目录:777-022=755
文件:666-022=644
777减去设置的umask的值得到的是当前设置的文件的权限

更改权限
umask 026

1.umask命令只能临时修改umask值,系统重启之后umask将还原成默认值。
2.如果要永久修改umask值,需要修改/etc/profile文件或是修改/etc/bashrc文件
3.例如要将默认umask值设置为027,那么可以在文件中增加一行“umask 027”。

---------------------------------------------------------------------------------
-rw-rw-r–这一字符串标识文件权限。

这个字符串有10位,可以分为4段来解读。
注:r可读,w可写,x可执行。
第一段(1)表示是目录还是文件,-表示是文件,d表示是目录;
第二段(2-4位,共3个字符串)表示文件所属用户对它的权限;
第三段(5-7位,共3个字符串)表示文件所属用户组用户对它的权限;
第四段(8-10位,共3个字符串)表示其他用户对它的权限;

注:
我们用38进制来表示文件的权限,
4,2,1
r用4标识,2^2读
w用2标识,2^1写
x用1标识,2^0可执行
---------------------------------------------------------------------------------

()小括号的作用
(umask 026;mkdir xzw_test_2)
1.用于一次性的任务,运行的时候会开启子进程,不影响父进程,不影响当前的进程的环境变量,运行完退出。
2.多个指令可以用;连接

>>>x=1;echo "pid=$$";(echo "subpid=$$";x=2;echo "subx2=$x");echo x=$x

>pid=2887
>subpid=2887
>ubx2=2
>x=1

注意:
	小括号和子shell还不太一样,是开启子进程但是()的进程和当前的进程id一样
man bash
bash使用说明书

查询()介绍
:/\(list\)

你可能感兴趣的:(shell脚本)