Linux Shell脚本入门学习--正点原子【第一期】手把手教你学Linux之Ubuntu入门篇 P19 P20

本文是一篇关于Linux Shell脚本入门学习的文章,好久没用了有些遗忘,本次主要想巩固基础,为后续开发做准备。

r0_c12d6-c1d51e5ecaa1

0 什么是Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell脚本是一种在Unix和类Unix操作系统中运行的脚本语言,用于自动化执行各种命令和任务,包括文件处理、文本处理、系统管理和系统批处理任务等。

我们已经能够熟练的在终端中输入命令来完成一些常用的操作,但是我们都是一条一条输入命令。这样会很麻烦,那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件即可?肯定有,这个就是shell脚本!
shell脚本类似windows的批处理文件,shell脚本就是将连续执行的命令写成一个文件。
shell脚本提供数组、循环、条件判断的等功能。shell脚本一般是Linux运维或者系统管理员要掌握的,作为嵌入式开发人员,只需要掌握shell脚本最基础的部分即可。

1 编写第一个Shell脚本

shell脚本是个纯文本文件,命令从上而下,一行一行的开始执行。shell脚本扩展名为.sh。

shell脚本第一行一定要为:

#!/bin/bash

表示使用bash。

#使用vim编辑器新建Shell文件 01_shell.sh
vim 01_hello.sh

#在shell文件中使用echo 输出字符串

#!/bin/bash
echo "Hello Shell!"

当在脚本的开头添加 #!/bin/bash并将脚本文件设置为可执行时,操作系统会自动调用 Bash 解释器来执行该脚本。这样可以确保脚本以正确的环境运行,并且能够使用 Bash 提供的功能和语法。

d8e3c618199cb9de23cf122c35fbdaa3

#编写完脚本后 保存退出 要加上可执行权限才可以执行脚本
#添加可执行权限
chmod u+x 01_hello.sh

#执行
./01_hello.sh


#另一种执行方法 不需要添加可执行权限
sh 01_hello.sh

sh 01_hello.sh 和 ./01_hello.sh 都是执行脚本的方式,但是它们之间有一些不同。

当使用 sh 01_hello.sh 方式执行脚本时,表示使用 Bash 作为解释器来执行脚本,它会按照脚本中的语法解释并执行其中的命令。这种方式不需要为脚本文件添加可执行权限,因为它是通过 Shell 解释器来执行脚本的。

而当使用 ./01_hello.sh 方式执行脚本时,表示在当前目录下执行名为 01_hello.sh 的脚本文件。这种方式需要为脚本文件添加可执行权限,否则无法执行。

242c25666e741353e6e1f22e426900faShell和Bash的关系

Bash 是一种流行的命令行解释器和脚本语言,常用于编写和执行各种类型的脚本,包括自动化任务、系统管理和编程等。

Shell 是一种命令行解释器,用于解释和执行用户输入的命令。它是操作系统与用户之间的接口,允许用户与计算机进行交互并执行各种任务。

Bash(Bourne Again SHell)是 Shell 的一种实现,它是对原始 Bourne Shell 的改进和扩展。Bash 在功能上比 Bourne Shell 更强大,并且向后兼容 Bourne Shell,意味着大多数在 Bourne Shell 中编写的脚本可以在 Bash 中运行。

Bash 继承了许多其他 Shell 的特性,并引入了新的功能,如命令历史、命令补全、条件语句、循环结构等。它还提供了更好的脚本编程支持,包括变量、函数、数组等高级特性。

因此,可以说 Bash 是 Shell 的一种具体实现,它是最常用和广泛支持的 Shell 之一。当我们使用 #!/bin/bash 声明一个脚本时,我们指定了要使用 Bash 解释器来执行该脚本。然而,还有其他的 Shell 实现,如sh、csh、ksh等,它们也可以作为解释器来执行脚本,但可能具有不同的语法和功能集。

2 使用read命令交互输入

官方解释:接收键盘或其它文件描述符的输入。read 命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read 命令将数据放入一个标准变量中。
read 命令格式如下:
#read [选项] [变量名]

选项:
-p:“提示信息”:在等待read输入时,输出提示信息;
-t :秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间;
-n:字符数:read命令只接收指定的字符数就会执行;
-s:隐藏输入的数据,适用于机密信息的输入;
变量名可以自定义。如果不指定变量名,则会把输入保存到默认变量REPLY中;
如果只提供了一个变量名,则将整个输入行赋予该变量;
如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字;

6446e7a6a980b97522edd42261db9c33

简单的使用一下:

#!/bin/bash

echo "Please input your name:"
read name
echo "Your name is " $name

echo "Please input first num:"
read first_num
echo "Please input second num:"
read second_num
#shell仅支持整形,数值计算使用$((表达式))
echo $first_num "+" $second_num "=" $(($first_num+$second_num))

aa1c3af19bf44d3bd4a89524387ecf0f

b3d17283f6045fdd373abfc121e5974b

