⌛️


文章目录

  • 一、Shell 概述
  • 二、Shell 脚本的定义与执行
    • 2.1 Shell 脚本的定义
    • 2.2 Shell 脚本的执行
  • 三、Shell 变量
    • 3.1 用户自定义变量
    • 3.2 环境变量
    • 3.3 位置变量
    • 3.4 预定义变量
    • 3.5 命令替换
  • 四、Shell 输入与输出
    • 4.1 read 命令
    • 4.1 echo 命令
  • 五、Shell 中的引号 ⭐️
    • 5.1 反引号
    • 5.2 单引号
    • 5.3 双引号
  • 六、条件表达式
    • 6.1 文件状态操作符
    • 6.2 字符串操作符
    • 6.3 数字操作符
    • 6.4 逻辑操作符
    • 6.5 命令分隔符
  • 七、判断语句
    • 7.1 条件语句
    • 7.2 分支语句
  • 八、循环语句
    • 8.1 break、continue 和 exit 语句
    • 8.2 expr 命令
    • 8.3 for 语句
    • 8.4 while 语句
    • 8.5 until 语句
  • 九、Shell 函数
  • 十、参考附录:

Shell ☁️

上一篇文章链接: 【Linux学习笔记③】——Linux的磁盘与加载【硬盘的物理结构 主引导记录 grub】.
上一篇文章链接: 【Linux学习笔记⑤】——GNU C语言开发环境【GNU make、静态库】.


一、Shell 概述

  首先,我们需清楚什么是脚本语言?

  ● 脚本语言(Script languages)是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。几乎所有计算机系统的各个层次都有一种脚本语言。包括操作系统层,如计算机游戏,网络应用程序,文字处理文档,网络软件等。
  一个脚本可以使得本来要用键盘进行的相互式操作自动化。一个 Shell 脚本主要由原本需要在命令行输入的命令组成,或在一个文本编辑器中,用户可以使用脚本来把一些常用的操作组合成一组序列。

  ● Shell语言:Shell语言 是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。Shell 作为语言来说,它既是终端上的用户与 UNIX 操作系统会话的语言,又可作为程序设计的语言,所以 Shell 是用户与系统之间的接口,而且是一种比较高级、易被用户理解和使用的程序设计语言,它为用户提供了使用方便、功能强、又容易扩充的程序设计环境。

  ● 所以,Shell 不仅是可解释用户输入的命令,同时,也是可解释执行基于命令的脚本语言。

  常用的 Shell 版本有 Bourne Shell(简称 sh),C Shell(简称 csh)、Korn Shell(简称 ksh)和 Bourne Again Shell(简称 bash)。

Shell 名称 描述 位置
ash 一个小的Shell /bin/ash
ash.static 一个不依靠软件库的 ash 版本 /bin/ash.static
bsh ash的一个符号链接 /bin/bsh
bash Bourne Again Shell,来自GNU项目 /bin/bash
sh bash的一个符号链接 /bin/sh
csh C Shell, tcsh的一个符号链接 /bin/csh
tcsh 和csh兼容的Shell /bin/tcsh
ksh Korn Shell /bin/ksh

二、Shell 脚本的定义与执行

2.1 Shell 脚本的定义

  ● Shell 脚本是由命令、Shell 变量和控制语句等语法元素构成的文本文件。Shell 会对脚本中的内容进行逐行分析,并加以解释和执行。下面给出一个简单的 Shell 脚本实例:

