设为首页 加入收藏

TOP

主题 2 Shell工具和脚本(一)
2023-07-23 13:43:30 】 浏览:186
Tags:主题 Shell

主题 2 Shell工具和脚本

Shell 工具和脚本 · the missing semester of your cs education (missing-semester-cn.github.io)

Shell脚本

shell 脚本是一种更加复杂度的工具。

  • 定义变量

在bash中为变量赋值的语法是foo=bar,意为定义变量foo,foo的值为bar。访问变量使用$变量名

[lighthouse@VM-8-17-centos tools]$ foo=bar
[lighthouse@VM-8-17-centos tools]$ echo "$foo"
bar

需要注意的是,Shell中使用空格作为分隔参数的保留字符。

如果将上诉赋值语句写为foo = bar,将不起作用。事实上,这样写并没有将bar赋给foo,而是用=bar作为参数调用foo程序。因为这样Shell会认为你正在执行一个名为foo的命令。

[lighthouse@VM-8-17-centos tools]$ foo = bar
-bash: foo: command not found

你需要特别注意这类问题,比如如果有带空格的文件名,你需要使用引号将其括起来。

  • 在bash中处理字符串

有两种定义字符串的方法,可以使用双引号定义字符串,也可以使用单引号定义字符串。

[lighthouse@VM-8-17-centos tools]$ echo "Hello"
Hello
[lighthouse@VM-8-17-centos tools]$ echo 'Hello'
Hello

Bash中的字符串通过'"分隔符来定义,但是它们的含义并不相同。

'定义的字符串为原义字符串,其中的变量不会被转义,而 "定义的字符串会将变量值进行替换。

例如:

[lighthouse@VM-8-17-centos tools]$ echo "Value is $foo"
Value is bar
[lighthouse@VM-8-17-centos tools]$ echo 'Value is $foo'
Value is $foo
  • 定义函数

和其他大多数的编程语言一样,bash也支持if, case, whilefor 这些控制流关键字。同样地, bash 也支持函数,它可以接受参数并基于参数进行操作。

下面这个函数是一个例子,它会创建一个文件夹并使用cd进入该文件夹。

[lighthouse@VM-8-17-centos tools]$ cat mcd.sh
mcd(){
	mkdir -p "$1"
	cd "$1"
}

这里 $1 是脚本的第一个参数的意思

source 脚本名,这将会在Shell中加载脚本并运行。

[lighthouse@VM-8-17-centos tools]$ source mcd.sh
[lighthouse@VM-8-17-centos tools]$ mcd test
[lighthouse@VM-8-17-centos test]$ 

如上,在执行了source mcd.sh之后,看似无事发生,但实际上Shel中已经定义了mcd函数。我们给mcd传递一个参数test,这个参数被用于作为创建的目录名(即$1),然后Shell自动切换到了test目录里。整个过程就是,我们创建了文件夹并进入其中。

  • 保留字

在bash中,许多$开头的东西一般都是被保留的(指留作特定用途)

$1 是脚本的第一个参数的意思。与其他脚本语言不同的是,bash使用了很多特殊的变量来表示参数、错误代码和相关变量。下面列举其中一些变量,更完整的列表可以参考 这里

形式 释义
$0 脚本名
$1 ~ $9 脚本的参数, $1 是第一个参数,依此类推
$@ 所有参数
$# 参数个数
$? 前一个命令的返回值
$$ 当前脚本的进程识别码
!! 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 sudo !!再尝试一次。
$_ 上一条命令的最后一个参数,如果你正在使用的是交互式 shell,你可以通过按下 Esc 之后键入 . 来获取这个值。

有一些保留字可以直接在Shell中使用,例如$?可以获取上一条命令的错误代码(返回值),再比如$_会返回上一条命令的最后一个参数。

例如:

[lighthouse@VM-8-17-centos tools]$ mkdir test
[lighthouse@VM-8-17-centos tools]$ cd $_
[lighthouse@VM-8-17-centos test]$ 

如上,我们无需在写一次test,使用$_访问该参数,它就会被替换成test,现在我们进入到test目录中了。

这样的例子有很多,再例如!!,它返回完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用 sudo !!再尝试一次。

[lighthouse@VM-8-17-centos tools]$ mkdir /mnt/new
mkdir: cannot create directory ‘/mnt/new’: Permission denied
[lighthouse@VM-8-17-centos tools]$ sudo !!
sudo mkdir /mnt/new
[lighthouse@VM-8-17-centos tools]$ rmdir /mnt/new
rmdir: failed to remove '/mnt/new': Permission denied
[lighthouse@VM-8-17-centos tools]$ sudo !!
sudo rmdir /mnt/new
[lighthouse@VM-8-17-centos tools]$ 
  • 标准错误流

如果你的程序出错了,你想输出错误但不想污染标准输出,那么你可以写进这个流。

  • 错误代码

还有一种叫做错误代码$?(error code)的东西,是一种告诉你整个运行过程结果如何的方式。

[lighthouse@VM-8-17-centos tools]$ echo "Hello"
Hello
[lighthouse@VM-8-17-centos tools]$ echo $?
0

这里显示echo "Hello" 运行的错误代码为0,0是因为一切正常,没有出现问题。

这种退出码和如C语言里代表的意思一样。

0代表一切正常,没有出现错误。

[lighthouse@VM-8-17-centos tools]$ grep foobar mcd.sh
[lighthouse@VM-8-17-centos tools]$ echo $?
1

如上,我们尝试着在mcd.sh脚本中查找foobar字符串,而它不存在,所以grep什么都没输出。但是通过反馈一个1的错误代码,它让我们知道这件事没有成功。

此外,true的错误代码始终是0;false的错误代码则是1。

[lighthouse@VM-8-17-centos tools]$ true
[lighthouse@VM-8-17-centos tools]$ echo $?
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇AX9000安装使用Docker 下一篇Linux的串口非标准波特率设置更改

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目