Shell脚本

第一个Shell脚本:helloworld

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

接下来创建一个Shell脚本,输出helloworld

  1. touch hello.sh

  2. 写入 命令

    #!/bin/bash

    echo “helloworld”

  3. 保存后执行,图中分为绝对路径和相对路径执行,sh bash一样功能,只不过sh指向bash,是个软连接,最后也是调用bash;直接在根目录下执行需要赋予脚本权限

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

第二个Shell脚本:多命令处理

在shell目录下创建一个demo.txt,在demo.txt文件中增加“I like drinking Coke”。

#!/bin/bash
touch demo.txt
echo "I like drinking Coke" >> demo.txt

Shell中的变量

系统以及自定义变量

常用系统变量:HOME、HOME、HOME、PWD、SHELL、SHELL、SHELL、USER等,方便在文件写入操作。

1.基本语法

​ (1)定义变量:变量=值

​ (2)撤销变量:unset 变量

​ (3)声明静态变量:readonly变量,注意:不能unset

2.变量定义规则

​ (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

​ (2)等号两侧不能有空格

​ (3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

​ (4)变量的值如果有空格,需要使用双引号或单引号括起来。

​ (5)可把变量提升为全局环境变量,可供其他Shell程序使用:export 变量名

sxh@learn-basis:shell$ A=4             //定义变量A
sxh@learn-basis:shell$ echo $A
4
sxh@learn-basis:shell$ A=9                //给变量A重新赋值
sxh@learn-basis:shell$ echo $A
9
sxh@learn-basis:shell$ unset A             //撤销变量A
sxh@learn-basis:shell$ echo $Asxh@learn-basis:shell$ readonly B=2                //声明静态的变量B=2,不能unset
sxh@learn-basis:shell$ echo $B
2
sxh@learn-basis:shell$ unset B
bash: unset: B:无法取消设定: 只读 variable
sxh@learn-basis:shell$ C=1+2             //在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
sxh@learn-basis:shell$ echo $C
1+2
sxh@learn-basis:shell$ D=I love you           //变量的值如果有空格,需要使用双引号或单引号括起来
/*error
Command 'love' not found, but can be installed with:
sudo snap install love  # version 11.2+pkg-d332, or
sudo apt  install love  # version 11.3-1
See 'snap info love' for additional versions.
*/
sxh@learn-basis:shell$ D="I love you"
sxh@learn-basis:shell$ echo $D
I love you
sxh@learn-basis:shell$ vi hello.sh写入#!/bin/bashecho "hello sxh"echo $C
sxh@learn-basis:shell$ ./hello.sh
hello sxh//发现并没有打印输出变量C的值。
sxh@learn-basis:shell$ export C        //把变量提升为全局环境变量,可供其他Shell程序使用
sxh@learn-basis:shell$ ./hello.sh
hello sxh
1+2                //success

特殊变量

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

新建文件写入

#!/bin/bash

echo “$0 $1 $2”

输出该脚本文件名称、输入参数1和输入参数2 的值,参数3已经不再输出了

  1. ​ $# (功能描述:获取所有输入参数个数,常用于循环)

编辑文件写入 echo $#

获取输入参数的个数

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

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

    两个都是打印输入的所有参数

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

sxh@learn-basis:shell$ ./para.sh a b c
./para.sh a b
3
a b c
a b c
sxh@learn-basis:shell$ echo $?
0    //返回0表示正确

运算符

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

(2)expr + , - , *, /, % 加,减,乘,除,取余

注意:expr运算符间要有空格

`expr 3 + 2` 先运算加法   \*再运算乘法

条件判断

  1. 基本语法

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

注意:条件非空即为true,[ atguigu ]返回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 文件存在(existence) -d 文件存在并是一个目录(directory)

(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)

流程控制

if 判断

语法:

if [ 条件判断式 ];then

程序

fi

或者

if [ 条件判断式 ]

then

​ 程序

fi

​ 注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

demo:输入一个数字,如果是1,则输出I like drinking Coke,如果是2,则输出I like to drink Sprite,如果是其它,什么也不输出。

#!/bin/bashif [ $1 -eq "1" ];thenecho "I like drinking Coke"
elif [ $1 -eq "2" ]
then echo "I like to drink Sprite"
fi

case 语句

语法:

case $变量名 in

“值1”)

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

​ ;;

“值2”)

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

​ ;;

…省略其他分支…

*)

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

​ ;;

esac

注意事项:

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

demo:输入一个数字,如果是1,则输出I like drinking Coke,如果是2,则输出I like to drink Sprite,如果是其它,输出nothing。

#!/bin/bashcase $1 in
1)echo "I like drinking Coke"
;;
2)echo "I like to drink Sprite"
;;
*)echo "nothing"
;;
esac

for 循环

基本语法1:

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

do

​ 程序

done

demo:从1加到100

#!/bin/bashS=0
for((i=0;i<=100;i++))
doS=$[$S+$i]
done
echo $S

基本语法2:

