基于 linux 下的shell入门(一)

一、什么是shell?

shell也是操作系统中的一个软件,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口;系统中的命令都是用shell去解释;shell接收系统回应的输出并显示到屏幕中;
bash = GNU Bourne-Again Shell

二 、什么是shell脚本?

  • 脚本是一种解释型语言;
  • 用shell脚本保存执行动作;
  • 用脚本判定命令的执行条件;
  • 用脚本来实现懂做的批量执行;
  • 记录系统命令以及命令之间的逻辑关系;

三、脚本和 C、Java 等描述性语言的区别

  • 脚本是解释性语言(命令用解释器解释),运行效率低;开发过程较为简单;
  • C、Java 等描述性语言是将动作描述给系统,运行速率较高;具有创造性,需要开发软件去编译,编译是一个将描述性语言翻译成机器可以读懂的语言过程;

示例:(1)C语言编写:

yun install gcc -y  //安装编译软件
vim /mnt/hello.c   //编辑一个.c文件
    #include <stdio.h>  //标准输入输出库函数
    void mian ()
    {
        printf("hello,word!\n");
    }
gcc hello.c   //编译,生成一个a.out文件 
./a.out   //运行

这里写图片描述
(2)shell脚本编写:

vim /mnt/hello.sh   //编写脚本
    #!/bin/bash     //幻数;这行是有含义的:脚本运行时,先运行此程序
    echo "hello,world!"  
chmod +x /mnt/hello.sh  //添加可执行权限
/mnt/hello.sh   //运行脚本

如果不加可执行权限,我们也可以直接执行命令:
sh /mnt/hello.sh


添加注释信息

[root@desktop ~]# vim /etc/vimrc

 68 autocmd BufNewFile *.sh exec ":call WANGKANA()" //当新建一个sh文件时,会自动调用WANGKANA,完成注释信息的添加;
 69 func WANGKANA()
 70         call append(0,"###############################")
 71         call append(1,"# Author:       wangkana".("      #"))
 72         call append(2,"# Version:              ".("      #"))
 73         call append(3,"# Mail:         ".("              #"))
 74         call append(4,"# Date:         ".strftime("%Y-%m-%d").("    #"))
 75         call append(5,"# Description:      ".("          #"))
 76         call append(6,"#                  ".("           #"))
 77         call append(7,"###############################")
 78         call append(8," ")
 79         call append(9,"#!/bin/bash")
 80 endfunc

[root@desktop mnt]# vim /mnt/test.sh  //新建文件,可以看到注释信息被自动添加

  1 ###############################
  2 # Author:       wangkana      #
  3 # Version:                    #
  4 # Mail:                       #
  5 # Date:         2018-06-09    #
  6 # Description:                #
  7 #                             #
  8 ###############################
  9 
 10 #!/bin/bash

这里写图片描述
这里写图片描述
注意:如果想在有需要的时候添加注释信息,将68行替换成
map <F2> ms:call WANGKANA()<cr>'s
快捷键<F2>手动添加注释信息。(1)这里的F2可以换成去其他的按键,但是确保此键是没有其他用处的;

这里写图片描述


diff命令的使用

[num1,num2][a | c | d][num3,num4]
num1,num2 表示在第一个文件中的行数;
a 表示 添加 ——add;
c 表示 更改 ——change;
d 表示 删除 ——delete;
< 表示 第一个文件中的内容
> 表示第二个文件中的内容
num3,num4表示在第二个文件中的行数

1)比较两个文件的不同;
示例 1:

[root@client mnt]# cat test  //test文件内容
hahaha
westos
[root@client mnt]# cat test1  //test1文件内容
hahaha
[root@client mnt]# diff test test1
2d1    // delete; 将第一个文件的第二行删除就和第二个文件一样了
< westos

这里写图片描述