#!/bin/bash
# script_test.sh
str1="welcome to use Shell script!\n"
str2="hello world!\n"
echo $str1
echo $str2

  ◆ 代码说明
    ① 第一行以 “#!” 开始,用以说明选用何种 Shell 版本作为该脚本的解释器,这里选用 /bin/bash。
    ② 第二行以 “#” 开始,表示该行为注释,不参与执行,这里可以写一些脚本功能描述等。
    ③ 第三行定义了一个变量str1
    ④ 第五行执行 “显示变量str1的值” 功能。
    ⑤ \n是换行字符。

  ● 配置过程一:【注:需先在桌面右击,打开该终端】


  ◆ 代码说明
    ① 命令touch创建了一个.sh脚本文件如图所示
    ② 命令vi会打开该.sh脚本文件,打开界面在下面

  ● 配置过程二


  ◆ 代码说明
    ① 进入编辑页面如左上图所示,此时需要按i键(insert),即从 “命令模式” 进入 “编辑模式”。
    ② 然后编辑右下图所示的代码。注:$(引用符号)、echo(输出命令)后面会学。
    ③ 接着按下ESC(键盘最左上角)键,再从 “编辑模式” 进入 “命令模式”。
    ④ 最后先输入:(英文冒号),再输入wq(write and quit),写入并离开。

  ● 最终结果图

  ◆ 说明:最后,桌面上便有此脚本文件,右击它,然后点用其他应用程序打开,便会进入文本编辑界面,我们也可以在这里面改代码。

2.2 Shell 脚本的执行

  ● 由于 Shell 脚本是文本文件,在编辑后默认不具有可执行的权限。因此为了和命令一样能运行,必须赋予执行权,具体操作如下:

$ chmod u+x script_test.sh   # 给 demo.sh 增加可执行权
$ ./script_test.sh           # 直接运行

  ● 运行结果

  ● 没有给 Shell 脚本赋执行权的情况下,可以显式地指定 Shell 命令从而运行:

$ bash script_test.sh       # 指定由 bash 解释执行

  ● Shell 脚本的解析过程如下

  ◆ 图形说明
    ① 在执行 Shell 脚本时,Shell 解析器会从脚本文件中从头至尾逐行取出每一条命令。
    ② 先对每一条命令进行语法检查,判断其合法性。
    ③ 在合法的情况下,会根据命令的类型分别进行处理。若为内部命令,则调用 Shell 解析器中相关的函数处理。
    ④ 若为外部命令,则 Shell 解析器会创建一个子进程,并在子进程中加载外部命令对应的可执行文件,并加以执行。
    ⑤ 无论何种类型的命令,在完成执行后,Shell 都会取下一条命令,重复上述过程直至脚本文件运行结束。


