shell小白学习笔记

本文详细介绍了Shell的基础知识,包括什么是Shell、变量、运算符、条件判断、流程控制、函数、读取控制台输入、常用命令工具如cut、sed、awk以及sort的使用。还提供了企业面试题示例,涵盖了文件操作、进程查找和端口查询等实际场景。此外,文章讲解了启动程序的不同方式,以及编写脚本来根据应用名称查找其进程号和占用的端口号。
摘要由CSDN通过智能技术生成

目录

一、shell是什么

二、实践

三、shell中的变量

1、系统变量

2、自定义变量

3、系统提供的特殊变量

四、运算符

五、条件判断

1、常用判断条件

2、操作实例

3、多条件判断

六、流程控制

七、read读取控制台输入

八、函数

九、shell自带的工具(重点)

1、cut [选项参数] filename

2、sed [选项参数] ‘command’ filename

3、awk [选项参数] ‘pattern 1 {action} pattern 2 {action} ........’ filename

4、sort(选项)(参数) 将文件进行排序,并将排序结果有序输出。

十、企业真实面试题

十一、启动程序的两种方式

十二、根据应用名称查找其进程号再找其所占用的端口号shell脚本


一、shell是什么

shell命令解释器,是一个程序。提供很多功能。

#!/bin/sh

#!/bin/bash

这俩都是让别人执行,让sh解释器或者是bash解释器执行,不需要赋予权限

./    自己执行,需要赋予执行的权限

二、实践

  • 需求:创建一个脚本实现:在一个路径下创建文件,在文件下添加文本。

1、创建.sh文件:

        touch kk.sh

2、编辑:

        vi kk.sh

3、输入内容:

        cd /home/路径

        touch wenjianming.txt

        echo “wenbenneirong” >> wenjianming.txt

        :wq

4、执行:bash kk.sh       

                sh  kk.sh

                ./ kk.sh

三、shell中的变量

1、系统变量

$HOME :   echo $HOME        获取家目录

$PWD: echo $PWD                获取当前所在目录

$SHELL: echo $SHELL          获取shell所在目录

$USER: echo $USER             获取当前用户名

2、自定义变量

定义变量: 变量名=值                 等号左右不可以有空格

撤销变量: unset 变量名

声明一个静态变量: readonly 变量=值         注意:静态变量不能unset

变量定义规则:

  1. 变量名称可以由字母、数字、下划线组成,不能以数字开头,环境变量名建议大写
  2. bash中变量类型默认为字符串类型,无法进行数值运算。取数值需要前面加上$。
  3. 变量的值如果有空格需要使用引号把整个值括起来。
  4. 可把变量提升为全局变量,可供其他shell程序使用。

export 变量名

3、系统提供的特殊变量

  1. $n

    功能描述:n代表数字

    $0 代表该脚本(.sh文件的名字)名称

    $1-$9 代表第1到第9个参数

    ${10} 10及以上的参数需要用大括号括上

    应用:

            创建sh文件:

            touch parameter.sh

            vim parameter.sh

            编辑:#!/bin/bash

                    Echo “$0 $1 $2 $3”

    使用sh文件:bash parameter.sh word1 word2 word3

    即可显示出:文件名 第一个参数 第二个参数 第三个参数

  2. $#:功能:获取所有输入参数个数,常用于循环。
  3. $*:功能:把所有的参数看成一个整体,代表所有参数
  4. $@:功能:把每个参数区分对待,代表所有参数
  5. $?:功能:最后一次执行命令的返回状态,为0执行正确,非0(自己设定)为执行不正确。

        echo $#

        echo $*

        echo $@

        echo $?

四、运算符

语法:$((运算式))  或  $[运算式]

        例如:s=$[(2+3)*4]

        echo $s

        expr: +  -  \*   /  %    加减乘除取余        expr运算符间必须有空格

        例如:expr 3 + 2   +两侧有空格

              expr `expr 3 + 2` \* 4

五、条件判断

$ [ 条件 ]      条件前后有空格, [ 和 ] 前后有空格  

                        条件非空即为true,[  ]返回false。

1、常用判断条件

1、两个整数之间的比较

                = 字符串比较

                -lt 小于(less than)

                -le 小于等于(less equal)

                -eq 等于(equal)

                -gt 大于(greater than)

                -ge 大于等于(greater equal)

                -ne 不等于(not equal)

2、按照文件权限进行判断

                -r 有读的权限(read)

                -w 有写的权限(write)

                -x 有执行的权限(execute)

3、按照文件类型进行判断

                -f 文件存在并且是一个常规文件(file)

                -e 文件存在(exit)

                -d 文件存在并且是一个目录(directory)

2、操作实例

两整数比较大小:

                $ [ 23 -ge 22 ]

                echo $?

