Shell基础学习

本文介绍了LinuxShell的基础知识,包括Shell的概述、不同类型的Shell解析器、编写Shell脚本的基本格式和执行方式。接着,详细讲解了Shell中的变量、运算符、条件判断(如if和case语句)、流程控制(for和while循环)以及读取控制台输入。此外,还探讨了几个常用的Shell工具,如cut、sed和awk的功能和使用方法。最后,提到了sort命令用于文件排序的应用。
摘要由CSDN通过智能技术生成

Shell学习

注意: Linux中 管理员账户是 #, 普通账户是 $

Shell概述

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Y1lMHw3-1682929321302)(C:\Users\23058\AppData\Roaming\Typora\typora-user-images\image-20230429101049774.png)]

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

Shell解析器

解析器类型

  • sh
  • bash
  • nologin
  • dash
  • tcsh
  • csh

其中,sh软链接到bash, centos默认解析器是bash

Shell脚本入门

脚本格式

#!/bin/bash 

第一个shell脚本

输出:helloworld

脚本文件:

#!/bin/bash

echo "hello world"

方式一:
[root@VM-4-5-centos datas]# sh helloworld.sh 
hello world

方式二:
[root@VM-4-5-centos datas]# chmod 777 helloworld.sh 
[root@VM-4-5-centos datas]# ./helloworld.sh 
hello world

方式1,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;方式2,本质是脚本自己需要执行,所以需要执行权限

第二个shell脚本:

多命令处理

[root@VM-4-5-centos datas]# touch batch.sh
[root@VM-4-5-centos datas]# vim batch.sh 


#!/bin/bash

cd /home/tingyu/
touch yunshan.txt
echo "l love ty" >> yunshan.txt


[root@VM-4-5-centos datas]# cd ..
[root@VM-4-5-centos tingyu]# ls
datas
[root@VM-4-5-centos tingyu]# cd datas/
[root@VM-4-5-centos datas]# bash batch.sh 
[root@VM-4-5-centos datas]# cd ..
[root@VM-4-5-centos tingyu]# ll
total 8
drwxr-xr-x 2 root root 4096 Apr 29 15:57 datas
-rw-r--r-- 1 root root   10 Apr 29 15:57 yunshan.txt
[root@VM-4-5-centos tingyu]# cat yunshan.txt 
l love ty
[root@VM-4-5-centos tingyu]# 

Shell中的变量

系统变量

  • 定义变量:变量=值
  • 撤销变量: unset变量
  • 声明静态变量: readonly 变量,不能unset

常用的系统变量

$HOME $PWD $SHELL $USER

[root@VM-4-5-centos tingyu]# echo $HOME
/root
[root@VM-4-5-centos tingyu]# echo $PWD
/home/tingyu
[root@VM-4-5-centos tingyu]# echo $SHELL
/bin/bash
[root@VM-4-5-centos tingyu]# echo $USER
root

自定义变量

变量定义规则

  1. 可以由字母、数字和下划线组成,不能以数字开头,环境变量名建议大写
  2. 等号两侧不能有空格
  3. 在bash中,变量默认类型是字符串类型,无法直接进行数值运算
  4. 变量的值如果有空格,需要用双引号或者单引号
  5. 可把变量提升为全局环境变量,使用export 变量名

基本语法

  1. 定义变量:变量=值 等号两边不能留有空格
  2. 撤销变量:unset 变量
  3. 输出变量:echo $变量
  4. 声明静态变量: readonly 变量,注意:不能unset

例:

设置变量:
[root@VM-4-5-centos tingyu]# A=1
[root@VM-4-5-centos tingyu]# echo $A
1

撤销变量:
[root@VM-4-5-centos tingyu]# unset A
[root@VM-4-5-centos tingyu]# echo $A


声明静态变量:
[root@VM-4-5-centos tingyu]# readonly B=3
[root@VM-4-5-centos tingyu]# echo $B
3
[root@VM-4-5-centos tingyu]# unset B
-bash: unset: B: cannot unset: readonly variable
[root@VM-4-5-centos tingyu]# 

export使用

[root@VM-4-5-centos tingyu]# D=yunshan
[root@VM-4-5-centos tingyu]# echo $D
yunshan
[root@VM-4-5-centos tingyu]# cd datas/
[root@VM-4-5-centos datas]# vim helloworld.sh 