三、Shell 变量

   S h e l l 变 量 的 分 类 = { 用 户 自 定 义 变 量 ( 局 部 变 量 ) 环 境 变 量 ( 全 局 变 量 ) 位 置 变 量 ( 局 部 变 量 ) 预 定 义 变 量 ( 局 部 变 量 ) Shell 变量的分类=\begin{cases}用户自定义变量(局部变量)\\环境变量(全局变量)\\位置变量(局部变量)\\ 预定义变量(局部变量)\end{cases} Shell变量的分类=⎩⎪⎪⎪⎨⎪⎪⎪⎧​用户自定义变量(局部变量)环境变量(全局变量)位置变量(局部变量)预定义变量(局部变量)​

  ● 命名规则:变量名必须以字符或下划线开始,其余部分可为字母、数字或下划线。

3.1 用户自定义变量

  ■ 基本语法变量名=变量值
  ▶功能:将 “变量值” 赋给变量 “变量名”

  ■ 相关语法一$变量名
  ▶功能:引用该变量

  ■ 相关语法二unset 变量名
  ▶功能:清除该变量的内容

  ■ 相关语法三set
  ▶功能:显示当前已定义的所有变量的值

  ● 样例

$ var1=123                  # 给变量 var1 赋值123
$ str1="welcome to bash"     # 给变量赋值 "welcome to bash“
$ unset str1                # 清除变量 str1 的值
$ set                       # 显示所有变量的值

  ● 运行结果


  ◆ 说明:因为str1unset了,所以在 “变量列表” 里它的值为空(即 “_” ,只是str1存储的空间内容清空了,但空间还在)

3.2 环境变量

  ● 环境变量又称全局变量,通常,由系统在启动时设置,环境变量一般用大写字母表示,通过env命令可查看系统中定义的环境变量。用户自定义变量可通过命令export输出为环境变量,环境变量的引用和用户自定义变量的引用方式相同

  ■ 基本语法export 用户自定义变量

  ▶功能:将 “用户自定义变量” 输出为环境变量

  ● 样例

$ x="hello i am global"       # 定义变量 x, 并赋值 "hello welcome"
$ bash                      # 创建子 bash
$ echo $x                   # 变量 x 未定义
$ exit                      # 退出子 bash
$ export x                  # 将变量 x 输出为环境变量$ bash                       # 重新创建子 bash
$ echo $x                   # 显示环境变量 x 的值 "hello welcome"
$ x="Linux"              # 定义同名局部变量 x, 并赋值为 "Linux"
$ echo $x                   # 显示局部变量的值, 输出为 "Linux"
$ exit                      # 退出子 bash
$ echo $x                   # 显示环境变量x, 输出为 "hello welcome"

  ● 运行结果:后期补充,这里知识点挺深的。

  ● Linux 系统中自带的环境变量较多,下面给出一些常用的环境变量:

环境变量名 含义
HOME 当前用户的主目录
PATH 命令搜索路径
LOGNAME 用户登录名
PS1 第一命令提示符
PS2 第二命令提示符,默认是 “>”
PWD 用户的当前目录
UID 当前用户标识符

  ● 补充说明
    ① 环境变量PATH的值是由冒号分隔的目录路径名,当 Shell 在执行外部命令时,Shell 将按PATH变量中给出的顺序搜索这些目录,执行与命令名匹配的第一个可执行文件。

    ② 环境变量PS1,用于设置命令提示符,下面给出一些有特定含义的字符及其定义:

提示符 含义
\w 当前工作目录
\h 主机名
\u 用户名
\d 日期
\t 时间
\a 响铃提示

    ③ 环境变量PS2在 Shell 接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时 Shell 判断出用户输入的命令没有结束时,显示这个辅助提示符,缺省的辅助提示符是“>”

3.3 位置变量

  ● 位置变量由 Shell 内部定义,与传递参数的位置有关,下面给出位置参数的定义:

预定义变量 含义
$0 脚本程序的名字
$1,$2,… 传递给脚本的某个参数,$1代表第1个参数,$2代表第2个参数,依此类推

  ● 位置变量一般用在函数传参里,后面的 “九、函数” 中有相应样例。

3.4 预定义变量

  ● 预定义变量由 Shell 内部定义,具有特殊的含义,下面是一些 Shell 常用的预定义常量:

预定义变量 含义
$# 传递到脚本的参数的数量
$* 传递到脚本的所有参数内容
$? 命令执行后返回的状态,0表示成功执行,其他值则表明执行错误
$$ 当前进程的进程号
$! 后台运行的最后一个进程号

  ● 这个也是在后面的样例中有体现。

3.5 命令替换

  ● 当需要将命令的输出结果赋值给变量时,可使用命令替换,命令替换有两种语法形式。

  ■ 语法一var=$(command)

  ■ 语法二var=`command`

  ▶功能:将command命令的运行结果赋给变量 var。【注意第二种写法是反引号。即Tab键上面那个键】

  ● 样例

# (1) 用户 "wly" 在名为 "wlyhostname" 的主机上输入以下命令
$ echo "User $(whoami) is on $(hostname)"     # 注:(whoami——>问我是谁的意思)# (2) 显示当天的日期和时间
$ echo "Today is" `date`

  ● 运行结果


四、Shell 输入与输出

  ● 除直接给变量赋值外,用户还可以利用read命令通过键盘给变量赋值。这样便实现了在运行过程中 Shell 脚本与用户之间的交互。同时,利用echo命令可将各种信息输出到终端显示器。

4.1 read 命令

  ■ 语法read [选项] 变量名列表

  ▶功能:从键盘上读取变量的值

  ● 常用的一些选项如下

选项 含义
-p prompt 设置提示信息
-n num 当 read 读 num 个字符后返回
-s 键盘输入时,屏幕不回显,可用于密码输入

  ● 样例

$ read -n 1 -p "Please input a character:" answer      # 从键盘读取一个字符
$ read var1 var2                                        # 输入变量 var1 和 var2

  ● 运行结果

4.1 echo 命令

  ■ 语法echo [选项] 字符串

  ▶功能:显示字符串或变量的值

  ● 常用的一些选项如下

选项 含义
-n 不在最后自动换行
-e 启用反斜线控制字符的转换
-E 不处理转义字符。此为缺省选项

  ● 下面给出echo命令支持的一些转义符:

转义符 含义
\a 从系统喇叭发送出声音
\b 向左刪除
\c 取消行末的换行符号
\E ESCAPE键
\f 换页字符
\n 换行字符
\r 回车键
\t 表格跳位鍵
\ 反斜线本身
#  2行3列显示
$ echo -e "a\tb\tc\nd\te\tf" # 运行结果如下:
a   b   c
d   e   f

五、Shell 中的引号 ⭐️

  ● 一些字符在 Shell 中具有特定的含义,这些字符称为元字符。不同的引号(反引号、单引号、双引号)对元字符的处理方式不同。

5.1 反引号

  ● 反引号的作用:将一对反引号之间的命令用该命令的执行结果来代替,实现命令替换

"举例如下"
$ var1=`ls –l`
# 将命令 'ls -l' 的执行结果赋给变量 var1$ echo `pwd`
# 屏幕将会显示当前路径

5.2 单引号

  ● 在一对单引号中的所有字符(包括元字符),将失去特殊含义,都变成字符串形式。

"实例分析:"
(1) 显示当前目录下的所有文件
$ echo *               # 将元字符 '*' 作为通配符处理(2) 显示字符'*'
$ echo '*'            # 单引号使元字符失去了特定的含义(3) 不进行变量替换
$ text='* means all files'       # 将单引号内的字符串赋给变量text
$ echo '$text'                # 显示'$text',不进行变量替换
$ echo $text                    # 变量替换,并处理替换后的字符串
命令 echo $text 首先显示当前目录下的所有文件,然后显示 'means all files', 其功能与下列命令相同。
$ echo * means all files

5.3 双引号

  ● 在一对双引号中的字符(包括元字符),除了美元符$反引号`反斜杠\外,其余均保留原来字符的含义。

  ● 双引号的特点
    ① 关闭通配符扩展对双引号中的元字符不作处理,保留其原有的含义。
    ② 支持变量替换将双引号中引用的变量用变量值进行替换。
    ③ 支持命令替换将双引号内一对反引号中的命令替换为该命令运行的结果

"实例分析:"
(1) 假设用户为超级用户 root, 下面给出双引号对 $ 和 ` 和 \ 的处理方式。
$ dlist='whoami'
$ echo  "* $dlist end"
# 运行结果为: * whoami end,  元字符 '*' 不作特殊处理,将变量 $dlist 替换为变量的值 'whoami'。$ echo "`$dlist`"       "# 先变量替换, 即将 $dist 替换为 whoami(问我是谁的意思), 然后进行命令替换
# 运行结果为: root(2) 不加双引号与加双引号的比较
$ x=*
$ echo $x                 # 显示当前目录下的所有文件
$ echo "$x"               # 仅显示变量 x 的值'*'(3) 双引号对回车换行的处理
$ text="I am a
> sentence"
$ echo $text
# 运行结果为:I am a sentence$ echo "$text"
# 运行结果为:
I am a
sentence

六、条件表达式

  ● 条件表达式用于判断条件是否满足的逻辑表达式。条件为真,返回 0,否则,返回 1。它是选择和循环语句的基础。

  ■ 语法一test 条件表达式

  ■ 语法二[条件表达式]

  ▶功能:测试 “条件表达式” 是否为真,若真则返回 0,否则返回 1。

6.1 文件状态操作符

  ● 文件状态测试的目的是测试文件是否具有某种属性,例如文件是否可执行,文件是否是普通文件等。文件状态测试操作符的常用定义如下:

操作符 含义
-a filename 若文件 filename 为目录文件,则返回真
-f filename 若文件 filename 为普通文件,则返回真
-r filename 若文件 filename 可读,则返回真
-s filename 若文件 filename 的长度大于 0,则返回真
-u filename 若文件 filename 的 SUID 位被设置,则返回真
-w filename 若文件 filename 可写,则返回真
-x filename 若文件 filename 可执行,则返回真

  ● 样例如下

  ◆ 说明$?表示在上一条命令执行后返回的状态,0表示为(或者成功执行),其他值为

6.2 字符串操作符

  ● 字符串操作符用于判断字符串的性质以及字符串之间的关系。

操作符 含义
string 若字符串 string 非空,则返回真
-n string 若字符串 string 长度大于 0,则返回真
-z string 若字符串 string 长度为 0,则为返回真
string1 = string2 若字符串 string1 和 string2 相等,则返回真
string1 != string2 若字符串 string1 和 string2 不等,则返回真

  ● 样例如下


  ◆ 说明$?表示在上一条命令执行后返回的状态,0表示为(或者成功执行),其他值为

6.3 数字操作符

  ● 数字操作符操作的对象是数组,用于比较两个数值的大小关系。

操作符 含义
n1 –eq n2 判断数字 n1 与 n2 是否相等,若相等,返回 0,否则,返回 1
n1 –ne n2 判断数字 n1 与 n2 是否不等,若不等,返回 0,否则,返回 1
n1 –lt n2 判断数字 n1 是否小于 n2,若是,返回 0,否则,返回 1
n1 –gt n2 判断数字 n1 是否大于 n2,若是,返回 0,否则,返回 1
n1 –le n2 判断数字 n1 是否小于或等于 n2,若是,返回 0,否则,返回 1
n1 –ge n2 判断数字 n1 是否大于或等于 n2,若是,返回 0,否则,返回 1

  ● 样例如下

  ◆ 说明$?表示在上一条命令执行后返回的状态,0表示为(或者成功执行),其他值为

6.4 逻辑操作符

  ● 若操作对象是逻辑表达式,则使用逻辑操作符,下面是常用逻辑操作符的定义。

操作符 含义
e1 –a e2 逻辑表达式 e1 和 e2 同时为真时,返回 0,否则,返回 1
e1 –o e2 逻辑表达式 e1 和 e2 有一个为真时,返回 0,否则,返回 1
!e1 若逻辑表达式 e1 不为真时,返回 0,否则,返回 1

  ● 样例如下

6.5 命令分隔符

  ● 每个命令在运行后,都会返回一个值。一般情况下,成功则返回 0,成功则返回非 0。常用的分隔符如下:

命令分隔符 含义
cmd1 ; cmd2 以独立的进程依次运行 cmd1 和 cmd2
(cmd1 ; cmd2) 在同一进程中依次运行
cmd1 & cmd2 cmd1 和 cmd2 同时运行,分属于不同进程组
cmd1 && cmd2 当 cmd1 执行为真时,执行 cmd2
cmd1 || cmd2 当 cmd1 执行为假时,执行 cmd2
cmd1 | cmd2 cmd1 的输出作为 cmd2 的输入
cmd1 & cmd1以后台方式运行

  ● 样例如下

(1)测试 number 的值是否在 1 ~ 100 之间:
$ [ "$number" -gt 1 ] && [ "$number" -lt 100 ](2)检测文件 file 是否为空, 如果不为空就显示其内容:
$ test -s $file && cat $file

七、判断语句

7.1 条件语句

  ● 条件语句将根据条件表达式的值决定下一步执行何种操作。

  ■ 语法一

if [ 条件表达式 ]
then命令序列1
else命令序列2
fi

  ▶功能:当 “条件表达式” 的测试值为真时,执行 “命令序列1” ,否则,执行 “命令序列2” 。命令序列中的命令可以是一个或者多个。

  ■ 语法二

if [ 条件表达式 ];
then命令序列
fi

  ▶功能:当 “条件表达式” 的测试值为真时,执行 “命令序列”,否则,执行条件语句后面的命令。条件表达式与 then 之间的分号 “;” 起命令分隔符的作用。

  ■ 语法三

if  test 条件表达式1
then命令序列1
elif [条件表达式2]
then命令序列2
else命令序列3
fi

  ▶功能:这是包含二层嵌套的条件语句,当 “条件表达式1” 为真时,执行 “命令序列1”,否则,在 “条件表达式2” 为真的情况下,执行 “命令序列2”,否则,执行 “命令序列3” ,“命令序列3” 属于第 2 个条件语句的一部分。

  ● 样例一:判断当前目录下是否存在某文件

#!/bin/bash
# script_test.sh
echo "Enter a file name:"
read file
if [ -f $file ]
thenecho "File $file exists."
fi

  ● 运行结果

  ● 样例二:判断当前用户是否和输入的用户名一致

#!/bin/sh
# script_test.sh
echo -n "Enter your login name:"
read name
if [ "$name" = "$USER" ];
thenecho "Hello, $name. How are you today ?"
elseecho "You are not $USER, so who are you ?"
fi

  ● 运行结果

  ● 样例三:比较两个数的大小

#!/bin/sh
# script_test.sh
echo  "Enter the first integer:"
read first
echo  "Enter the second integer:"
read second
if [ "$first" -gt "$second" ]
then echo "$first is greater than $second"
elif [ "$first" -lt "$second" ]
then echo "$first is less than $second"
elseecho "$first is equal to $second"
fi

  ● 运行结果

  ● 样例四:在文本文件中找查字符串

#!/bin/sh
# script_test.sh
echo  "Enter the file name:"
read myfile
if grep "hello" $myfile
then echo "\"hello\" occurs in myfile"
elseechoecho "\"hello\" dose not occur in myfile"
fi

  ● 运行结果

7.2 分支语句

  ● 如果某个变量或表达式存在多种取值,不同的取值决定不同的行为动作,如果取值较多时,使用if语句可能比较复杂,这时即可采用分支语句。

  ■ 语法

case 变量 in值1)   命令序列1;;           值2)    命令序列2;;......值n)  命令序列n     ;;
esac

  ▶功能:当 “变量” 的值为 “值1” 时,执行 “命令序列1”,当 “变量” 的值为 “值2” 时,执行 “命令序列2”,依此类推,需注意的是:在每个命令序列后面,需要用 “;;” 作为结束标记。

  ● 在case语句中,有时会出现一些特殊的字符,用于模式匹配:

