本文示例使用 Bash,别名主要在交互式终端中使用。

别名

格式

在Linux中,别名的命令为 alias ,其使用方法为: alias 别名="表达式"

  • 别名通常只包含一个或多个简单的命令
  • 默认定义的是临时别名,只需要在终端输入 unalias 别名 或关闭当前终端即可撤销
  • 如需长期使用,个人 Bash 别名通常写入 ~/.bashrc,并执行 source ~/.bashrc 使当前 Shell 立即生效;登录 Shell 是否读取它,取决于个人配置。/etc/profile 是系统级登录初始化文件,不是唯一的配置位置。

举例

将 test 定义为 ls -l的别名

1
alias test="ls -l"
image-20231017164826515

💡提示:这里沿用截图里的 test 名称,不过它会遮住原本的 test 条件测试命令。平时更建议用 ll;unalias test 可撤销此别名。

将 remove 定义为 rm -i 的别名

1
alias remove="rm -i"

image-20231017165107047

Bash 默认不在非交互脚本中展开别名,因此脚本中需要复用命令时,通常使用函数。

函数

格式

  1. Shell 也能把一组命令打包成函数,少写几遍重复代码;其格式如下:

    1
    2
    3
    4
    5
    6
    7
    function_name () {
    # 函数的命令和操作
    # 可以使用参数和局部变量
    # 可以使用 return 语句来返回退出状态
    # 函数定义必须在实际调用前执行到
    : # 空命令占位,实际使用时替换为具体命令
    }
  2. 要调用一个Shell函数,只需写函数名称,调用时不加括号,可以传递参数作为函数的输入

    基本调用:函数名

    带参调用:函数名 参数

  3. 除此之外,还有些特殊字符,如下所示:

    符号 解释
    $0 脚本的名称
    $1 $2 $3 … 函数或脚本的参数,$1 表示第一个参数,以此类推
    $# 参数的数量
    $@ "$@" 保留每个参数的边界
    $* "$*" 将所有参数合为一个字符串
    $? 上一个命令的退出状态;
    用于检查命令是否成功执行(0 表示成功,非零表示失败)
    $$ 当前 Shell 的 PID(Bash 子 Shell 中通常仍保留父 Shell 的 $$)
    $! 最后一个在后台启动的命令或进程的PID(进程号)

函数内部的 $1、$# 等对应本次函数调用的参数,$0 仍是脚本名;local 定义的变量在函数内使用,避免随手覆盖外面的同名变量。

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

# 定义一个函数,通过标准输出给出两个整数的和
add_numbers() {
local num1=$1
local num2=$2
local sum=$((num1 + num2))
echo "$sum" # 输出计算结果,供命令替换捕获
}

# 调用函数并捕获标准输出
result=$(add_numbers 5 3)
status=$? #立即保存函数调用的退出状态
echo "总和: $result"
echo "脚本名: $0"
echo "参数数量: $#"
printf '脚本参数: <%s>\n' "$@"
echo "函数调用的退出状态: $status"
echo "进程号: $$"

返回值

说明

在 Shell 中,需要区分退出状态和输出结果:return 用于返回状态,echo 或 printf 用于输出文本,$(函数名) 可以捕获标准输出。

  • 函数的退出状态可通过 $? 获得,必须及时读取,后续命令会覆盖它

  • 需要自定义返回值时,可使用:return N (其中 N 的取值范围为:0-255)

    如果不加,将以最后一条命令的退出状态作为返回值;省略 return 时也如此

  • 通常情况下,返回值为 0 为无错误返回,处于1-255内为有错误返回

💡提示:返回值是一组状态码;如果需要自定义输出(如特定文本),请使用echo。

举例

写一个输出返回值的函数

1
2
3
4
5
6
7
#!/bin/bash
msg() {
echo "Done!"
return 32
}
msg
echo "返回值: $? "

image-20231018102307383

如果需要得到大于 255 的计算结果,应输出结果,再用命令替换捕获;这不是把更大的状态码放进变量。Bash 中 return 256 的状态会变为 0,拿它返回普通数值就容易整出误会。下面沿用原截图的输入和输出形式:

1
2
3
4
5
6
7
#!/bin/bash
msg2() {
read -r -p "输入一个数字:" num
echo "$((num * 5))" #示例约定输入为有效整数
}
result=$(msg2)
echo "返回值: ${result} " #这里显示的是输出结果,不是退出状态

image-20231018103207507

内部命令

(1)内部命令(内建命令)是 Shell 的一部分,例如 cd、read、export。它们通常在当前 Shell 中执行,但放在管道或子 Shell 中时仍可能在独立进程环境中运行;功能也不一定简单。

(2)外部命令是独立的可执行程序,例如 grep、sed。不少已由系统自带,不一定需要额外安装。

  • 可以通过 type 命令名 查看该命令是否为内部还是外部image-20231018093513769
  • 还可以通过 echo "$PATH" 查看查找外部命令时搜索的目录列表(具体命令的位置可用 type -a 命令名 查看)image-20231018093546990