shell入门

学习视频:尚硅谷Shell教程(shell自动化编程精讲)
真正的大师永远保持着一颗学徒的心


目录

第一章 Shell概述

大数据程序员为什么要学习Shell编程?

  1. 需要看懂运维人员编写的Shell程序
  2. 偶尔会编写一些简单Shell来管理集群、提高开发效率

Shell概述

Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操作系统内核

Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。

第二章 Shell解释器

注意:本文全局使用的是树莓派

(1)linux提供的Shell解析器

pi@raspberrypi:~ $ cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash

(2)bash和sh的关系

pi@raspberrypi:~ $ ls -l /bin | grep bash
-rwxr-xr-x 1 root root 925124 418  2019 bash
lrwxrwxrwx 1 root root      4 418  2019 rbash -> bash
lrwxrwxrwx 1 root root      4 515 21:49 sh -> bash

(3)树莓派默认的解释器是

pi@raspberrypi:~ $ echo $SHELL
/bin/bash

第三章 Shell脚本入门

1. 脚本格式

脚本以#!/bin/bash开头(指定解释器)

2. 第一个脚本:Hello World

#!/bin/bash
echo "Hello World";

执行

# 第一种
sh first.sh
# 第二种
pi@raspberrypi:~/Documents/shell $ sudo chmod 777 first.sh 
pi@raspberrypi:~/Documents/shell $ ./first.sh 

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

3. 第二个脚本:多命令处理

/home/pi/Templates创建一个txt文件,向里面写入数据

#!/bin/bash
cd /home/pi/Templates
echo "The second shell application" > temp.txt

第四章 Shell的变量

系统变量

1. 常用的系统变量

S H E L L 、 SHELL、 SHELLHOME、 P W D 、 PWD、 PWDUSER等

pi@raspberrypi:~/Documents/shell $ echo $PWD
/home/pi/Documents/shell
pi@raspberrypi:~/Documents/shell $ echo $HOME
/home/pi

自定义变量

基本语法

(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明一个静态变量:readonly 变量,注意:不能unset
(4)把变量提升为全局环境变量:export 变量

定义变量的规则

(1)变量名称可以有字母、数字、下划线组成,但是不能以数字开头,环境变量名建议大写
(2)等号两边不能有空格
(3)在bash中,变量的默认类型都是字符串类型,无法直接进行数值运算
(4)变量的值如果有空格,需要使用双引号或单引号括起来

案例实操

#!/bin/bash
a=1
echo "a:"$a
unset a
echo "a:"$a
readonly b=2
echo "b:"$b
unset b
echo "b:"$b
pi@raspberrypi:~/Documents/shell $ sh third.sh 
a:1
a:
b:2
third.sh: 第 9 行:unset: b:无法取消设定: 只读 variable
b:2

特殊变量:$n

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

#!/bin/bash
echo "0:"$0
echo "1:"$1
echo "2:"$2
echo "3:"$3
pi@raspberrypi:~/Documents/shell $ sh fifth.sh 
0:fifth.sh
1:
2:
3:
pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c

特殊变量:$#

获取所有输入参数的个数,常用于循环

#!/bin/bash
echo "0:"$0
echo "1:"$1
echo "2:"$2
echo "3:"$3
echo "个数"$#
pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c
个数3

特殊变量: ∗ , *, @

$*:这个变量代表了命令行中所有的参数,$*把所有参数看成一个整体
$@:这个变量也代表了命令行中所有的参数,不过$@把每个参数区分对待

#!/bin/bash
echo "0:"$0
echo "1:"$1
echo "2:"$2
echo "3:"$3
echo "个数"$#
echo *:$*
echo @:$@
pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c
个数3
*:a b c
@:a b c

特殊变量:$?

最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体哪个数由命令自己决定),则证明上一个命令执行不正确

pi@raspberrypi:~/Documents/shell $ sh fifth.sh a b c
0:fifth.sh
1:a
2:b
3:c
个数3
*:a b c
@:a b c
pi@raspberrypi:~/Documents/shell $ echo $?
0