模式 匹配方式
* 匹配所有字符串
? 匹配任意单个字符
[…] 定义某个范围内的字符集
| 分割不同的值,表示“或者”

  ● 样例:判断当前时间属于上午、下午或晚上

#!/bin/bash
# script_test.sh
hour=`date "+%H"` # spaceKey can't forget
case $hour in0[1-9] | 1[01] )   # '0[1-9]' represents '01,02,03,...,09'echo "Current time is $hour."echo "Good morining !!" ;;
1[2-7] )        # '1[2-7]' represents '12,13,...,17'echo "Current time is $hour."echo "Good afternoon !!" ;;* ) echo "Current time is $hour."echo "Good evening !! " ;;
esac

  ● 运行结果


八、循环语句

  ● 循环语句就是不断执行循环体内的命令,直到循环条件满足或不满足为止。在 Shell 中,循环语句包括 for 语句、while 语句和 until 语句。

8.1 break、continue 和 exit 语句

  ■ break语法

break [n]

  ▶功能:表示从循环中跳出,n表示是跳出几层循环,默认是1

  ■ continue语法

continue [n]

  ▶功能:表示跳过循环体中在它之后的语句,回到循环开头,进行下一次循环。

  ■ exit语法

exit [n]

  ▶功能:退出运行脚本,n为运行脚本的返回值。