for 变量 in 值1 值2 值3…

do

​ 程序

done

demo:打印所有输入参数

sxh@learn-basis:shell$ touch for2.sh
sxh@learn-basis:shell$ vi for2.sh
#!/bin/bashfor i in $*
doecho "this is a char $i"
donesxh@learn-basis:shell$ sh for2.sh a
this is a char a
sxh@learn-basis:shell$ sh for2.sh a b
this is a char a
this is a char b
sxh@learn-basis:shell$ sh for2.sh a b c
this is a char a
this is a char b
this is a char c

比较∗和*和∗和@区别

(a)∗和*和∗和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2…2 …2…n的形式输出所有参数。

sxh@learn-basis:shell$ vi for2.sh
#!/bin/bashfor i in $*
doecho "this is a char $i"
donefor j in $@
do echo "this is a char $j"
done sxh@learn-basis:shell$ sh for2.sh a
this is a char a
this is a char a
sxh@learn-basis:shell$ sh for2.sh a b
this is a char a
this is a char b
this is a char a
this is a char b
sxh@learn-basis:shell$ sh for2.sh a b c
this is a char a
this is a char b
this is a char c
this is a char a
this is a char b
this is a char c

(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2…2 …2…n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “2”…”2”…”2”…”n”的形式输出所有参数。

#!/bin/bashfor i in "$*"
doecho "this is a char $i"
donefor j in "$@"
do echo "this is a char $j"
done 

while 循环

基本语法:

while [ 条件判断式 ]

do

​ 程序

done

sxh@learn-basis:shell$ touch while.sh
sxh@learn-basis:shell$ vi while.sh
sxh@learn-basis:shell$ cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
dos=$[$s+$i]i=$[$i+1]
done
echo $s
sxh@learn-basis:shell$ sh while.sh

read读取控制台输入

基本语法:

​ read(选项)(参数)

​ 选项:

-p:指定读取值时的提示符;

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

参数

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

demo:提示5秒内,读取控制台输入的名称

sxh@learn-basis:shell$ touch read.sh
sxh@learn-basis:shell$ vi read.sh
sxh@learn-basis:shell$ cat read.sh
#!/bin/bashread -t 5 -p "Enter your name in 5 seconds" NAMEecho $NAMEsxh@learn-basis:shell$ sh read.sh
read.sh: 3: read: Illegal option -tsxh@learn-basis:shell$ bash read.sh
Enter your name in 5 secondsaaaa
aaaa
sxh@learn-basis:shell$ 

对于出现的错误:

unbuntu上运行对于 -s -t参数

bash read.sh和 ./read.sh可以正确执行,对于sh read.sh不能正确执行,报错

read.sh: 4: read: Illegal option -t

对于参数选项 -n 也是一样的

函数

系统函数

basename基本语法:

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

选项:

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

dirname基本语法:

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

自定义函数

1.基本语法

[ function ] funname[()]

{

​ Action;

​ [return int;]

}

funname

2.经验技巧

​ (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

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

demo:计算两个输入参数的和

Shell工具

cut

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

1.基本用法

cut [选项参数] filename

说明:默认分隔符是制表符

2.选项参数说明

选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列
sxh@learn-basis:shell$ touch cut.txt
sxh@learn-basis:shell$ vi cut.txt
sxh@learn-basis:shell$ cat cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le
sxh@learn-basis:shell$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
sxh@learn-basis:shell$ cut -d " " -f 2,3 cut.txt
shen
zhenwolaile
sxh@learn-basis:shell$ cat cut.txt | grep "guan" | cut -d " " -f 1
guan
//这里是过滤文件找到guan那一行,然后对这一行进行cut

接下来看看cut系统变量

sed

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

  1. 基本用法

sed [选项参数] ‘command’ filename

  1. 选项参数说明
选项参数 功能
-e 直接在指令列模式上进行sed的动作编辑。
  1. 命令功能描述
命令 功能描述
a 新增,a的后面可以接字串,在下一行出现
d 删除
s 查找并替换
sxh@learn-basis:shell$ touch sed.txt
sxh@learn-basis:shell$ vi sed.txt
sxh@learn-basis:shell$ cat sed.txt //数据准备
dong shen
guan zhen
wo  wo
lai  laile  le
sxh@learn-basis:shell$ sed '2a hi hao' sed.txt
dong shen           //将“hi hao”这个单词插入到sed.txt第二行下,打印。
guan zhen
hi hao
wo  wo
lai  laile  le
sxh@learn-basis:shell$ cat sed.txt  //文件不会有变化,只是输出有变化
dong shen
guan zhen
wo  wo
lai  laile  le
sxh@learn-basis:shell$ sed '/wo/d' sed.txt //删除sed.txt文件所有包含wo的行
dong shen
guan zhen
lai  laile  le
sxh@learn-basis:shell$ sed 's/wo/ni/g' sed.txt   //将sed.txt文件中wo替换为ni
dong shen
guan zhen
ni  ni
lai  laile  le
sxh@learn-basis:shell$ sed -e '2d' -e 's/wo/ni/g' sed.txt
dong shen    //将sed.txt文件中的第二行删除并将wo替换为ni
ni  ni
lai  laile  le
sxh@learn-basis:shell$

awk

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

  1. 基本用法

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

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

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

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

sort

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

  1. ​ 基本语法

sort(选项)(参数)

选项 说明
-n 依照数值的大小排序
-r 以相反的顺序来排序
-t 设置排序时所用的分隔字符
-k 指定需要排序的列

shell脚本基础教程,快速上手相关推荐

  1. Linux Shell脚本入门教程系列之(十四) Shell Select教程

    本文是Linux Shell脚本系列教程的第(十四)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上一篇文章:Linux Shell系列教程之(十三)Shell分支语句 ...

  2. Linux Shell脚本入门教程系列之(一)Shell简介

    本文是Linux Shell脚本系列教程的第(一)篇,更多shell教程请看:Linux Shell脚本系列教程 想要学习linux,shell知识必不可少,今天就给大家来简单介绍下shell的基本知 ...

  3. Shell最最基础教程【案例讲解】【值得收藏系列】

    Shell基础教程[案例讲解] 第1章 Shell概述 第2章 Shell解析器 第3章 Shell脚本入门 1.脚本格式 2.第一个Shell脚本:helloworld 3.第二个Shell脚本:多 ...

  4. 什么是Shell?Shell脚本基础知识详细介绍

    这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...

  5. Linux(Ubuntu 20.04 LTS)之shell使用基础教程

    Linux(Ubuntu 20.04 LTS)之shell使用基础教程 我在此使用的是VMware虚拟机安装的Ubuntu 20.04 LTS. Shell是linux系统的用户界面.Shell即是一 ...

  6. 【Unity 实用工具篇】✨| Tutorial Master 2 游戏引导教程 快速上手

    前言 [Unity 实用工具篇]✨ | Tutorial Master 2 游戏引导教程 快速上手 一.Tutorial Master 2 介绍 1.1 基本概念 1.2 相关链接 1.3 效果展示 ...

  7. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  8. SHELL脚本 基础一

    SHELL脚本基础 基本都是干货,都是通过书和视频总结的一小部分,里面应该有一些错误: SHELL变量 1.变量:临时储存数据的,该数据是可以进行变化的数据 2.变量的使用:1.多次重复使用的数据,并 ...

  9. Shell 脚本基础学习 (四)

    现在我们来讨论编写一个脚本的一般步骤.任何优秀的脚本都应该具有帮助和输入参数.并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意.这时候,在写一 ...

  10. Linux的shell脚本函数教程

    Linux的shell脚本函数教程 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.shell中函数使用示例 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.she ...

最新文章

  1. etcd 笔记(06)— Client 结构定义、客户端(初始化、KV存储Get、Put、事务 Txn、压缩 Compact、Watch、Lease
  2. 微软忘记修复Mac Office2004/2008安全漏洞
  3. Android 系统开发_四大组件篇 -- Service 解析(用法)
  4. Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)
  5. keybd_event 被 SendInput 替代
  6. wxWidgets:wxModalDialogHook类用法
  7. Java知识整理——ServletJSP
  8. maven依赖包下载地址
  9. Asp.NetCore3.1开源项目升级为.Net6.0
  10. 框架写mysql插入为空_学习springMVC框架配置遇到的问题-数据写入不进数据库时的处理办法...
  11. 中国计算机学会通讯杂志,何积丰. Cyber-physical systems [J]. 中国计算机学会通讯, 2010, 6(1): 25-29....
  12. python装饰器由浅入深_详解Python装饰器由浅入深
  13. 转转转!java继承中的this和super
  14. 这么说吧,NIO很简单,其实就是个牛逼IO
  15. ubuntu18.04 下安装搜狗输入法
  16. ps mysql进程_ps(Process Status)进程状态:列出当前正在运行的进程
  17. EXCEL柱状图制作(三)
  18. ATR-CKN算法的研究与实现
  19. ReiBoot(iOS系统修复工具)v6.9.5.0官方版
  20. win7系统计算机打不开6,Win7系统打不开ppt文件的六种原因和解决方法

热门文章

  1. 五色电阻在线计算机,色环电阻(5色环在线电阻计算器)
  2. PMO在生物制药GMP生产环境中的实践——《PMO论文集(2019)》(电子版)
  3. f1c100s 源码_F1C100S 简易 boot 原理
  4. 这三个方法让你实现电脑截图转文字的操作
  5. python离线录音转文字软件_语音转文字工具(音频转文字助手)V2.1 最新版
  6. Ruby on Rails 入门学习
  7. 错误 LNK2005 xxx已经在 xxx.obj 中定义
  8. WebSSH2和docker化
  9. 做短视频自媒体,新手一个月6000多,全靠这些工具,抓紧收藏
  10. 建筑施工企业数字化安全质量监督管理系统