第五章 运算符

基本语法

(1)$((运算式))$[运算式]
(2)expr +,-,\*,/,% 加减乘除取余

expr的数字与运算符之间要有间隔

案例实操

pi@raspberrypi:~/Documents/shell $ expr 2 \* 2
4
pi@raspberrypi:~/Documents/shell $ expr 2 + 2 \* 2 % 2
2
pi@raspberrypi:~/Documents/shell $ expr `expr 2 + 3` \* 4
20
pi@raspberrypi:~/Documents/shell $ s=$[(2+3)*4]
pi@raspberrypi:~/Documents/shell $ echo $s
20

第六章 条件判断

基本语法

[ condition ](注意:condition前后要有空格)

注意:条件非空即为true,[ condition ]为true,[]为false

常用判断条件

(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 文件存在(existence)
-d 文件存在并且是一个目录(directory)

(4)多条件判断

&& 表示前一条命令执行成功时,才执行后一条命令
|| 表示前一条命令执行失败后,才执行后一条命令

案例实操

pi@raspberrypi:~ $ [ 1 -eq 2 ]
pi@raspberrypi:~ $ echo $?
1
pi@raspberrypi:~ $ [ 1 -eq 1 ]
pi@raspberrypi:~ $ echo $?
0
pi@raspberrypi:~/Documents/shell $ ls -l
总用量 20
-rw-r--r-- 1 pi pi 97 7月  25 13:37 fifth.sh
-rwxrwxrwx 1 pi pi 32 7月  25 10:20 first.sh
-rw-r--r-- 1 pi pi 60 7月  25 10:31 second.sh
-rw-r--r-- 1 pi pi 29 7月  25 10:31 temp.txt
-rw-r--r-- 1 pi pi 94 7月  25 12:09 third.sh
pi@raspberrypi:~/Documents/shell $ [ -r fifth.sh ]
pi@raspberrypi:~/Documents/shell $ echo $?
0
pi@raspberrypi:~/Documents/shell $ [ -x fifth.sh ]
pi@raspberrypi:~/Documents/shell $ echo $?
1
pi@raspberrypi:~/Documents/shell $ [ -f fifth.sh ]
pi@raspberrypi:~/Documents/shell $ echo $?
0
pi@raspberrypi:~/Documents/shell $ [ -f fifth ]
pi@raspberrypi:~/Documents/shell $ echo $?
1
pi@raspberrypi:~/Documents/shell $ [ 1 -eq 1 ] && echo OK || echo nook 
OK
pi@raspberrypi:~/Documents/shell $ [ 1 -eq 1 ] && [  ] || echo nook 
nook

第七章 流程控制(重点)

if判断

if [ condition ];then
    # 程序
fi

或者

if [ condition ]
    then
        # 程序
fi

注意

(1)[ condition ]中空号和condition中间一定要有空格
(2)if后要有空格

#!/bin/bash
if [ $1 -eq 1 ];then
        echo "等于一"
elif [ $1 -eq 2 ];then
        echo "等于二"
fi
pi@raspberrypi:~/Documents/shell $ bash seven.sh 1
等于一
pi@raspberrypi:~/Documents/shell $ bash seven.sh 2
等于二

case语句

case $变量名 in
    "值1")
        # 如果变量的值等于值1,则执行
    ;;
    "值2")
        # 如果变量的值等于值2,则执行
    ;;
    # ..省略其他分支..
    *)
        # 如果变量的值不是以上的值,则执行
    ;;
esac

注意

(1)case行尾必须为单词in,每一个模式匹配必须以右括号)结束
(2)双分号;;表示命令序列结束,相当于java的break
(3)最后的*)表示默认模式,相当于java的default

#!/bin/bash
case $1 in
        "1")
                echo "The value is 1"
        ;;
        "2")
                echo "The value is 2"
        ;;      
        *)
                echo "The value is null"
        ;;