8.2 expr 命令

  ■ 语法

expr 算术表达式

  ▶功能:计算算术表达式的值,在每个算术运算符的两边必需用空格符分割。

  ● 样例如下

$ expr 1 + 2        # 结果为 3
$ expr 2 \* 3       # 结果为 6
$ count=4;
$ count=`expr $count + 1`   # 结果为 5

8.3 for 语句

  ■ 语法

for 变量名 in 参数列表
do命令1命令2...
done

  ▶功能:将 “参数列表” 中的元素依次赋值给 “变量名”,在每次赋值后执行 “命令1”、“命令2”、…,直到执行到 done 结束。

  ● 样例:求若干数中的最小值

#!/bin/bash
# script_test.sh
smallest=10000
for i in  12 5 18 58 -3 80
doif test $i -lt $smallestthensmallest=$ifi
done
echo " The smallest number is: $smallest"

  ● 运行结果

8.4 while 语句

  ■ 语法

while [ 条件表达式 ]
do命令1命令2...
done

  ▶功能:循环执行 “命令1”、“命令2”、…,直至 “条件表达式” 中的值为假。

  ● 样例一:计算 1 到 100的和

#!/bin/bash
# script4_test.sh
i=1
sum=0
while [ $i -le 100 ]
dosum=`expr $sum + $i`i=`expr $i + 1`
done
echo The sum is $sum

  ● 运行结果

  ● 样例二:显示 2~100 之间的所有素数