#!/bin/bash
echo "hello world"
echo $D

[root@VM-4-5-centos datas]# ./helloworld.sh 
hello world


[root@VM-4-5-centos datas]# export D
[root@VM-4-5-centos datas]# ./helloworld.sh 
hello world
yunshan

特殊变量

$n

n为数字,$n表示该脚本名称,$1-$9表示第一到第九个参数,10以上的参数要用大括号括起来,此处参数表示执行脚本时的参数

[root@VM-4-5-centos datas]# touch parameter.sh
[root@VM-4-5-centos datas]# vim parameter.sh 

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

[root@VM-4-5-centos datas]# bash parameter.sh 
parameter.sh   

[root@VM-4-5-centos datas]# bash parameter.sh tingyu
parameter.sh tingyu  
[root@VM-4-5-centos datas]# bash parameter.sh tingyu yunshan
parameter.sh tingyu yunshan 
[root@VM-4-5-centos datas]# bash parameter.sh tingyu yunshan ty
parameter.sh tingyu yunshan ty

$#

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

[root@VM-4-5-centos datas]# vim parameter.sh 

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

[root@VM-4-5-centos datas]# bash parameter.sh 
parameter.sh   
0
[root@VM-4-5-centos datas]# bash parameter.sh yunshan
parameter.sh yunshan  
1
[root@VM-4-5-centos datas]# bash parameter.sh yunshan tingyu ty
parameter.sh yunshan tingyu ty
3

$*: 代表命令行中所有的参数,把所有参数看成一个整体

$@:代表命令行中所有的参数,把每个参数区分对待

[root@VM-4-5-centos datas]# vim parameter.sh 

#!/bin/bash
echo "$0 $1 $2 $3"
echo $#
echo $*
echo $@

[root@VM-4-5-centos datas]# bash parameter.sh yunshan tingyu ty
parameter.sh yunshan tingyu ty
3
yunshan tingyu ty
yunshan tingyu ty

$?

最后一次执行的命令的返回状态,如果该变量的值为0,说明上一次正确执行了,如果返回非0的数字说明没有正确执行。

[root@VM-4-5-centos datas]# ./helloworld.sh 
hello world

[root@VM-4-5-centos datas]# $?
-bash: 0: command not found
[root@VM-4-5-centos datas]# echo $?
127

[root@VM-4-5-centos datas]# bash parameter.sh yunshan tingyu ty
parameter.sh yunshan tingyu ty
3
yunshan tingyu ty
yunshan tingyu ty
[root@VM-4-5-centos datas]# echo $?
0

运算符

基本语法:

  1. ((运算式))或者[运算式]
  2. expr +,-,*,/, %
  3. expr运算符间要有空格

示例操作:

1.计算3 + 2

[root@VM-4-5-centos datas]# expr 3 + 2
5

2.计算3 - 2

[root@VM-4-5-centos datas]# expr 3 - 2
1

3.计算(3 + 2)X 4

[root@VM-4-5-centos datas]# expr `expr 3 + 2` \* 4
20
[root@VM-4-5-centos datas]# s=$[(2+3)*4]
[root@VM-4-5-centos datas]# echo $s
20

条件判断

1、基本语法

[ condition ] condition前后要有空格,条件非空即为true

2、常用判断条件

两个整数间的比较:

符号描述
-lt(less than)小于
-le(less equal) 小于等于
-eq(equal)等于
-gt(greater than) 大于
-ge(greater equal) 大于等于
-ne(not equal) 不等于

文件权限判断:

  • -r 有读的权限
  • -w 有写的权限
  • -x 有执行的权限

文件类型判断:

  • -f 文件存在并且是一个常规文件
  • -e 文件存在
  • -d 文件存在病是一个目录

多条件判断:

  • &&:表示前一条命令执行成功时,才执行下一条命令。
  • ||:表示上一条命令执行失败后,才执行下一条命令。

实例:

判断23是否大于22:
[root@VM-4-5-centos datas]# [ 23 -gt 22 ]
[root@VM-4-5-centos datas]# echo $?
0
判断文件是否有读写权限:
[root@VM-4-5-centos datas]# [ -w parameter.sh ]
[root@VM-4-5-centos datas]# echo $?
0
判断文件是否存在:
[root@VM-4-5-centos datas]# [ -e /home/bin ]
[root@VM-4-5-centos datas]# echo $?
1
多条件判断:
[root@VM-4-5-centos datas]# [ condition ] && echo ok || echo noyok
ok
[root@VM-4-5-centos datas]# [ condition ] && [ ] || echo noyok
noyok

