编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

shell 基本语法(shell基本语法set)

wxchong 2025-05-02 21:50:32 开源技术 6 ℃ 0 评论

查看 Shell

$ cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/usr/bin/sh

/usr/bin/bash

/usr/sbin/nologin

/bin/tcsh

/bin/csh

查看当前默认的shell

$ echo $SHELL

/bin/bash

不同的 Linux 发行版使用的提示符格式不同。例如在 CentOS 中, 默认的提示符格式为:

Shell提示符:#和$

[root@localhost ~]$

这种格式包含了以下三个方面的信息:

启动 Shell 的用户名, 也即 root;

本地主机名称, 也即 localhost;

当前目录, 波浪号~是主目录的简写表示法。

Shell 通过PS1和PS2两个环境变量来控制提示符格式:

PS1 控制最外层命令行的提示符格式。

PS2 控制第二层命令行的提示符格式。

在 Shell 中初次输入命令, 使用的是 PS1 指定的提示符格式;如果输入一个命令后还需要输入附加信息, Shell 就使用 PS2 指定的提示符格式。请看下面的例子:


[root@localhost ~]# echo "

> yan

> cheng

> sheng

> "

yan

cheng

sheng

echo 是一个输出命令, 可以用来输出数字、变量、字符串等;本例中, 我们使用 echo 来输出字符串。

字符串是一组由" "包围起来的字符序列, echo 将第一个"作为字符串的开端, 将第二个"作为字符串的结尾。此处的字符串就可以看做 echo 命令的附加信息。

本例中, 前两次使用 echo 命令时都是在后面紧跟字符串, 一行之内输入了完整的附加信息。

第三次使用 echo 时,将字符串分成多行, echo 遇到第一个"认为是不完整的附加信息, 所以会继续等待用户输入, 直到遇见第二个"。

输入的附加信息就是第二层命令, 所以使用>作为提示符。

要显示提示符的当前格式, 可以使用 echo 输出 PS1 和 PS2:

[root@localhost ~]# echo $PS1

[\u@\h \W]\$

[root@localhost ~]# echo $PS2

>

Shell 使用以\为前导的特殊字符来表示命令提示符中包含的要素, 这使得 PS1 和 PS2 的格式看起来可能有点奇怪。下表展示了可以在 PS1 和 PS2 中使用的特殊字符。

Bash shell 提示符可以包含的要素

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 的字符

\\ 斜杠

\[ 控制码序列的开头

\] 控制码序列的结尾

注意,所有的特殊字符均以反斜杠\开头, 目的是与普通字符区分开来。您可以在命令提示符中使用以上任何特殊字符的组合。

我们可以通过修改 PS1 变量来修改提示符格式, 例如:

[root@localhost ~]# PS1="[\t][\u]\$ "

[09:59:08][root]$

新的 Shell 提示符现在可以显示当前的时间和用户名。不过这个新定义的 PS1 变量只在当前 Shell 会话期间有效, 再次启动 Shell 时将重新使用默认的提示符格式。

第一个Shell脚本

打开文本编辑器, 新建一个文本文件, 并命名为 test.sh。

扩展名sh代表 shell, 扩展名并不影响脚本执行, 见名知意就好, 如果你用 php 写 shell 脚本, 扩展名就用php好了。

在 test.sh 中输入代码:

#!/bin/bash

echo "Hello World !" #这是一条语句

第 1 行的#!是一个约定的标记, 它告诉系统这个脚本需要什么解释器来执行, 即使用哪一种Shell; 后面的/bin/bash就是指明了解释器的具体位置。

第 2 行的 echo 命令用于向标准输出文件(Standard Output,stdout, 一般就是指终端)输出文本。在.sh文件中使用命令与在终端直接输入命令的效果是一样的。

第 2 行的#及其后面的内容是注释。Shell 脚本中所有以#开头的都是注释(当然以#!开头的除外)。

下面给出了一段稍微复杂的 Shell 脚本:

#!/bin/bash

echo "What is your name?"

read PERSON

echo "Hello, $PERSON"

第 5 行中表示从终端读取用户输入的数据, 并赋值给 PERSON 变量。read 命令用来从标准输入文件(Standard Input, stdin, 一般就是指终端)读取用户输入的数据。

第 6 行表示输出变量 PERSON 的内容。注意在变量名前边要加上$, 否则变量名会作为字符串的一部分处理。

执行方式:

[root@localhost ~]# sh test.sh

What is your name?

xutao

Hello, xutao

执行 Shell 脚本通常有两种方法。

$ cd demo #切换到 test.sh 所在的目录

$ chmod +x ./test.sh #使脚本具有执行权限

$ ./test.sh #执行脚本

第 2 行中, chmod +x表示给 test.sh 增加执行权限。

第 3 行中, ./表示当前目录, 整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./, Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,

而系统路径下显然不存在这个脚本, 所以会执行失败。

2) 使用 source 命令

与点号类似, source 命令也可读取并在当前环境中执行脚本, 同时还可返回脚本中最后一个命令的返回状态, 如果没有返回值则返回 0, 代表执行成功;

如果未找到指定的脚本则返回 false。

$ source test.sh

当命令失败时立即退出?

#!/bin/bash

set -euo pipefail

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表