#!/bin/bash
# script_test.sh
i=2
while [ $i -le 100 ]
doj=2flag=1       # flag 为 1 表示 i 是素数while [ $j -le `expr $i / 2` ]doif [ `expr $i % $j` -eq 0 ]then flag=0;breakfij=`expr $j + 1`doneif [ $flag -eq 1 ]then echo "${i} is a prime"fii=`expr $i + 1`
done

  ● 运行结果

8.5 until 语句

  ■ 语法

until 条件表达式
do命令1命令2...
done

  ▶功能:循环执行 “命令1”、“命令2”、…,直至 “条件表达式” 的值为真。

  ● 样例:输入文件名至文件 myfile.txt,直至输入 no

#!/bin/bash
# script_test.sh
ans=yes
until [ "$ans" = no ]
doecho Enter a characterread characterecho $name >> myfile.txtecho "Continue?"echo Enter yes or noread ans
done

  ● 运行结果


九、Shell 函数

  ● 为了使规模较大的程序容易实现和维护,一般将程序按功能分解为若干函数,每个函数完成一个特定的功能,然后通过函数调用实现程序的各个功能。

  ■ 函数定义语法

函数名( )
{命令1命令2...return
}

  ■ 函数调用语法

函数名 参数列表

  ● 注意事项
    ① 调用前,必须先进行定义。
    ② 用 Shell 定义的位置变量接收参数传递,例如,$0$1$#等。
    ③ 返回值取自函数中return语句或函数中最后一条命令的返回状态,可通过$?获得。
    ④ 函数中定义了与全局变量同名的局部变量,则在函数中,同名局部变量生效。
    ⑤ 可·使用local声明的局部变量,其作用仅限于函数本身。

  ● 样例:运行函数比较两个数的大小关系