3 test命令的使用

test命令用于查看文件是否存在、权限等信息,可以进行数值,字符,文件三方面的测试。

3.1 数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
#!/bin/bash

num1=100
num2=100

if test $num1 -eq $num2
then
    echo "两数相等"
else
    echo "两数不相等"
fi

e4fa9cb8882e4b246560f2e15a05756b

3.2 字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

使用方式可参考3.1 数值测试章节。

3.3 文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
#举例

#!/bin/bash
if test -e /home/haoxuan
then
    echo "文件存在!"
else
    echo "文件不存在!"
fi

#输出结果:文件已存在!


#Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。例如:

cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

433d8c6c0422e51e14bb753d22364388

3.3.1 使用 && 或 || 命令来替换以上的if命令

cmd1 && cmd2 当cmd1执行完并且正确,那么cmd2开始执行,如果cmd1执行完毕错误,那么cmd2不执行。
cmd1 || cmd2 当cmd1执行完毕并正确,那么cmd2不执行,反之cmd2执行。

94b505edacf8c5b322104f4e88a7bf2b1b8a4a4052bbc2b5d6577e7b94ab8685

3.3.2 使用 中括号[ ]判断符代替test命令判断

4a9bf4ae2bb5ffd9e33fe61d66f9f8cc

[ ] 中的变量值也需要带上双引号,firststr如果是a 空格 b,会被识别为a和b两个字符而不是“a空格b”这个字符串,于是变成了(1)a (2) b == “a b”,不相等且参数太多

4 Shell默认变量

$0~$n,表示shell脚本的参数,包括shell脚本命令本身,shlle脚本命令本身为$0

$#:#表示最后一个参数的标号。

$@:表$1、$2、$3……

95b6d5a74bd12c0771586803eef743e689c675714b2e57dcda3a926afff0fce0

5 条件判断

shell脚本支持条件判断,虽然可以通过&&和||来实现简单的条件判断,但是稍微复杂一点的场景就不适合了。

#shell脚本提供了if then条件判断语句,写法:
if  条件判断 ; then
 //判断成立要做的事情
fi

#还有if then else 语句,写法
if  条件判断 ; then
 //条件判断成立要做的事情
else
 //条件判断不成立要做的事情。
fi

#或:

if  条件判断 ; then
 //条件判断成立要做的事情
elif [条件判断]; then
//条件判断成立要做的事情
else
 //条件判断不成立要做的事情。
fi


#最后还有case语句
case $变量 in
“第1个变量内容”)
	//程序段
	;;	//表示该程序块结束!!
“第2个变量内容”)
	//程序段;;
“第n个变量内容”)
	//程序段
	;;
esac

7fb6ec810d127bc78961578dca9458e2

#!/bin/bash

read -p "Please input(Y/N):" value

if [ "$value" == "Y" ] || [ "$value" == "y" ]; then
        echo "Your input is Y"
        exit 0
fi

if [ "$value" == "N" ] || [ "$value" == "n" ]; then
        echo "Your input is N"
        exit 0
fi

8c42dd1367493765a1bf933c2954f808

#!/bin/bash

case $1 in
    "a")
        echo "param is a"
    ;;
    "b")
        echo "param is b"
    ;;
    *)
        echo "unknow "
    ;;
esac

6 函数

shell脚本也支持函数,函数写法如下:

function funame () {
	//函数代码段
}

191ca90f9784a381b741017ea44e54b1

4b6a61dbfd18813e95c13a31ae1484ea

#无参函数

#!/bin/bash

function help(){
    echo "This is help help!"
}

function close(){
    echo "This is close!"
}

case $1 in
    "-h")
        help
        ;;
    "-c")
        close
        ;;
esac


#有参函数

#!/bin/bash

function help(){
    echo "This is help $1 $2!"
}

help abc def

7 循环

#shell脚本也支持循环,比如 while do done,表示当条件成立的时候就一直循环,直到条件不成立。
while [条件] 	//括号内的状态是判断式
do			//循环开始
	//循环代码段
done

#还有另外一种until do done,表示条件不成立的时候循环,条件成立以后就不循环了,写法如下:
until [条件]
do
//循环代码段
done


for循环,使用for循环可以知道有循环次数,写法
for var in con1 con2 con3……
do
//循环代码段
done

for循环数值处理,写法
for((初始值; 限制值; 执行步长))
do
//循环代码段
done

3a67eedd7d1aedf51ff6a44f4ec06978

#!/bin/bash

read -p "Please input count:" count

total=0
for((i=0; i<=count; i=i+1))
do      
        total=$(($total + $i))
done    

echo "1+2+3+...+$count=$total"

参考与引用

参考文档:

Shell 教程 | 菜鸟教程 (runoob.com)

Shell read命令详解_Jeremy Don的博客-CSDN博客

学习视频:

《正点原子【第一期】手把手教你学Linux之Ubuntu入门篇》

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容