[root@client mnt]# cat test  //test文件内容
hahaha
linux
[root@client mnt]# cat test1  //test1文件内容
hahaha
westos
[root@client mnt]# diff test test1
2c2   //change ; 第一个文件的第二行改成第二个文件的第二行就一样了
< westos
---
> linux

这里写图片描述

[root@client mnt]# cat test  //test文件内容
hahaha
[root@client mnt]# cat test1  //test1文件内容
hahaha
linux
[root@client mnt]# diff test test1
1a2  // add ; 第一个文件添加第二个文件的第二行就一样了;
> linux

这里写图片描述
示例 2 :生成补丁,打补丁

[root@client mnt]# yum install patch -y //安装软件
[root@client mnt]# cat test  //test文件内容
hahaha
[root@client mnt]# cat test1  //test1文件内容
hahaha
linux
[root@client mnt]# diff -u test test1 > test.path  生成补丁test.path
[root@client mnt]# patch test test.path  //打补丁,以test1为标准;
patching file test
[root@client mnt]# cat test  //test文件内容
hahaha
linux
[root@client mnt]# cat test1  //test1文件内容
hahaha
linux

这里写图片描述
这里写图片描述
注意:如果想要保留原文件内容,执行命令:
patch -b test test.path
生成.orig文件,即原来文件内容

2)比较目录的不同 -r

[root@client mnt]# mkdir linux 
[root@client mnt]# mkdir westos
[root@client mnt]# cd linux 
[root@client linux]# touch file 
[root@client mnt]# diff -r linux westos
Only in linux:file

这里写图片描述


cut 命令 : 多用于字符的截取

cut -d     指定分隔符
cut -f 1,7 |  1-7  指定截取的列;17截取第一列和第七列;1-7是截取第一列到第七列
cut -c 1,4 | 1-4  指定截取的字符位置;14截取第一个和第四个字符;1-4截取第一到第四个字符;

这里写图片描述
这里写图片描述
实例 :
要求:编写一个脚本,执行结果可以得到本台主机的ip;

vim ip_check.sh
    #!/bin/bash
    ifconfig eth0 | grep "inet " | cut -d " " -f 10
sh ip_check.sh

————-> 优化:

vim ip_show.sh
    #!/bin/bash
    ifconfig eth0 | awk -F " " '/inet\>/{print $2}'   //awk数据报告器
sh ip_check.sh

这里写图片描述


ping 命令

ping -c1 -w1 172.25.254.10 &> /dev/null 检测是否可以ping通172.25.254.10,不管结果如何将结果打入到垃圾箱里; 其中,-w指定超时间隔 ;
这里写图片描述
实例:
要求:检验某个ip 是否可以ping通;

vim ping_check.sh  
    #!/bin/bash
    ping -c1 -w1 "$1" &> /dev/null && echo $1 is up || echo $1 is down
sh ping_check.sh 172.25.254.74  //运行脚本

sort 命令: 排序

sort  -n    ## 纯数字排序
sort  -r    ## 倒序
sort  -u    ## 去掉重复数字
sort  -o    ## 输出到指定文件中
sort  -t    ## 指定分隔符
sort  -k    ## 指定要排序的列

示例 1:
这里写图片描述
这里写图片描述
这里写图片描述
示例 2:
这里写图片描述
这里写图片描述
shell脚本实例 3 :
要求:显示/mnt下最大的文件名

vim check_file.sh
    #!/bin/bash
    ls -Sl /mnt/ | grep -v total | awk -F " " 'NR==1{print $9}'
sh check_file.sh 

这里写图片描述


uniq 命令 : 对重复字符做相应处理

uniq -u      ##显示唯一的行
uniq -d      ##显示重复的行
uniq -c      ##每行显示一次并统计重复次数

示例:
这里写图片描述
这里写图片描述
这里写图片描述


test 命令