#!/bin/bash
# script_test.sh
compare()
{if [ $p1 -eq $p2 ]then return 0elif [ $p1 -gt $p2 ]then return 1elsereturn 2fi
}
echo "Compare test."
read -p "Please input your parameter1: " p1
read -p "Please input your parameter2: " p2
compare $p1 $p2
case $? in0)echo "$p1 = $p2";;1)echo "$p1 > $p2";;2)echo "$p1 < $p2";;
esac

  ● 运行结果


十、参考附录:

[1]《GNU/Linux编程》

【Linux学习笔记④】——Shell程序设计【变量 输入与输出 条件表达式 判断语句 循环语句 Shell函数】相关推荐

  1. python学习笔记(5)—— 输入和输出

    文章目录 输入和输出(Input and output) 格式化输出(Fancier Output Formatting) 格式化字符串文字(Formatted String Literals) St ...

  2. Linux学习笔记 1 环境变量 2 vi命令

    1 环境变量篇 1.1  修改 查看 生效 系统环境变量 1 涉及系统环境变量的文件   -->  .bash_profile --> /etc/profile 2 该文件位置 /root ...

  3. Spring MVC 学习笔记 json格式的输入和输出

    Spring mvc处理json需要使用jackson的类库,因此为支持json格式的输入输出需要先修改pom.xml增加jackson包的引用 <!-- json --><depe ...

  4. Linux学习笔记 -- rpm 与 shell 编程

    目录 rpm 与 YUM rpm 包的管理 rmp 包 查询 安装 卸载 yum 安装 JDK mysql 8.0 离线安装 Centos 7 忘记mysql的root密码 Shell 编程 shel ...

  5. 史上最牛最强的linux学习笔记 10.shell基础

    史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...

  6. Linux 学习笔记2 常用命令

    Linux 学习笔记1 安装linux详细教程_O丶ne丨柒夜的博客-CSDN博客 Linux_目录结构 基本介绍 1.liux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录&quo ...

  7. *Linux学习笔记

    *Linux学习笔记__20161222usst湛恩 所有的荣誉和赞美都献给上帝,让一切成为可能! 1. 文件系统 Linux下所有设备都是文件,采用树形文件管理系统,将文件存储在单个目录结构中(虚拟 ...

  8. 20155303狄惟佳预备作业三Linux学习笔记

    20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...

  9. LINUX学习笔记共五部分

    LINUX学习笔记1--LINUX系统命令 1.         界面切换: a)         进入字符界面:按住ctrl+alt+F1: 1.         首先需要进入用户登入,输入用户名和 ...

