Shell基础

1、什么是Shell

        Shell是一个命令行解释器,是一个黑窗口,当我们在给Linux发出一些命令时,Shell将这些命令翻译成内核可以理解的动作,然后调用内核,操作硬件,操作完成之后,再将信号,翻译成人能理解的形式反馈出来。

        Shell还是一个功能强大的编程语言。

        从狭义来讲,shell并不是一门语言,它是计算机内核和人沟通的一个桥梁,广义来讲,Shell是一门编程语言。

        每一个操作系统都有一个不同的Shell。

2、Shell解释器

        Linux提供的Shell解析器有

cat /etc/shells 

/bin/sh              是bash的一个软链接(相当于windows的快捷方式)
                     硬链接:如B是A的硬链接,A指向源文件,访问B会直接访问源文件,不会通过A
                     当删除源文件,软链接不能够使用,硬链接不受影响

/bin/bash            linux默认的解释器

/sbin/nologin        以下可以理解为外语,比如法语,英语,德语等,不太常用
/bin/dash
/bin/tcsh
/bin/csh

3、Shell脚本的helloword

        用解释型语言写成的程序称为脚本,是一个命令行的合集,计算机会一行一行进行翻译。

       脚本以#!/bin/bash开头,指的是接下来的每一条命令都是bash命令,注意Shell的脚本的注释以#开头但#!/bin/bash不是一行注释,此句表明需要使用的是bash解释器。

touch helloworld.sh
vim helloworld.sh

#!/bin/bash
echo "helloworld"

        第一种执行脚本的方式

bash helloworld.sh 

        linux的文件权限

rw-rw-r-- 1-3为文件的拥有者的权限,4-6为文件拥有组的权限,7-9为其他人的权限

        要赋予helloworld.sh 脚本的执行权限

chmod +x helloworld.sh

        第二种执行脚本的方式:脚本的自执行

./helloworld.sh 

        第一种执行方法,本质是bash解析器帮忙执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本自己执行,所以需要执行权限。

4、Shell中的变量

        所有的Shell变量都是字符串,也就是说在定义变量时,不需要声明类型,等号两侧不能有空格。

a=10
echo $a

b=11
echo $a+$b

a="love you"

       撤销变量

unset a

        声明静态变量,不可以撤销,不可以修改,一般不用

readonly a=10

        在Shell中有一些系统预定义的变量,称为环境变量,可以直接使用。

        查看环境变量

env

        特殊变量:$n

        $n功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

touch parameter.sh 
vim parameter.sh

#!/bin/bash
echo $1
echo $2
echo $3

chmod +x parameter.sh

./parameter.sh aaaa bbbb cccc

        特殊变量:$#

        $#功能描述:获取所有输入参数个数,常用于循环。

vim parameter.sh
#!/bin/bash
echo $#

./parameter.sh a b c d e f g

        特殊变量:$*、$@

        $* 功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体;

       $@功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待

vim parameter.sh
echo $*
echo $@

./parameter.sh a b c d e f g

        特殊变量:$?

        $?功能描述:显示最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了,用于多个脚本之间的调用。

5、运算符

        $((运算式))”或“$[运算式]

echo $S[(2+3)*4]

6、条件判断

        [ condition ] condition前后要有空格 或者 test condition

[ $a -eq $b ]
echo $?

         判断条件condition

两个整数之间比较
= 字符串比较
-lt 小于(less than)			-le 小于等于(less equal)
-eq 等于(equal)				-gt 大于(greater than)
-ge 大于等于(greater equal)	-ne 不等于(Not equal)

按照文件权限进行判断
-r 有读的权限(read)			-w 有写的权限(write)
-x 有执行的权限(execute)

按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)		-d 文件存在并是一个目录(directory)

        查看test全部功能

man test

7、流程控制

        if判断:如果第一个参数是1输出a,2输出b,其他输出3。其中test可以用[  ]代替

if test $1 = 1
then
    echo a
elif test $1 = 2
then
    echo b
else
    echo c
fi

        case语句:如果第一个参数是1输出a,2输出b,其他输出3。

case $1 in 
"1")
    echo a
    ;;
"2")
    echo b
    ;;
*)
    echo c
    ;;
esac

        for循环:从1加到100

#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
    sum=$[$sum+$i]
done
echo $sum

        增强for

for i in a b c
do 
    echo $i
done

        while循环:从1加到100

#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
    sum=$[$sum+$i]
    i=$[$i+1]
done
echo $sum

8、读取控制台输入

        read(选项)(参数) 作用:read通过控台输入给一个变量赋值,提供了一个参数以外的人和程序交互的方式,叫做控制台输入。

