linux操作系统笔记——shell程序设计(代码片段)

晚风(●•σ) 晚风(●•σ)     2022-12-03     592

关键词:

目录

一、Shell脚本的概念

Shell是一种程序设计语言,Shell脚本是一种用Shell编写的脚本程序,其中包含命令。Shell环境有很多种,如C Shell(/usr/bin/csh)、Bourne Again Shell(/bin/bash)、Bourne Shell(/usr/bin/sh或/bin/sh)等等,本教程使用的是Bourne Again,可以通过echo命令输出环境变量$SHELL,该变量保存的是当前用户的初始Shell的路径名称,其路径是用户登录时所启动的Shell,通过echo命令输出该变量,如下:

[yyx@yyx12 ~]$ echo $SHELL

在Linux终端中输入命令:

二、一个Shell脚本的基本步骤

我们知道可以通过vi/vim命令,用于编辑文件或新建文件,不了解的小伙伴可以看这篇文章(Linux操作系统中的vi/vim 编辑器详解),所以创建Shell脚本的方法与创建文件是一样的,它可以通过编辑器、标准输出重定向等方式来创建,但该文件的扩展名(后缀)应为.sh,一个Shell脚本第一行一般是#!,这是约定好的标记,它用于告诉该Shell脚本需要通过哪种解释器来执行。

例如创建一个Shell脚本,脚本名称为hellolinux.sh,其功能是输出一串英文“Hello Linux!”:
1、通过vi命令创建一个名称为hellolinux.sh的Shell脚本:

[yyx@yyx12 ~]$ su root
...
[root@yyx12 yyx]# vi hellolinux.sh

在Linux终端中输入命令:

2、切换模式,编辑Shell脚本,第一行为“#!/bin/bash”,通过echo命令输出“Hello Linux!”:

#!bin/bash
echo "Hello Linux!"

在文件中输入:

编写好脚本后,保存并退出,然后最后一步就是执行该Shell脚本,将会在一会讲到。
我们可以通过cat 命令查看文件内容,输出该文件内容:

[root@yyx12 yyx]# cat hellolinux.sh

在Linux终端中输入命令,如下:

注:Shell脚本中的注释(说明性语句)是通过“#”开始,被注释的语句不会被Shell解释器执行。

三、赋予Shell脚本执行权限

由于建的仅仅只是一个普通的文本文件,它没有执行权限,不能直接调用该Shell脚本使其执行,此时就要修改Shell脚本的权限,如下通过ls -l命令查看刚刚创建的Shell脚本的权限:

[root@yyx12 yyx]# ls -l hellolinux.sh

在Linux终端中输入命令,可看到该文件的权限是- rw- r- - r- -,即文件拥有者、与拥有者同组的用户和其他用户都没有执行权限:

要执行该Shell脚本,有两种方法,分别是通过Shell调用脚本和通过chmod命令赋予脚本的可执行权限。

(一)Shell调用脚本

可以直接通过bash命令后跟Shell脚本的名称,即可通过Shell调用脚本(这里的bash是针对于Bourne Again Shell,其他的调用命令不一样),如下调用hellolinux.sh该shell脚本,直接在bash后跟脚本名称:

[root@yyx12 yyx]# bash hellolinux.sh

在Linux终端中输入命令:

这种方法虽然简单,但它适用于用户跟踪调试大型、复杂的脚本。
例如,写一个Shell脚本,通过环境变量,输出自己的UID和路径。
1、首先创建一个shell脚本,名称为shell1:

2、编写shell脚本,保存后退出vi编辑器:

#!/bin/bash
echo "You are welcome to use bash."
echo "Cuttent work directory is $PWD."
echo "You are $LOGNAME."

在vi编辑器中输入:

3、执行该shell脚本:

(二)chmod命令赋予脚本执行权限

另一种方法是通过chmod命令的字母形式来进行更改,例如这里我们只修改文件拥有者(User)的权限,即通过增加权限(+)符号以及x(可执行)即可完成,另外修改后再通过ls -l命令查看该文件信息:

[root@yyx12 yyx]# chmod u+x hellolinux.sh
[root@yyx12 yyx]# ls -l hellolinux.sh

在Linux终端中输入命令,可见更改权限后的该脚本文件(绿色为可执行文件):

此时,文件所有者就有了执行该Shell脚本的权限,通过在./后跟调该脚本的名称来执行,这里的./表示的是当前工作目录,这样可以省略路径名称。

[root@yyx12 yyx]# ./hellolinux.sh

四、Shell功能性语句

(一)read命令读入

  • read命令用于读入一行数据,即从键盘读取输入,在使用重定向时,可以读取文件中的一行数据。

1、例如创建一个Shell脚本,其功能是用户输入用户名后,显示用户名,Shell脚本如下:

#!bin/bash
echo -e "Input your name:\\c"
read username
echo "Your name is $username"

echo命令带参数-e,表示开启反斜线的转义功能,使命令行中以反斜线引导的转义符有效,\\c表示禁止回车符。
在Linux终端中输入命令,例如我们输入“xiaoming”,此时输入的内容被存放至变量username中,再通过echo命令输出,返回的结果如下:

2、当然也可以read多个变量,然后输入多个字符串使其传入对应的变量中【这里输入的字符串间隔符由环境变量$IFS确实,通常情况下是空格】,若传入的变量少于变量个数,则剩下的未传入的变量值为空;若传入的变量多于变量个数,首先会依次按照顺序传入对应的变量,而将剩下的未传入的变量全部传至最后一个变量,例如shell脚本:

#!bin/bash
echo -e "please input your name and ID!"
read username ID
echo "Your name is $username,ID is $ID"
#inputing quantity is less than required quantity!
read first second third
echo -e "The first is:$first\\nThe second is:$second\\nThe third is:$third\\n"
#inputing quantity is more than required quantity!
read four five
echo -e "$four\\n$five\\n"

在Linux终端中输入命令,输入username和ID的值为“xiaoming”、123;first、second、third三个参数只输入前两个参数,然后输出这三个变量;four、five两个参数输入三个参数,然后输出这两个变量:

例如,编写一个shell脚本,要求用户从屏幕输入数值 X,Y,比较这两个数的大小,如果(x > y ,输出 “x is larger than y”;如果 x = y,则输出"x is equal to y";否则输出 “x is less than y”(这里运用到Shell结构性语句中的if条件语句,后面会有详细讲解),如下创建一个shell脚本,其内容如下:

#!/bin/bash
read X Y
if(($X>$Y))
then
        echo "x is larger than y"
elif(($X==$Y))
then
        echo "x is equal to y"
else
        echo "x is less than y"
fi

在vi编辑器中编辑内容:

在Linux终端中输入命令,执行该shell脚本:

3、另外通过在read命令后跟参数-s,可以使输入的数据不显示在终端上,常用于输入密码等,后跟-p参数,可以允许在read命令行中直接指定参数。
例如,创建一个shell脚本,其目的是输入用户的登陆密码:

#!/bin/bash
echo "your username is:yyx"
read -s -p "Please enter your password:" password
echo -e "\\nyour password is $password"

在vi编辑器中编辑内容:

在Linux终端中输入命令,执行该shell脚本,输入密码,可看到在终端上是不显示的:

(二)tput命令

  • tput命令可使在对整数进行运算时,使其按照四则运算的规则。

例如,创建一个shell脚本,其目的是计算6-5*2的值:

#!/bin/bash
expr 6 - 5 \\* 2

在vi编辑器中编辑内容,由于“*”是具有特殊含义的字符,所以在进行乘法运算时,需在其前加上反斜线来消除其含义进行运算:

在Linux终端中输入命令,执行该shell脚本:

(三)expr命令

  • expr命令用于控制字符页面的显示格式。

其常用的终端显示参数有如下:

参数功能
bel终端响铃
bold字体粗体显示
clear终端清屏
cup x y移动光标至x行y列
smso启动高亮显示模式
rmso结束高亮显示模式
smul启动下划线模式
rmul结束下划线模式
sgr0关闭所有设置的模式

例如,下列shell脚本,执行后终端字体粗体显示,然后清屏:

#!/bin/bash
tput bold
tput clear
echo "end!"

在Linux终端执行,执行后可见终端字体粗体显示且屏幕上其他内容都被清除:

通过tput命令后跟sgr0关闭所有模式:

[yyx@yyx12 ~]$ tput sgr0

在linux终端输入命令,可见恢复原样:

五、Shell结构性语句

(一)if条件语句

1、if……then……fi语句
if……then……fi语句,是if条件语句的单支语句,以if开始,以fi结束(fi只是一个结束标志),其格式如下:

if 条件表达式
then
	命令行
	……
fi

2、if……then……else……fi语句
if……then……else……fi语句也就是常用的if-else语句,若条件表达式成立,则执行命令行1中的命令;若不成立,则执行命令行2的命令,其格式如下:

if 条件表达式
then
	命令行1
	……
else
	命令行2
	……
fi

3、if……then……elif……then……else……fi语句
if……then……elif……then……else……fi语句也就是常用的if-else if-else语句,其中else if语句可以有多个,其格式如下:

if 条件表达式
then
	命令行
	……
elif 条件表达式
then
	命令行
	……
…………
else
	命令行2
	……
fi

例如,创建一个shell脚本,通过用户输入两个数值,然后比较两个数值大小,根据不同结果输出不同的内容,如下:

#!/bin/bash
read X Y
if(($X>$Y))
then
  echo "The first value is greater than the second!"
elif(($X==$Y))
then
  echo "The first value is equal to the second!"
else
  echo "The first value is smaller than the second!"
fi

在vi编辑器中编辑内容:

在Linux终端输入命令,执行三次,每次输入不同的数值:

(二)case语句

case语句测试多种取值的变量,通常后跟字符串,然后根据不同的取值进行分支运行,它是以case开始的,以esac结束的,其格式如下:

case 字符串 in
	分支1)
		命令行
		;;
	分支2)
		命令行
		;;
	……
