【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(七)-shell语法(5)

shell语法的一些知识和练习,可以当作笔记收藏一下!!

文章目录
前言

一、shell

二、shell语法

1.文件重定向

2.引入外部脚本

3.作业

总结


前言

shell语法的一些知识和练习,可以当作笔记收藏一下!!


提示:以下是本篇文章正文内容,下面案例可供参考

一、shell

hell是我们通过命令行与操作系统沟通的语言。

shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。

AC Terminal中的命令行可以看成是一个"shell脚本在逐行执行"。

Linux中常见的shell脚本有很多种,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)

Bourne Again Shell(/bin/bash)

C Shell(/usr/bin/csh)

K Shell(/usr/bin/ksh)

zsh

...

Linux系统中一般默认使用bash,所以接下来讲解bash中的语法。

文件开头需要写#! /bin/bash,指明bash为脚本解释器。

二、shell语法

1.文件重定向

每个进程默认打开3个文件描述符:

  • stdin标准输入,从命令行读取数据,文件描述符为0
  • stdout标准输出,向命令行输出数据,文件描述符为1
  • stderr标准错误输出,向命令行输出数据,文件描述符为2

可以用文件重定向将这三个文件重定向到其他文件中。

重定向命令列表

|--------------------|-----------------------|
| 命令 | 说明 |
| command > file | 将stdout重定向到file中 |
| command < file | 将stdin重定向到file中 |
| command >> file | 将stdout以追加方式重定向到file中 |
| command n> file | 将文件描述符n重定向到file中 |
| command n>> file | 将文件描述符n以追加方式重定向到file中 |

输入和输出重定向:

复制代码
echo "World" >> output.txt  # 将字符串追加到output.txt中

read str < output.txt  # 从output.txt中读取字符串

echo $str  # 输出结果:Hello World

同时重定向stdin和stdout

创建bash脚本:

复制代码
#! /bin/bash

read a
read b

echo $(expr "$a" + "$b")

创建input.txt,里面的内容为:

复制代码
3
4

acs@9e0ebfcd82d7:~$ chmod +x test.sh  # 添加可执行权限
acs@9e0ebfcd82d7:~$ ./test.sh < input.txt > output.txt  # 从input.txt中读取内容,将输出写入output.txt中
acs@9e0ebfcd82d7:~$ cat output.txt  # 查看output.txt中的内容
7

2.引入外部脚本

类似于C/C++中的include操作,bash也可以引入其他文件中的代码。

语法格式:

java 复制代码
. filename  # 注意点和文件名之间有一个空格

或

source filename

示例

创建test1.sh,内容为:

java 复制代码
#! /bin/bash

name=yxc  # 定义变量name

然后创建test2.sh,内容为:

java 复制代码
#! /bin/bash

source test1.sh # 或 . test1.sh

echo My name is: $name  # 可以使用test1.sh中的变量

执行命令:

java 复制代码
acs@9e0ebfcd82d7:~$ chmod +x test2.sh 
acs@9e0ebfcd82d7:~$ ./test2.sh 
My name is: yxc

3.作业

创建好作业后,先进入文件夹/home/acs/homework/lesson_3/,然后:

(0) 进入homework_0文件夹,编写自动完成lesson_1作业的脚本helper.sh。要求:

