Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问 Linux 内核的服务。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序,一般文件后缀为 .sh。
一、shell环境
Linux 环境下有很多可以使用的shell,每个用户都拥有一个特定的默认shell。在Linux系统中,/etc/shells文件用于指定哪些程序路径可以作为有效的登录shell。
Shell 的解释器种类众多,常见的有:
shell 解释器 | 说明 |
---|---|
sh | Bourne Shell。sh 是 Unix 标准默认的 shell。 |
bash | Bourne Again Shell。bash 是 Linux 标准默认的 shell。 |
tcsh | 整合 C Shell ,提供更多的功能 |
csh | 已经被 /bin/tcsh 所取代 |
zsh | 功能强大的 shell 与脚本语言。 |
要查看系统中允许的合法登录shell,可以执行以下命令:
cat /etc/shells
1.1 当前用户的默认shell
用户的“默认shell”是指他们登录系统后自动启动的命令行解释器或交互式shell。这个shell用于处理用户在命令行界面输入的命令和操作。
可以使用如下命令查看当前默认shell
echo $SHELL
1.2 修改当前用户默认shell
要更改用户的默认shell,可以在命令行中输入以下命令:
chsh -s <shell>
其中是你想要设置为用户默认shell的路径。例如,要将当前用户的默认shell更改为Bash,可以执行:
chsh -s /bin/bash
系统会要求你输入当前用户的密码以确认此操作。确认后,用户的默认shell将被更改为Bash。但是似乎修改失败了。
1.3 指定脚本解释器
shell脚本中,#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 解释器。#! 被称作shebang。
#! 决定了脚本可以像一个独立的可执行文件一样执行,而不用在终端之前输入sh, bash, python, php等。
指定 bash 解释器
#!/bin/bash
#!/usr/bin/env bash
1.4 shell 脚本执行方法
shell 脚本执行方法有多种,以如下helloworld.sh 为例
#!/bin/bash
echo "Hello, world!"
可以使用下面的命令让 shell 以非交互模式运行:
sh /path/to/script.sh
bash /path/to/script.sh
source /path/to/script.sh
./path/to/script.sh
其中,source /path/to/script.sh 和 ./path/to/script.sh 是等价的。
除此之外,你还可以通过chmod命令给文件添加可执行的权限,来直接执行脚本文件:
chmod +x /path/to/script.sh #使脚本具有执行权限
/path/to/test.sh
二、注释
注释可以说明你的代码是什么作用,以及为什么这样写。shell 语法中,注释是特殊的语句,会被 shell 解释器忽略。
单行注释 - 以 # 开头,到行尾结束。
多行注释 - 以 :<<EOF 开头,到 EOF 结束。
# echo '这是单行注释'
########## 这是分割线 ##########
:<<EOF
echo '这是多行注释'
echo '这是多行注释'
echo '这是多行注释'
EOF
三、shell 字符串输出
3.1 echo
echo用于字符串的输出。
输出普通字符串
echo "hello!"
输出含有变量的字符串
name=xiaoyuzhou
echo "hello, \"${name}\""
输出转义字符,需要使用-e参数。
# 输出含换行符的字符串
echo -e "first\nsecond"
# \c 不换行
echo -e "first \c"
echo "second"
3.2 printf 格式化输出字符串
printf 不会像 echo 一样自动添加换行符,如果需要换行可以手动添加 \n。
如下仿照ls -l 的输出格式,对文件夹信息进行打印输出
四、变量
Bash 中没有数据类型,bash 中的变量可以保存一个数字、一个字符、一个字符串等等。同时无需提前声明变量,给变量赋值会直接创建变量。
变量赋值时,等号左右不能有空格。访问变量的语法为:$var 或 ${var}。
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。
name="xiaoyuzhou"
gender="male"
echo ${name}
readonly name
# name="newname" # 放开注释,执行报错
unset gender
五、环境变量
环境变量是对当前 shell 会话内所有的程序或脚本都可见的变量。创建它们跟创建局部变量类似,但使用的是 export 关键字,shell 脚本也可以定义环境变量。
常见的环境变量:
变量 | 描述 |
---|---|
$HOME | 当前用户的用户目录 |
$PATH | 用分号分隔的目录列表,shell 会到这些目录中查找命令 |
$PWD | 当前工作目录 |
$RANDOM | 0 到 32767 之间的整数 |
$UID | 数值类型,当前用户的用户 ID |
$PS1 | 主要系统输入提示符 |
$PS2 | 次要系统输入提示符 |