利用shell解决的一些问题
1.在 /tmp 下新建一个名为 missing 的文件夹
1 |
|
2.用 touch 在 missing 文件夹中新建一个叫 semester 的文件
首先学习了一下touch的用法
作用:修改文件或者目录的时间属性,包括存取时间和更改时间。如果文件不存在,就建立一个新的文件
语法:touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
参数说明:
- a 改变档案的读取时间记录。
- m 改变档案的修改时间记录.
- c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
- f 不使用,是为了与其他 unix 系统的相容性而保留。
- r 使用参考档的时间记录,与 --file 的效果一样。
- d 设定时间与日期,可以使用各种不同的格式。
- t 设定档案的时间记录,格式与 date 指令相同。
- –no-create 不会建立新档案。
- –help 列出指令格式。
- –version 列出版本讯息。
实例与运行效果:
实例 | 运行效果 |
---|---|
touch testfile | 修改文件"testfile"的时间属性为当前系统时间 |
touch file | 使用指令"touch"时,如果指定的文件不存在,则将创建一个新的空白文件 |
可以用ls -l
来查看时间属性
1 |
|
3.将以下内容一行一行地写入 semester 文件:
#!/bin/sh
curl --head --silent https://missing.csail.mit.edu
这个题涉及到转义的问题,如果直接用双引号的话,!在双引号中也有特殊含义,下面详细讲一下shell中的转义问题。
shell中的转义有三种途径:\
''
与 ""
三种转义方法的使用范围
1.\
\
的范围是最广的,几乎可以对所有的特殊字符进行转义
2.'
'
将会对其所包含的内容不加修饰,转义出来的内容就是所包含的内容,一个字符也不会改变
3.’"’
"
的使用范围比'
小,"
会先将所包含的内容在shell中运行之后再进行输出
例如"tell me the date":这段字符中的date将会被shell运行,替换为当时的日期
此外,shell中的特殊字符都会保留有特殊含义,再显示之前都会对其评估
经以上总结,我们可以简单的写出这题的代码:
1 |
|
4. 使用 chmod 命令改变权限,使 ./semester 能够成功执行
在我们直接在命令行输入.\semester
时,我们会得到Permission denied
,这是由于权限不够。
在输入ls -l
之后,我们得到rw-r--r--
,发现没有搜索的权限,所以我们无法运行程序,这时我们需要chmod
命令来改变权限
chmod
作用:控制用户对文件的权限的命令
语法:chmod [-cfvR] [--help] [--version] mode file...
参数说明:
- u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是
- + 表示增加权限、- 表示取消权限、= 表示唯一设定权限
- r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行
- -c : 若该文件权限确实已经更改,才显示其更改动作
- -f : 若该文件权限无法被更改也不要显示错误讯息
- -v : 显示权限变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
- –help : 显示辅助说明
- –version : 显示版本
如上面的图片,该变权限实际上就是改变指定区域的字符,改变方式有八进制方式与符号模式。
实例 | 运行结果 |
---|---|
chmod ugo+r file1.txt | 将文件 file1.txt 设为所有人皆可读取 |
chmod a+r file1.txt | 将文件 file1.txt 设为所有人皆可读取 |
chmod -R a+r * | 将目前目录下的所有文件与子目录皆设为任何人可读取 |
chmod 777 file | 将该目录对与所有对象的权限都设为rwx |
所以解决这一题我们用如下的代码:
1 |
|
下面解释一下运行代码中第一行的#!/bin/sh
#!
被称为Shebang(Hashbang),在文件中存在Shebang的情况下,类Unix操作系统的程序加载器会分析Shebang后的内容,将这些内容作为解释器指令,并调用该指令,并将载有Shebang的文件路径作为该解释器的参数。
所以在这里相当于这句话的作用是调用/bin/sh程序来执行下面的代码
5. 使用 | 和 > ,将 semester 文件输出的最后更改日期信息,写入主目录下的 last-modified.txt 的文件中
1 |
|
借助将管道的输出信息输出给grep
,然后grep
查找输出中以last-modified
开头的信息,然后重定向输出到主文件夹的last-modified.txt
中