helloword.sh文件是否有写权限:

                $ [ -w helloword.sh ]

                echo $?

判断一个路径下的具体文件是否存在:

                $ [ -e 路径/文件 ]

                echo $?

3、多条件判断

                &&表示上一条命令成功时才执行下一条命令

                ||表示上一条命令失败时才执行下一条命令

                $ [ 条件 ] && echo OK || echo notok ||后面的不执行

                $ [ 条件 ] && [  ] || echo notok         || 后面的执行

六、流程控制

1、if判断

                if [ 条件判断式 ];then

                                程序1

                fi

或者

                if [ 条件判断式 ]

                        Then

                                程序

                fi

注意:

中括号和条件判断之间必须要有空格

if后要有空格

案例实操:

        输入一个数字,如果是1 ,则输出banzhang zhen shuai ,如果是2,则输出 kk zhen mei,如果是其他,则什么也不输出。

                touch fi.sh

                vim fi.sh

                #!/bin/bash

                if [ $1 -eq 1 ]

                        Then

                                Echo “banzhang zhen shuai”

                                elif [ $1 -eq 2 ]

                                Then

                                Echo “kk zhen mei”

                fi

2、case语句

                case $变量名 in

                        “值1”)

                                如果变量的值等于1,则执行程序1

                ;;

                        “值2”)

                                如果变量的值等于2,则执行程序2

                ;;

                ..............

                *)

                                如果变量的值都不是以上的值,则执行此程序。

                ;;

                esac

案例实操

输入一个数字,如果是1,则输出bangzhan,如果是2,则输出kk,如果是其他,则输出dalao。

                #!/bin/bash

                case $1 in

                        1)

                                echo “banzhang”

                        ;;

                        2)

                                echo “kk”

                        ;;

                        *)

                                echo “dalao”

                        ;;

                esac

3、for循环

语法1:

                for (( 初始值;循环控制条件;变量变化 ))

                        do

                                程序

                        done

案例实操:

从1加到100:

                #!/bin/bash

                s=1

                for (( i=1;i<=100;i++ ))

                        do

                                s=$[ $s+$i ]

                        done

                echo $s

语法2:

                for 变量 in 值1 值2 值3.......

                        do

                                程序

                        done

案例实操:

打印所有输入参数:

                #!/bin/bash

                #打印数字

                for i in $* 或者$i  ——这里使用”$*”和”$@”二者有区别:一次性全给和一个一个取

                        do

                                echo “banzhang xihuan $i”

                        done

4、while循环

                while [ 条件判断式 ]

                        do

                                程序

                        done

案例实操:

                从1加到100:

                #!/bin/bash

                s=0

                i=1

                while [ $i -le 100 ]

                        do

                                s=$[$s + $i]

                        done

七、read读取控制台输入

read(选项)(变量)

选项:

-p:指定读取值时的提示符          读取输入的值,赋给变量

-t:指定读取值时的等待时间(秒)

变量:

指定读取值的变量名

案例实操:

read -t 7 -p Enter your name in 7 seconds: NAME

echo $NAME

八、函数

1、系统函数

basename [string / pathname] [suffix]

basename命令会删掉所有的前缀,包括最后一个字(‘/’)符,然后将字符串显示出来即获取路径里的文件名称,带后缀

suffix为后缀,如果后缀被指定了,basename会将pathname或string中的后缀去掉

                        若制定了后缀,即获取不带后缀的文件名

例:

basename    路径/文件名 按回车返回带后缀的文件名

basename    路径/文件名  .txt    按回车返回不带后缀的文件名

dirname 文件的绝对路径

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

2、自定义函数

[ function ] funname[()]

{

        Action;

        [return int;]

}

funname

必须在调用函数的地方之前,先声明这个函数,shell脚本是逐行运行的。

函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值n(0-255)

案例实操:

        求和函数:

                #!/bin/bash

                function sum()

                {

                        s=0;

                        s=$[$1 + $2]

                        echo $s

                }

                read -p “input your parameter1:” n1

                read -p “input your parameter2:” n2

                sum $n1 $n2 ——调用sum函数

九、shell自带的工具(重点)

1、cut [选项参数] filename

        剪切数据使用,从文件的每一行剪切字节、字符和字段,并将剪切结果输出。

        -f 列号,提取第几列

        -d 分隔符,按照指定分隔符分割列;默认分隔符是制表符\t

案例实操:

        一个带有以下内容的cut.txt文件:

        guang shen

        dong zhen

        wo wo

        lai lai

        le le

取第一列:cut -d “ ” -f 1 cut.txt

取第二、三列:cut -d “ ” -f 2,3 cut.txt

取guang:cat cut.txt | grep guang | cut -d “ ” -f 1