#!/bin/bash
read i
echo $i

        添加-p参数可以让控制台打印一些提示信息

#!/bin/bash
read -p "input something" i
echo $i

        -t参数,在十秒以内输完

#!/bin/bash
read -p "input something in 10s" -t 10 i
echo $i

9、函数

        基本语法,[]内的内容可以省略

[ function ] funname[()]
{
	Action;
	[return int;]
}
funname

        自定义一个函数aaa,其中有两个参数 

function aaa
{
i=$[$1+$2]
echo $1
return $1
}

        之后aaa 4 5 就可以调用,4 5 为参数,返回值返回的是一个状态码,0表示正确,其他表示错误。

        系统函数

        basename 路径名称:功能描述,basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

        dirname 文件绝对路径:功能描述,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

10、Shell工具

        四个流处理工具

        cut

        cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

        cut [选项参数]  filename

选项参数	    功能
-f	        列号,提取第几列
-d	        分隔符,按照指定分隔符分割列
-c	        指定具体的字符

        剪出虚拟机的IP地址 

ifconfig | grep Bcast | cut -d : -f 2 | cut -d " " -f 1

        取出第20个和第30个字符

ifconfig | grep Bcast | cut -c 20,30

        取出第20到30个字符

ifconfig | grep Bcast | cut -c 20-30

        sed

        sed是一种编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。

        sed [选项参数]  ‘command’  filename

选项参数	    功能
-e	        直接在指令列模式上进行sed的动作编辑。
-i	        直接编辑文件

命令	    功能描述
a 	        新增,a的后面可以接字串,在下一行出现
d	        删除          '2d' 删除第二行
s	        查找并替换     '2s/替换的字符/替换的内容/'

        将第二行的inet替换成aaaa 

ifconig | sed '2s/inet/aaaa/'

        删除第二行到第五行

ifconfig | sed '2,5d'

        将第二行和第五行的0变为X,不加g只会更改第二行和第五行的第一个0,当有多个命令,需要加-e

ifconfig | sed -e '2s/0/X/g' -e '5s/0/X/g';

        将inet afddr 更改为ip addr

ifconfig | sed 's/inet addr/ip addr/'

        正则表达式:通过一段非常扭曲的字符来匹配一段字符串。

        替换表达式内部直至正则表达式

ifconfig | sed 's/inet[6]* addr/ip address/'

        正则表达式的六个规则

\   转义

^   一行的开头
    ^R------表示以R开头的行

$   匹配一行的结束
    R$表示以R结尾的行

*   表示上一个子式匹配0次或多次,是一个贪心匹配
    Zo*-----表示Z开头后面跟着若干个o,以下三个字符串都可以匹配到
            Z
            Zo
            Zooo

.   匹配一个任意的字符
    .*匹配任意字符串

[]  表示匹配某个范围内的一个字符
    [6,8]------匹配6或者8
    [a-z]------匹配一个a-z之间的字符
    [a-z]*-----匹配任意字母字符串

        将数字6保存下来,使用()再在后面调用即可,可以保存9个子式,使用\1-9完成调用。

ifconfig | sed 's/inet\([6]*\) addr/ip\1 address/'

        范围表达也可以使用正则表达式,使用两个\把范围括起来。

        将以R开头到T开头行的0替换成X。

ifconfig | sed '/^ *R/,/^ *T/s/0/X/g'

        每一个shell环境都是一个进程,并且shell可以启动很多个,各个shell环境之间是独立的

        执行脚本时,是在子环境中执行的,而不是在当前环境中执行的。

        使用source完成当前环境执行一个脚本:

source a.sh

        awk

        一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

        awk [选项参数] ‘pattern1{action1}  pattern2{action2}...’ filename

        pattern:表示AWK在数据中查找的内容,就是匹配模式

        action:在找到匹配内容时所执行的一系列命令

选项参数	功能
-F	    指定输入文件折分隔符
-v	    赋值一个用户定义变量

        将以r开头的行打印出来 

cp /etc/passwd ./

cat passwd | awk '/^r/{print}'       

        用-F指定切割规则,以:为规则切割

cat passwd | awk -F : '/^r/{print $4}'

       awk内置变量

变量	        说明
FILENAME	文件名
NR	        已读的记录数
NF	        浏览记录的域的个数(切割后,列的个数)

        查看awk使用手册

man awk

        sort

        sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

        sort(选项)(参数)

选项	        说明
-n	    依照数值的大小排序
-r	    以相反的顺序来排序
-t	    设置排序时所用的分隔字符
-k	    指定需要排序的列
cat passwd | awk -F : '/^a/{print}' | sort -t : -k 3 -n -r

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值