1\] 当前目录下仅包含helper.sh ![](https://img-blog.csdnimg.cn/direct/026ecff715554919804da00ead277ac4.png) \[2\] helper.sh具有可执行权限 ![](https://img-blog.csdnimg.cn/direct/ddd6857068d94c85a144c3d2d8c23f39.png) (1) 进入homework_1文件夹,编写脚本check_file.sh。要求: \[1\] 当前目录下仅包含check_file.sh。 ![](https://img-blog.csdnimg.cn/direct/be2cc9c913284b95a6dfc823e9301009.png) \[2\] check_file.sh具有可执行权限。 ![](https://img-blog.csdnimg.cn/direct/5863d47db5e0495aa986f382f3b73535.png) ![](https://img-blog.csdnimg.cn/direct/a9ba458843a94cb1a6a647f1312f2a1d.png) \[3\] check_file.sh接收一个传入参数。格式为 ./check_file.sh file \[4\] 判断传递参数,分别在标准输出中输出如下内容(不包括双引号): 1) 如果传入参数个数不是1,则输出一行:"arguments not valid",然后退出,退出状态等于1。 2) 如果file文件不存在,则输出一行:"not exist",然后退出,退出状态等于2。 3) 如果file文件存在,则输出分别进行如下5个判断,然后退出,退出状态等于0。 1\] 如果file为普通文件,则输出一行:"regular file" 2\] 如果file为目录(文件夹),则输出一行:"directory" 3\] 如果file具有可读权限,则输出一行:"readable" 4\] 如果file具有可写权限,则输出一行:"writable" 5\] 如果file具有可执行权限,则输出一行:"executable" ![](https://img-blog.csdnimg.cn/direct/cc26f2f7e94143c49f93e8262d406b9b.png) ![](https://img-blog.csdnimg.cn/direct/b27d60c5001646199ba696daf59128e0.png) (2) 进入homework_2文件夹,编写脚本main.sh。要求: \[1\] 当前目录下仅包含main.sh \[2\] main.sh具有可执行权限 \[3\] 该文件从stdin(标准输入)中读取一个整数n \[4\] 在stdout(标准输出)输出斐波那契数列的第n项。即:a\[0\] = 1, a\[1\] = 1, a\[i\] = a\[i - 1\] + a\[i - 2\], 求a\[n\]。 \[5\] 数据保证 0 \<= n \<= 20,脚本不需要判断n的合法性。 ![](https://img-blog.csdnimg.cn/direct/13a965e71b98471aacf795cf1a1337aa.png) ![](https://img-blog.csdnimg.cn/direct/0052842274474862b8327c5a3183140e.png) ![](https://img-blog.csdnimg.cn/direct/9cbcaab6561c4d34bed42819a2f2a17f.png) (3) 进入homework_3文件夹,编写脚本main.sh。要求: \[1\] 当前目录下仅包含main.sh \[2\] main.sh具有可执行权限 \[3\] 该文件从stdin(标准输入)中读取两行整数n和m \[4\] 在stdout(标准输出)中输出1\~n的按字典序从小到大的顺序数第m个全排列,输出一行,用空格隔开所有数,行末可以有多余空格。 \[5\] 数据保证 1 \<= n \<= 10, 1 \<= m \<= min(100, n!),脚本不需要判断数据的合法性。 ![](https://img-blog.csdnimg.cn/direct/21c88c988bc04026bc911068b2794321.png) ![](https://img-blog.csdnimg.cn/direct/46dd5d22bd774ac6827c190ed70b1296.png) ![](https://img-blog.csdnimg.cn/direct/a626d976d51e4fbb9a9d806df43874c8.png) ```java #! /bin/bash read n read m #:< $output_file echo $sum > $2 ``` *** ** * ** *** ## 总结 上述是shell语法的一些知识和练习,可以当作笔记收藏一下!!

相关推荐
万米商云1 分钟前
企业物资集采平台解决方案:跨地域、多仓库、百部门——大型企业如何用一套系统管好百万级物资?
大数据·运维·人工智能
jjkkzzzz31 分钟前
Linux下的C/C++开发之操作Zookeeper
linux·zookeeper·c/c++
二当家的素材网32 分钟前
Centos和麒麟系统如何每天晚上2点10分定时备份达梦数据库
linux·数据库·centos
挑战者66688833 分钟前
CentOS 系统高效部署 Dify 全攻略
linux·运维·centos
DD_陈东东1 小时前
gdbus 常用数据结构与库函数
linux
DIY机器人工房2 小时前
代码详细注释:ARM-Linux字符设备驱动开发案例:LCD汉字输出改进建议开发板断电重启还能显示汉字,显示汉字位置自定义
linux·嵌入式·文件io·diy机器人工房
网硕互联的小客服2 小时前
服务器经常出现蓝屏是什么原因导致的?如何排查和修复?
运维·服务器·stm32·单片机·网络安全
witton2 小时前
Go语言网络游戏服务器模块化编程
服务器·开发语言·游戏·golang·origin·模块化·耦合
成都极云科技2 小时前
成都算力租赁新趋势:H20 八卡服务器如何重塑 AI 产业格局?
大数据·服务器·人工智能·云计算·gpu算力
喜欢吃豆2 小时前
从零构建MCP服务器:FastMCP实战指南
运维·服务器·人工智能·python·大模型·mcp