esac

(三)for循环语句

for循环的格式如下,以done结束语句:

for 变量名称 in 列表
do
	命令行
	……
done

(四)while循环语句

while循环的格式如下,while后跟条件表达式,也是以done结束语句:

while 条件表达式
do
	命令行
	……
done

while循环后跟true,则表示无限循环:

while true
do
	命令行
	……
done

(五)until循环语句

until循环的格式如下,until语句只有当条件表达式的值为假时,until语句才执行其循环体内的命令,否则退出循环,它也是以done结束语句:

until 条件表达式
do
	命令行
	……
done

(六)continue和break语句

continue和break语句与其他语言中的一样,它们都用于循环语句内,当遇到continue语句则退出本次循环,而break语句则跳出整个循环。

六、test命令

test命令用于计算条件表达式,其返回值为真或假(条件成立返回退出状态值为0,不成立则为1)。

表达式结果真或假代表
条件成立0
条件不成立1

【注:这里要注意,与c/c++当中不一样,刚好相反。】
整数test测试如下表:

参数作用
-eq=为真
-ne!=为真
-gt>为真
-ge≥ 为真
-lt<为真
-le≤为真

文件test测试如下表:

参数作用
-b文件存在且为块设备文件
-c文件存在且为字符设备文件
-d存在且为目录
-e文件存在
-f文件存在且为普通文件
-p文件存在且为管道文件
-r文件存在且可读
-w文件存在且可写
-x文件存在且可执行
-s文件存在且大小不为0

例1、例如,创建一个shell脚本,用户输入两个字符串,比较两个字符串,若相同则输出“The two strings are equal!”,不相同则输出“The two strings are different!”,如下:

#!/bin/bash
read str1 str2
if test $str1 = $str2
then
  echo "The two strings are equal!"
else
  echo "The two strings are different!"
fi

在vi编辑器中编辑内容:

在Linux终端输入命令,执行两次,第一次输入不同的字符串,第二次输入相同的字符串:

  • test命令后跟-z参数和字符串,它表示当字符串的内容长度为零时表达式为真,另外还有-n参数和字符串,则表示不为零时表达式为真。
test -z string
test -n string

例2、例如,我们对刚刚的shell脚本修改,用户输入一个字符串,若输入内容为空则输出“The string is null!”,否则输出“The string is not null!”,如下:

#!/bin/bash
read str
if test -z $str
then
  echo "The string is null!"
else
  echo "The string is not null!"
fi

在vi编辑器中编辑内容:

在Linux终端输入命令:

七、Shell函数

在Shell语言中,用户可自定义函数,函数的定义如下(其中return语句可以用于函数的返回值):

函数名称()

	命令行
	……
	[return语句]

另外要注意调用时,并不是像其他语言中,以“函数名称()”的形式调用,是直接通过函数名称调用

例1、例如,创建一个Shell脚本,其中包含一个函数,函数名称为hellofun(),其作用是用户输入用户名称,输出所输入的用户名以及“Hello linux!”,并在该脚本末尾调用该函数,如下:

#!/bin/bash
hellofun()
  echo "please input your name:"
  read username
  echo "Your name is $username"
  echo "Hello linux!"

echo "The function call starts here:"
hellofun

在vi编辑器中编辑内容:

在Linux终端输入命令:

例2、例如,创建一个Shell脚本,其中包含一个函数,函数名称为Numfun(),其作用是用户输入两个数值,通过return语句返回这两个数的和,如下:

#!/bin/bash
Numfun()
    read num1 num2
    return $(($num1+$num2))

Numfun
echo "The result is $? "

在vi编辑器中编辑内容:

在Linux终端输入命令:

linux操作系统笔记——shell命令解释器的基本知识(代码片段)

...f08;四)标准错误输出重定向一、Shell的概念Shell是Linux操作系统中的一个命令解释器,是一个为用户提供操作页面的程序,它提供了用户与内核交互操作的接口,它有自己的编程语言,即它也是一种程序设计语... 查看详情

linux操作系统笔记——shell命令解释器的基本知识(代码片段)

...f08;四)标准错误输出重定向一、Shell的概念Shell是Linux操作系统中的一个命令解释器,是一个为用户提供操作页面的程序,它提供了用户与内核交互操作的接口,它有自己的编程语言,即它也是一种程序设计语... 查看详情

