shell及其脚本

来源:互联网 发布:linux ip 流量 编辑:程序博客网 时间:2024/06/14 23:01

一.  shell

1. shell认知

shell是用户与内核之间交互的接口,用户通过shell进行交互(命令)或非交互(shell脚本)的方式以达到对系统的操作和交互

2. shell脚本

安装一定逻辑关系记录命令的文件

第一行:#!/bin/bash     #"#!"为约定的标记,表示脚本需要什么解释器进行解释,默认脚本运行时开启的子shell


ps -xf        #表示查看所使用shell的位置指向

注:通常第一行采用#!/usr/bin/env bash,进行申明,表示不管在什么地方,将bash找到并且运行

脚本描述语的快速运行:

vim /etc/vimrc


注:map表示映射,按F4键可进行快速编写描述语

脚本内容的快速修改:


注:利用Dir=/var/log/变量关系,可以减轻工作量,进行批量修改,只需修改变量关系即可

3. 特殊符号转译和注释

\             #表示转译
''            #表示强引
""           #表示弱引


三. 常用命令

1. diff

diff hello hello.new                           #比较两个文件的不同

[num1,num2][a|c|d][num1,num2]    #表示第一个文件的第几行比第二个文件的第几行增加或替换或删除,两个文件就相同


diff -u hello hello.new > hello.path

yum install -y patch


patch hello.new hello.path              #对hello.new文件进行打补丁


注:在对文件进行打补丁时,将会保留源文件

patch -b hello hello.path      #-b表示备份原文件为hello.orig


2. grep

find查找文件,grep查找或过滤字符

grep root /mnt/passwd


grep root -i /mnt/passwd        #-i表示不区分大小写

grep -i ^root /mnt/passwd      #表示以root开头

grep -i root$ /mnt/passwd      #表示以root结尾

grep -i ^root$ /mnt/passwd    #表示以root开头和结尾


grep -i root /mnt/passwd | grep -i ^root

grep -i root /mnt/passwd | grep -i ^root -v        #-v表示反向过滤


grep -i root /mnt/passwd | grep -i -E "^root|root$" -v          

grep -i "\<root" /mnt/passwd | grep -i -E "^root|root$" -v

grep -i "root\>" /mnt/passwd | grep -i -E "^root|root$" -v

grep -i "\<root\>" /mnt/passwd | grep -i -E "^root|root$" -v        #表示含有root为整体且不以root开头和结尾


eg:

查找可登陆系统用户

grep "\<bash\>" /etc/passwd


grep -n hello passwd        #显示查找行号

grep -n2 hello passwd      #显示查找行号及上下各两行

grep -A2 hello passwd      #显示查找字符及后两行

grep -B2 hello passwd      #显示查找字符及前两行


grep hello -r /mnt/        #从目录中筛选字符及所在文件


3. cut

cut -d : -f 2 passwd               #-d指定分隔符;-f指定列,截取文件第二列


cut -d : -f 2,5 passwd           #截取文件第二和第五列


cut -d : -f 2-5 passwd           #截取文件第二到五列


cut -c 3 passwd             #-c指定字符,截取第三个字符


cut -c 1,3 passwd         #截取第一和第三个字符


cut -c 1-3 passwd         #截取第一到三个字符


eg1:

列出可登陆系统的用户名称

grep "\<bash\>" /etc/passwd | cut -d : -f 1


eg2:

编写脚本,通过输入网卡名称获取ip---awk

awk -F ":" -v TEST=$TEST 'BEGIN {print TEST ":"} {print $2} END{print TEST}' 文件


注:sh -x执行脚本时,可查看脚本执行过程

4. echo


5. sed

sed 's/sbin/westos/g' passwd         #全文替换sbin为westos,属于临时生效


sed '1,5s/sbin/westos/g' passwd           #替换1-5行


sed '/adm/,/sync/s/sbin/westos/g' passwd          #替换从adm此行到sync此行


sed 's/sbin/westos/g' -i passwd              #全文替换并保存


sed -e 's/sbin/westos/g' -e 's/nologin/linux/g' passwd        #同步进行替换


cat -n passwd | sed 5p                    #重复查看第5行