esac
pi@raspberrypi:~/Documents/shell $ bash case.sh 1
The value is 1
pi@raspberrypi:~/Documents/shell $ bash case.sh 2
The value is 2
pi@raspberrypi:~/Documents/shell $ bash case.sh 3
The value is null

for循环

第一种语法

for (( 初始值;循环控制条件;变量变化 ))
    do
        # 程序
    done
#!/bin/base

s=0
for (( i=0;i<=100;i++ ))
do
        s=$[ $s + $i ]
done
echo $s
pi@raspberrypi:~/Documents/shell $ bash for.sh 
5050

第二种语法

for 变量 in 值1 值2 值2 ...
do
    # 程序
done
#!/bin/bash
for i in $*
do
        echo "i:$i"
done
pi@raspberrypi:~/Documents/shell $ bash foreach.sh 1 2 3 4 5 6
i:1
i:2
i:3
i:4
i:5
i:6

While循环

while [ condition ]
do
    # 程序
done
#!/bin/bash
s=0
num=0
while [ $num -lt 100 ]
do
        num=$[ $num + 1 ]
        s=$[ $s + $num ]
done
echo "count:$s"
pi@raspberrypi:~/Documents/shell $ sh while.sh 
count:5050

第八章 read读取控制台输入

基本语法

read(选项)(参数)

选项:

  • -p:指定读取值时的提示符;
  • -t:指定读取值时等待的时间(秒)

参数:

  • 变量:指定读取值的变量名

案例实操

#!/bin/bash
read -p "Input your name in 7 second:" -t 7 NAME
echo "You name is "$NAME
pi@raspberrypi:~/Documents/shell $ sh read.sh 
Input your name in 7 second:Esion
You name is Esion

第九章 函数

系统函数

basename [string/pathname] [suffix]

basename命令会删除掉所有的前缀包括最后一个/字符,然后将字符串显现出来
[suffix]为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

pi@raspberrypi:~/Documents/shell $ basename /home/pi/Documents/shell/seven.sh 
seven.sh
pi@raspberrypi:~/Documents/shell $ basename /home/pi/Documents/shell/seven.sh .sh
seven

dirname 文件的绝对路径

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

pi@raspberrypi:~/Documents/shell $ dirname /home/pi/Documents/shell/seven.sh
/home/pi/Documents/shell

自定义函数

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

注意

(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会想其他语言一样先编译
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为 返回值,return后跟数值n(0-255)

#!/bin/bash
function sum()
{
        s=$[ $1 + $2 ]
        return $s
}
read -p "Please first number:" first
read -p "Please second number:" second
sum $first $second
echo "count:"$?
pi@raspberrypi:~/Documents/shell $ bash function.sh 
Please first number:3
Please second number:1
count:4

第十章 Shell工具(重点)

cut

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

cut [选项参数] filename

默认分隔符是制表符

参数说明

选项参数功能
-b以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c以字符为单位进行分割。
-d分隔符,按照指定分隔符分割分割列
-f列号,提取第几列
-n取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
pi@raspberrypi:~/Documents/shell $ cat temp.txt 
The 1 shell application
The 2 shell application
The 3 shell application
The 4 shell application
The 5 shell application
pi@raspberrypi:~/Documents/shell $ cut -b 5 temp.txt 
1
2
3
4
5
pi@raspberrypi:~/Documents/shell $ cut -d " " -f 1 temp.txt 
The
The
The
The
The
pi@raspberrypi:~/Documents/shell $ cut -d " " -f 1,2 temp.txt 
The 1
The 2
The 3
The 4
The 5

sed

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

sed [选项参数] 'command' filename

参数列表

选项参数功能
-e直接在指令列模式上进行sed的动作编辑
命令功能描述
a新增,a的后面可以接字符串,在下一行出现
d删除
s查找并替换

awk

sort

第十一章 企业真实面试题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值