选取系统PATH变量,第2个“:”开始后的所有路径:echo $PATH | cut -d “:” -f 3-

                                                                                        3-:代表第三列之后所有的

切割ipconfig后打印的IP地址:ifconfig eth0 | grep “inet addr”------获取IP所在行

ifconfig eth0 | grep “inet addr” | cut -d : -f 2 | cut -d “ ” -f 1

2、sed [选项参数] command filename

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

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

命令:

        a:新增,a的后面可以接字串,在下一行出现。

        d:删除

        s:查找并替换

案例实操:

准备数据:touch sed.txt

                vim sed.txt

                dong shen

                guan zhen

                wo wo

                lai lai

                le le

1、将“mei nv”这个单词插入到sed.txt文件的第二行,打印。

sed “2a mei nv” sed.txt

——源文件并不会改变,只是打印出来了

2、删除sed.txt文件中包含有“wo”的行。

sed “/wo/d” sed.txt

3、将sed.txt文件中的“wo”替换成“ni”。

sed “s/wo/ni/g” sed.txt

——加上g代表全局替换,如果不加只替换第一个globle

4、将sed.txt文件中第二行删除并将“wo”替换成“ni”。

sed -e “2d” -e “s/wo/ni/g” sed.txt

3、awk [选项参数] pattern 1 {action} pattern 2 {action} ........ filename

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

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

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

选项参数:

-F 指定输入文件拆分隔符

-v 赋值一个用户定义变量

案例实操

sudo cp /etc/passwd ./

sudo chown wodemingzi:wodemingzi passwd

cat passwd

1、搜索以root关键字开头的所有行,并输出该行的第7列

awk -F : ‘/^root/ {print $7}’ passwd

2、搜索以root关键字开头的所有行,并输出该行的第1列和第7列,中间以,分割

awk -F : ‘/^root/ {print $1 “,” $7}’ passwd

3、只显示/etc/passwd的第一列和第七列,以逗号分隔,且在所有行前面添加列名user,shell在最后一行添加”dahaige,/bin/zuishuai”。

awk -F : ‘BEGIN{print “user,shell”} {print $1 “,” $7} END{pring “dahaige,/bin/zuishuai”}’ passwd

        BEGIN         所有数据读取行之前执行

        END         所有数据读取之后执行

4、用户id增加数值1并输出

                awk -F : -v i=1 ‘{print $3 + i}’

                awk的内置变量:

                FILENAME 文件名

                NR 已读的记录数

                NF 浏览记录的域的个数(切割后,列的个数)

5、统计passwd文件名,每行的行号,每列的列数

awk -F : ‘{print “filename:” FILENAME “,linenumber:” NR “,columns:” NF}’ passwd

6、切割IP

ifconfig eth0 | grep “inet addr” | awk -F : ‘{print $2}’ | awk -F “ ” ‘{print $1}’

7、查询sed.txt中空行所在的行号

awk /^$/ {print NR} sed.txt ——是一道面试题

4、sort(选项)(参数) 将文件进行排序,并将排序结果有序输出。

选项:

        -n 依照数值的大小排序

        -r 以相反的顺序来排序

        -t 设置排序时所用的分割字符

        -k 指定需要排序的列

参数:指定待排序的文件列表

案例实操:

        数据准备:touch sort.sh

                           vim sort.sh

                        

        按照第二列处理:

                sort -t : -nrk 2 sort.sh

十、企业真实面试题

  1. 京东

问题1:使用Linux命令查询文件中空行所在的行号。

awk ‘/^$/ {print NR}’ set.txt

问题2:有文件chengji.txt的内容如下:

张三 40

李四 50

王五 60

使用Linux命令计算第二列的和并输出。

cat chengji.txt | awk -F “ ” ‘{sum+=$2} END{print sum}’

  1. 腾讯&搜狐

问题1:shell脚本里如何检查一个file文件是否存在?如果不存在该如何处理?

#!/bin/bash

if [ -f file.txt ]

then

echo “文件存在!”

else echo “文件不存在!”

fi

  1. 新浪

问题1:用shell写一个脚本,对文本中无序的一列数字排序。

sort -n 文件名

问题2:对文本中无序的一列数字排序并求和。

sort -n 文件名 | awk ‘{a+=$0;print $0} END{print “sum” a}’

  1. 金和网络

问题1:查找当前文件夹(/home)下所有文本文件内容中包含有字符“shen”的文件名称。

grep -r “shen” | cut -d : -f 2

十一、启动程序的两种方式

bash ./

十二、根据应用名称查找其进程号再找其所占用的端口号shell脚本

bb={ps -elf | grep 应用名称 | awk {print $3}}

netstat -natup|grep $bb | grep :::

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值