shell语法的一些知识和练习,可以当作笔记收藏一下!!
前言
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

\[2\] helper.sh具有可执行权限

(1) 进入homework_1文件夹,编写脚本check_file.sh。要求:
\[1\] 当前目录下仅包含check_file.sh。

\[2\] check_file.sh具有可执行权限。


\[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"


(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的合法性。



(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!),脚本不需要判断数据的合法性。



```java
#! /bin/bash
read n
read m
#:<