最新文章

  1. python3中的多线程
  2. 算法竞赛入门经典读书笔记(四)7.3子集生成
  3. Linux下安装FTP
  4. Grounded Theory and Coding Lecture Notes
  5. [读者调查]新增一个读者调查!
  6. 深度学习 “四大名著” 发布!完整 PDF 开放下载!!!
  7. matlab字符串固定长度,限制Matlab用户界面编辑框中的字符串长度
  8. 【C语言】Pillow(数据溢出问题)
  9. 图书管理系统python代码课程设计报告_python代码实现图书管理系统
  10. MyEclipse9.0 XJad的配置
  11. SQL Server 计算年龄函数
  12. Apache详解(五)WEB相关工具
  13. gentoo——桌面,openbox,silm,Conky,输入法,layman,QQ安装,WPS
  14. PayPal开发文档整理(8)——PayPal支付产品和解决方案
  15. 毕业设计-基于深度学习的实例分割研究
  16. diskpart(diskpart转换GPT)
  17. 总结:第三章:过去一年的所遇所思所学所悟以及2021年的规划图
  18. 工业相机各种参数计算方法
  19. 一线网页游戏程序员日志 (十)
  20. 微积分的本质(六):多元微积分入门——隐函数求导

热门文章

  1. 『计组』CPU 如何区分指令和数据
  2. 【MySQL】逻辑库与数据表相关操作
  3. Tensorflow MobileNet移动端迁移学习指南
  4. 互补DNA(Complementary DNA)
  5. 计算机网络技术协议的三要素,通信网络协议三要素
  6. 计算机网络原理【第三章 数据链路层】课后习题答案
  7. 浅谈矩阵变换——Matrix
  8. Android 获取app启动来源(是被谁启动的、被哪个第三方app启动?)
  9. Java Swing JButton:按钮组件
  10. 2022年终的断舍离