python全栈100天学习笔记day32linux概述及基础命令(代码片段)

Linux概述Linux是一个通用操作系统。一个操作系统要负责任务调度、内存分配、处理外围设备I/O等操作。操作系统通常由内核(运行其他程序,管理像磁盘、打印机等硬件设备的核心程序)和系统程序(设备驱动、... 查看详情

linux命令行笔记-00综述(代码片段)

文章目录1Linux命令行简介1.1Linux命令行的分类1.1.1根据系统中作用来分类1.1.2根据对象来分类2Linux命令行解释器2.1命令行解释器shell2.1.1核心程序2.1.2公用程序shell2.1.3用户的默认shell2.1.4shell如何工作2.2Shell发展历史2.3shell版本的差异2... 查看详情

linux的shell(代码片段)

本章节为《Linux操作系统基本原理与应用》的笔记。Linux将shell独立于OS核心程序之外,使得用户可以在不影响OS本身的情况下进行修改,更新版本或添加新的功能。OS的shell介于OS和Kernel之间,负责将user命令解释成OS可... 查看详情

linux保存退出命令

linux退出命令如下:操作设备:戴尔笔记本电脑操作系统:win10操作程序:linux2.911、首先连接相应linux主机,等待输入shell指令。2、执行./lua文件进入命令操作模式后,按ESC,输入::q!。3、键盘按“回车键”运行shell指令,此时会... 查看详情

linux操作系统笔记——shell变量(代码片段)

目录一、Shell变量的基本概念(一)创建Shell变量(二)变量引导符($)(三)只读变量(readonly命令)(四)查看变量(set命令)(五)清除变量(unset命令)... 查看详情

c++笔记--linux编程(10)-进程控制fork系统调用(代码片段)

Linux进程模型传统的Linux模型里有三种创建或者修改进程的操作    1. system用于调用shell,执行一个指定的命令;    2.fork用于创建一个新的进程,该进程几乎是当前进程的一个完全拷贝;    3.exec可以在进程... 查看详情

java笔记-使用processbuilder调用shell(linux)(代码片段)

背景环境是这样的,前端发起一个post请求,里面的信息带有要启动的进程,java后端接收到这个进程名后,使用linux的shell调用指定的程序。代码相关代码如下:packagexx.xx.xx.service;importorg.springframework.stereotype.Serv... 查看详情

java笔记-使用processbuilder调用shell(linux)(代码片段)

背景环境是这样的,前端发起一个post请求,里面的信息带有要启动的进程,java后端接收到这个进程名后,使用linux的shell调用指定的程序。代码相关代码如下:packagexx.xx.xx.service;importorg.springframework.stereotype.Serv... 查看详情

linux学习笔记2022-11-12---------linux基础(代码片段)

目录1.用户类型2.终端terminal2.1终端类型2.2查看当前的终端设备3.交互式接口3.1交互式接口类型3.2什么是shell3.3Shell是如何连接用户和内核的?3.4Shell还能连接其它程序3.5Shell也支持编程3.6Shell是一种脚本语言4.修改主机名5.命令提... 查看详情

linux基础知识|shell知识(代码片段)

Linux基础知识|shell知识在Linux操作系统,需要使用shell程序将下达的指令去沟通内核(kernel),以便Kernel控制计算机硬件进行工作。其中shell程序发展者众,而Linux中默认的shell是bash程序。本篇主要介绍bash的相关功能以及... 查看详情

python全栈100天学习笔记day35linux系统软件安装shell编程及配置服务工具(代码片段)

使用包管理工具yum-YellowdogUpdaterModified。yumsearch:搜索软件包,例如yumsearchnginx。yumlistinstalled:列出已经安装的软件包,例如yumlistinstalled|grepzlib。yuminstall:安装软件包,例如yuminstallngin 查看详情

linux之shell编程(代码片段)

...hell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务。它类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。Shellscript是一种为shell编写的脚本程序。Shell编程一般指shell... 查看详情

linux之shell编程(代码片段)

...hell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务。它类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。Shellscript是一种为shell编写的脚本程序。Shell编程一般指shell... 查看详情

linux笔记(代码片段)

...是林纳斯·托瓦兹开发的一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继... 查看详情

linux的shell(代码片段)

本章节为《Linux操作系统基本原理与应用》的笔记。Linux将shell独立于OS核心程序之外,使得用户可以在不影响OS本身的情况下进行修改,更新版本或添加新的功能。OS的shell介于OS和Kernel之间,负责将user命令解释成OS可... 查看详情

linux学习笔记(代码片段)

...机系统会主动执行的第一个程序了!整个开机流程到操作系统之前的动作应该是这样的&#x 查看详情