原文地址:http://c.biancheng.net/shell/
1、通过 cat 命令来查看当前 Linux 系统的可用 Shell:
$ cat /etc/shells
2、查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:
$ echo $SHELL
echo是一个 Shell 命令,用来输出变量的值,我们将在《Shell echo命令》中详细介绍它的用法。
SHELL是 Linux 系统中的环境变量,它指明了当前使用的 Shell 程序的位置,也就是使用的哪个 Shell。
3、CentOS 中,默认的提示符格式为:
[mozhiyan@localhost ~]$
这种格式包含了以下三个方面的信息:
启动 Shell 的用户名,也即 mozhiyan;
本地主机名称,也即 localhost;
当前目录,波浪号~是主目录的简写表示法。
4、Shell 通过PS1和PS2两个环境变量来控制提示符格式:
PS1 控制最外层命令行的提示符格式。
PS2 控制第二层命令行的提示符格式。
5、要显示提示符的当前格式,可以使用 echo 输出 PS1 和 PS2:
[mozhiyan@localhost ~]$ echo $PS1
[\u@\h \W]\$
[mozhiyan@localhost ~]$ echo $PS2
>
[mozhiyan@localhost ~]$
6、Bash shell 提示符可以包含的要素
字符 | 描述 |
---|---|
\a | 铃声字符 |
\d | 格式为“日 月 年”的日期 |
\e | ASCII转义字符 |
\h | 本地主机名 |
\H | 完全合格的限定域主机名 |
\j | shell当前管理的作业数 |
\1 | shell终端设备名的基本名称 |
\n | ASCII换行字符 |
\r | ASCII回车 |
\s | shell的名称 |
\t | 格式为“小时:分钟:秒”的24小时制的当前时间 |
\T | 格式为“小时:分钟:秒”的12小时制的当前时间 |
@ | 格式为am/pm的12小时制的当前时间 |
\u | 当前用户的用户名 |
\v | bash shell的版本 |
\V | bash shell的发布级别 |
\w | 当前工作目录 |
\W | 当前工作目录的基本名称 |
! | 该命令的bash shell历史数 |
# | 该命令的命令数量 |
$ | 如果是普通用户,则为美元符号$;如果超级用户(root 用户),则为井号#。 |
\nnn | 对应于八进制值 nnn 的字符 |
\ | 斜杠 |
[ | 控制码序列的开头 |
] | 控制码序列的结尾 |
7、可以通过修改 PS1 变量来修改提示符格式,例如:
[mozhiyan@localhost ~]$ PS1="[\t][\u]\$ "
[17:27:34][mozhiyan]$
8、第一个shell
在 test.sh 中输入代码:
#!/bin/bash
echo "Hello World !" #这是一条语句
第1行的#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell;
后面的/bin/bash就是指明了解释器的具体位置。
第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout,一般就是指终端)输出文本。
在.sh文件中使用命令与在终端直接输入命令的效果是一样的。
第 2 行的#及其后面的内容是注释。Shell 脚本中所有以#开头的都是注释(当然以#!开头的除外)。
写脚本的时候,多写注释是非常有必要的,以方便其他人能看懂你的脚本,
也方便后期自己维护时看懂自己的脚本——实际上,即便是自己写的脚本,在经过一段时间后也很容易忘记。
9、读取用户输入的数据
#!/bin/bash
# Copyright (c) http://c.biancheng.net/shell/
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"
第 5 行中表示从终端读取用户输入的数据,并赋值给 PERSON 变量。
read 命令用来从标准输入文件(Standard Input,stdin,一般就是指终端)读取用户输入的数据。
第 6 行表示输出变量 PERSON 的内容。注意在变量名前边要加上$,否则变量名会作为字符串的一部分处理。
10、"."
点号用于执行某个脚本,甚至脚本没有可执行权限也可以运行。
. ./test.sh
11、source
与点号类似,source 命令也可读取并在当前环境中执行脚本,同时还可返回脚本中最后一个命令的返回状态;
如果没有返回值则返回 0,代表执行成功;如果未找到指定的脚本则返回 false。
source test.sh
12、变量的值可以由单引号’ '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明:
#!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2
运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net
以单引号''包围变量的值时,单引号里面是什么就输出什么,
即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。
这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。
13、删除变量
unset aa
14、设置变量只读
readonly aa
15、定义局部变量
local cc
16、变量导出为环境变量(子bash可以使用)
export a
17、进入子bash
bash
18、查看当前bash进程id
echo $$
19、定义变量时同时导出
export bb=33
20、将环境变量写入启动文件
21、$n用来接收参数
test.sh
#!/bin/bash
echo "Language: $1"
echo "URL: $2"
运行 test.sh,并附带参数:
$ . ./a.sh Shell http://c.biancheng.net/shell/
运行结果:
Language: Shell
URL: http://c.biancheng.net/shell/
22、shell特殊变量
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名。 |
$n(n≥1) | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,我们将在《Shell @的区别》一节中详细讲解。 |
$? | 上个命令的退出状态,或函数的返回值,我们将在《Shell $?》一节中详细讲解。 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
23、杀死查询出来的规定进程
ps -ef | grep xxxx | awk ‘{print $2}’ | xargs kill -9