流程控制

if判断

基本语法

if [ 条件判断式 ];then

​ 程序

fi

或者

if [ 条件判断式 ]

​ then

​ 程序

fi

注意事项:

1、[ 条件判断式 ]:中括号和条件判断式之间必须有空格

2、if后面要有空格

实例:

[root@VM-4-5-centos datas]# touch if.sh
[root@VM-4-5-centos datas]# vim if.sh 

输入1,输入2,显示yunshan,tingyu输入其他什么也不显示
#!/bin/bash
if [ $1 -eq 1 ]
then
        echo "tingyu"
elif [ $1 -eq 2 ]
then
        echo "yunshan"
fi

[root@VM-4-5-centos datas]# bash if.sh 1
tingyu
[root@VM-4-5-centos datas]# bash if.sh 2
yunshan
[root@VM-4-5-centos datas]# bash if.sh 3
[root@VM-4-5-centos datas]# 

case语句

基本语法

case $变量名 in

“值 1”)

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

;;

“值 2”)

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

;;

…省略其他分支

*)

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

esac

注意:

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

实例:

需求:输入一个数字,如果是1,则输出云山,如果是2,则输出听雨,输入其他则输出ty

[root@VM-4-5-centos datas]# touch case.sh
[root@VM-4-5-centos datas]# vim case.sh 

#!/bin/bash
case $1 in
1)
        echo "云山"
;;
2)
        echo "听雨"
;;
*)
        echo "ty"
;;
esac

[root@VM-4-5-centos datas]# bash case.sh 1
云山
[root@VM-4-5-centos datas]# bash case.sh 2
听雨
[root@VM-4-5-centos datas]# bash case.sh 6
ty

for循环

基本语法1

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

do

​ 程序

done

实例:

从1加到100

[root@VM-4-5-centos datas]# touch for.sh
[root@VM-4-5-centos datas]# vim for.sh 

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

[root@VM-4-5-centos datas]# bash for.sh 
5050

基本语法2

for 变量 in 值1 值2 值3 …

do

​ 程序

done

实例:

打印所有输入参数

[root@VM-4-5-centos datas]# touch for2.sh
[root@VM-4-5-centos datas]# vim for2.sh 

#!/bin/bash
for i in $*
do
        echo "云山听雨  $i"
done

[root@VM-4-5-centos datas]# bash for2.sh 1
云山听雨  1
[root@VM-4-5-centos datas]# bash for2.sh 1 2 3
云山听雨  1
云山听雨  2
云山听雨  3

#!/bin/bash
for i in $*
do
        echo "云山听雨  $i"
done

for j in $@
do
        echo "云山 $j 听雨"
done

[root@VM-4-5-centos datas]# bash for2.sh 1 2 3
云山听雨  1
云山听雨  2
云山听雨  3
云山 1 听雨
云山 2 听雨
云山 3 听雨

#!/bin/bash
for i in "$*"
do
        echo "云山听雨  $i"
done

for j in "$@"
do
        echo "云山 $j 听雨"
done

[root@VM-4-5-centos datas]# bash for2.sh 1 2 3
云山听雨  1 2 3
云山 1 听雨
云山 2 听雨
云山 3 听雨

$*: 代表命令行中所有的参数,把所有参数看成一个整体

$@:代表命令行中所有的参数,把每个参数区分对待

while循环

基本语法

while [ 条件判断式 ]

do

​ 程序

done

实例:

从1加到100

[root@VM-4-5-centos datas]# touch while.sh
[root@VM-4-5-centos datas]# vim while.sh 

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

[root@VM-4-5-centos datas]# bash while.sh 
5050

read读取控制台输入

基本语法