cat -n passwd | sed 5d                  #查看第五行以外的

cat -n passwd | sed -n 5p              #只查看第五行


eg1:

编写shell脚本,通过执行脚本写出httpd端口数值进行直接改变


eg2:

编写shell脚本,通过文件执行shell脚本,使得文件中的用户可以直接通过运行shell脚本进行创建


注:sed 's/enabled\ =\ 1/enabled\ =\ 0/g' -i 文件    #表示将文件中'enabled = 1'替换成'enabled = 0'

四. 变量

export a=1           #环境级,只针对当前环境生效,当前环境关闭,变量失效


vim .bash_profile                   #用户级,只针对配置过的用户生效,其他用户无法使用

source .bash_profile             #source刷新方能生效


vim /etc/profile            #系统级


脚本执行路径:

环境级:


用户级:

vim .bash_profile

source .bash_profile


系统级:

vim /etc/profile


1. 命令别名设定

ls与/usr/bin/ls区别:


vim别名'xie'的设定

环境级:alias xie='vim'


系统级:

vim /etc/bashrc       #alias xie='vim'

source /etc/bashrc


注:因为已读取的原因,删除仍然生效


eg:创建用户并设定密码


注:编写脚本可以通过提示,进行创建,删除,退出

2. 变量定义

1> USER=root

2> $0 $1 $2 $3 $n $* $# $?

3> read -p " " IP

eg:

read -p "please input you want create username: " USERNAME
read -p "please input a password for $USERNAME: " -s PASSWORD    #-s表示不显示密码


3. 函数定义

TEST()
{
        echo hello world
}

TEST

eg1:


注:关键在于设定函数READ和ACTION_DO,当ACTION_DO执行过程中与READ相匹配时,执行相对应的动作,最后再次执行函数是为达到循环的效果

eg2:检测哪台主机可以连接


注:ping -c1 -w1 $IP &> /dev/null && echo $IP is up ||echo $IP is down表示如果ping通就输出up,不通就输出down

4. 变量对比

test = [ ]


注:"!"表示否定

"-a"表示并且,"-o"表示或者


"-eq"表示等于;"-ne"表示不等于;"-gt"表示大于;"-ge"表示大于等于;"-lt"表示小于;"-le"表示小于等于


eg:


"-n"表示目标不为空,"-z"表示目标为空


eg:


拓展:



"-e"表示存在;"-b"表示block;"-f"表示file;"-d"表示directory;"-S"表示socket;"-L"表示link;"-ot"表示前者比后者老或者旧"-nt"表示前者比后者新


eg:


五. 四则运算

1. 运算法则

++    i++        i=i+1
--      i--          i=i-1


+=    j+=i       j=j+i
-=     j-=i        j=j-i


+

-
*
/
**
%

2. 运算命令

$[ 3 + 2 ]

let A=3+2

expr 3+2

eg1:10s倒计时


注:echo -ne "\r    \r"表示刷新前一秒的记录

eg2:1m10s倒计时


拓展:备份数据库


延伸1:


注:"$?" == "0"表示命令没有出错

延伸2:


测试:


六. 脚本中的常用语句

1.

for                             #定义变量及变量范围

do                             #执行的命令操作

done

eg:创建用户并逐行对应密码


2.

while

do

done

eg:


3.

if              #表判断,假设

then         #执行假设所对应动作

elif           #再次假设

then         #执行假设所对应动作

else         #逻辑关系所对应的最后一种假设,并执行相应动作

fi

eg:


测试:


4.

case       #对条件同时访问,不同于if,需要逐个假设


5.

.expect

yum install -y expect

eg1:


注:lindex $argv 0 为命令后第一个字符串,exp_continue为不退出expect环境继续执行后续动作

eg2:只显示被连接主机的主机名

方式一:


方式二:


注:以上方式均为在shell中进入expect环境,在shell中才可利用sh执行脚本

eg3:检测在某一ip范围内开机的主机名

注:continue为继续执行动作,exit为退出脚本,break为换行

eg4:检测ip在某一范围内可连接的主机,并在可连主机上创建用户并设定逐行相对应的密码


测试:




原创粉丝点击