\ && | |
脚本的含义 true false
C中的含义
test和[]等同;
即:test "$A" == "$B" 等同 [ "$A" == "$B" ]
[ "$A" = "$B" ]     //等于
[ "$A" != "$B" ]    //不等于
[ "$A" -eq "$B" ]   //等于
[ "$A" -ne "$B" ]   //不等于
[ "$A" -le "$B" ]   //小于等于
[ "$A" -lt "$B" ]   //小于
[ "$A" -ge "$B" ]   //大于等于
[ "$A" -gt "$B" ]   //大于 
[ "$A" -ne "$B" -a "$A" -gt "$B" ]  //-a 必须都满足条件
[ "$A" -ne "$B" -o "$A" -gt "$B" ]  //-o 至少满足一个条件
[ -z "$A" ]   //是否为空
[ -n "$A" ]   //
[ "file1" -ef "file2" ]  //-ef  表示是否为硬链接
[ "file1" -nt "file2" ]  //-nt  n表示new
[ "file1" -ot "file2" ]  //-ot  o表示old
[ -e "file" ]  是否存在
[ -f "file" ]  普通文件
[ -b "file" ]  块设备
[ -S "file" ]  套接字
[ -c "file" ]  字符设备
[ -L "file" ]  软链接

脚本实例 1:
利用脚本检查文件file属于哪个类型;

vim /mnt/file.sh
    #!/bin/bash
    [ "$1" "/mnt/file" ]&& echo yes || echo no

这里写图片描述
这里写图片描述
这里写图片描述
脚本实例 2:
要求:判断数字是否在10以内;

vim nm_check.sh
    #!/bin/bash
    [ -z "$1" ]&&{
        echo please input a number !!
        exit 1
    }
    [ "$1" -gt "0" -a "$1" -lt "10" ] && {
        echo "$1 is in range"
    }||{
        echo "$1 is not in range"
    }

这里写图片描述
脚本实例 3:
要求:输入一个文件名称,判断属于什么类型的设备,并输出;

vim file_check.sh
    #!/bin/bash
    [ -z "$1"]&&{
        echo "please input a file name after scripts!!"
        exit 1
    }
    [ -e "$1" ] || {
        echo " $1 is not exit!!"
        exit 0
    }
    [ -L "$1" ] && {
        echo "$1 is a link"
        exit 1 }
    [ -f "$1" ] && {
        echo "$1 is a common file"
        exit 1 }
    [ -S "$1" ] && {
        echo "$1 is a taojiezi"
        exit 1 }
    [ -b "$1" ] && {
        echo "$1 is a block file"
        exit 1}
    [ -d "$1" ] && {
        echo "$1 is a directory"
        exit 1}
    [ -c "$1" ] && {
        echo "$1 is a character device"
        exit 1
     }

这里写图片描述


tr 命令

tr ‘A-Z’ ‘a-z’ ##将大写字母转换成小写字母

脚本示例 4:
要求大小写字母不识别;

[root@client mnt]# vim text.sh  
#!/bin/bash
WORD=$(echo $1 | tr 'A-Z' 'a-z')  //将所有的大写字母全部转换成小写字母

[ "$WORD" = "hello" ] && {
        echo yes
}||{
        echo no 
}

这里写图片描述
脚本示例 5:

vim /mnt/$#_check.sh
    #!/bin/bash
    eco/ho $#

这里写图片描述
脚本示例 6:

要求:
用户检验(如果是系统中存在的用户,输出用户已存在;如果是系统中不存在的用户,则建立并修改密码)

思路:

  • 查看脚本后所跟字符是不是2串
  • 检测第一串字符是不是一个用户
  • 密码
vim /mnt/user_create.sh
    #!/bin/bash
    [ "$#" -eq "2" ]||{
        echo "please input username and password!"
        exit 1
    }
    check_user=`getent passwd $1`
    [ -n "$check_user" ]&&{
        echo "$1 is exist!"
        exit 1
    }
    useradd $1
    echo $2 | passwd --stdin $1

这里写图片描述

猜你喜欢

转载自blog.csdn.net/wangkana/article/details/80750283
今日推荐