read(选项)(参数)

  • 选项:
    • -p: 指定读取值时的提示符
    • -t:指定读取值时等待的事件(秒
  • 参数
    • 变量:指定读取值的变量名

实例:

提示7s内,读取控制台输入的名称

[root@VM-4-5-centos datas]# touch read.sh
[root@VM-4-5-centos datas]# vim read.sh 

#!/bin/bash
read -t 7 -p "在7秒内输入你的名字:" NAME
echo $NAME

[root@VM-4-5-centos datas]# bash read.sh 
在7秒内输入你的名字:云山
云山

函数

系统函数

basename [string / pathname] [suffix]

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

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

实例:

[root@VM-4-5-centos datas]# pwd
/home/tingyu/datas
[root@VM-4-5-centos datas]# basename /home/tingyu/datas/helloworld.sh 
helloworld.sh
[root@VM-4-5-centos datas]# basename /home/tingyu/datas/helloworld.sh .sh
helloworld

dirname

文件的绝对路径

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

实例:

[root@VM-4-5-centos datas]# dirname /home/tingyu/datas/helloworld.sh 
/home/tingyu/datas

自定义函数

基本语法:

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

注意:

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

实例:

计算两个输入参数的和

[root@VM-4-5-centos datas]# touch sum.sh
[root@VM-4-5-centos datas]# vim sum.sh 

#!/bin/bash
function sum()
{
        s=0;
        s=$[$1+$2]
        echo $s
}
read -p "input your paratemer1:" p1
read -p "input your paratemer2:" p2
sum $p1 $p2

[root@VM-4-5-centos datas]# bash sum.sh 
input your paratemer1:2
input your paratemer2:3
5

shell工具

cut

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

基本用法

cut[选项参数] filename

说明

  • 默认分隔符是制表符
  • 选项参数
    • -f 列号: 列号提取,提取第几列
    • -d 分隔符,按照指定分隔符分割

实例:

[root@VM-4-5-centos datas]# touch cut.txt
[root@VM-4-5-centos datas]# vim cut.txt 

yun y
shan  y
ting d
yu  s

切割第一列
[root@VM-4-5-centos datas]# cut -d " " -f 1 cut.txt 
yun
shan
ting
yu
切割第2,3列
[root@VM-4-5-centos datas]# cut -d " " -f 2,3 cut.txt 
y
 y
d
 s
切割 yun 
[root@VM-4-5-centos datas]# cat cut.txt |grep yun |cut -d " " -f 1
yun

sed

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

基本用法

sed [选项参数] command filename

选项参数说明:

  • 参数说明:
    • -e 直接在指令列模式尚进行sed的动作编辑
  • 命令功能
    • a 新增
    • d 删除
    • s查找并替换

实例:

[root@VM-4-5-centos datas]# touch sed.txt
[root@VM-4-5-centos datas]# vim sed.txt 

bei xi
jing an

huan  shi
ying  wo
ni  jia


将yun shan 插入到sed.txt第二行,打印。
[root@VM-4-5-centos datas]# sed "2a yun shan" sed.txt 
bei xi
jing an
yun shan

huan  shi
ying  wo
ni  jia
删除sed.txt中包含wo的行
[root@VM-4-5-centos datas]# sed "/wo/d" sed.txt 
bei xi
jing an

huan  shi
ni  jia
将sed.txt中的wo 替换为ni
[root@VM-4-5-centos datas]# sed "s/wo/ni/g" sed.txt 
bei xi
jing an

huan  shi
ying  ni
ni  jia
将sed.txt中第二行删除,并且把wo 替换为ni
bei xi

huan  shi
ying  ni
ni  jia

awk

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

基本用法

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

说明

  • pattern:表示awk再数据中查找的内容
  • action:找到匹配内容时执行命令
  • 选项参数
    • -F:指定输入文件分隔符
    • -v 赋值一个用户定义变量

awk内置变量

  • FILENAME:文件名
  • NR:已读的记录数
  • NF:浏览记录的域的个数(切割后,列的个数)

sort

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

基本语法

sort(选项)(参数)

  • 选项
    • -n 按照数值大小排序
    • -r 以相反的顺序排序
    • -t 设置排序使用的分隔字符
    • -k 指定需要排序的列
  • 参数
    • 指定待排序文件列表

实例:

[root@VM-4-5-centos datas]# touch sort.sh
[root@VM-4-5-centos datas]# vim sort.sh 

bb:40:5.4
aa:30:1.1
cc:20:2.2
dd:30:3.3
eee:10:9.3

第二列,按倒叙排列
[root@VM-4-5-centos datas]# sort -t : -nrk 2 sort.sh 
bb:40:5.4
dd:30:3.3
aa:30:1.1
cc:20:2.2
eee:10:9.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值