Skip to content

Shell Tools & Scripting

变量

  1. 定义变量
bash
foo=bar
  1. 使用变量
bash
echo $foo
  1. 删除变量
bash
unset foo

字符串操作

  1. 字符串拼接
bash
echo "Hello, " $name "!"
  1. 字符串长度
bash
echo ${#string}
  1. 字符串截取
bash
echo ${string:start:length}
  1. 字符串替换
bash
echo ${string/old/new}

简单的函数编写

  1. 创建脚本文件
bash
vim myscript.sh # 当然这里可以用其他的编辑器
  1. 编写脚本内容

例如:

bash

mad(){
    mkdir -p $1
    cd $1
}
  1. mkdir -p "$1"

    • mkdir:创建目录的命令。

    • -p:递归创建目录。如果父目录不存在,会自动创建(例如:mcd a/b/c 会依次创建 a、a/b、a/b/c)。

    • "$1":函数的第一个参数(即用户传入的目录名)。用双引号包裹是为了处理包含空格或特殊字符的路径(例如:mcd "my folder")。

  2. cd "$1"

    • cd:切换工作目录的命令。

    • "$1":切换到刚刚创建的目录。

这样的话:

bash
source mcd.sh # 加载脚本,我们也可以直接./mcd.sh
mcd test # 创建目录 test,并切换到该目录
  • $_ 变量保存上一个命令的最后一个参数。
  • sudo!! 重复上一个命令,并以管理员权限运行。这是一个很方便的命令。
  • $? 保存上一个命令的返回值。
  • || 逻辑或运算符。如果前面的命令失败(返回非 0 值),则执行后面的命令。如果前面的命令成功,则什么也不做。
  • && 逻辑与运算符。如果前面的命令成功(返回 0 值),则执行后面的命令。
  • ; 用于分隔多个命令,并在每个命令执行完毕后,才执行下一个命令。
  • * 通配符。匹配零个或多个字符。
  • ? 通配符。匹配单个字符。
  • {} 花括号。用于匹配一组命令。

我们甚至可以这样

bash
foo=$(pwd)
echo $foo

变量甚至可以储存一些意想不到的东西

$

变量引用

  • $var:引用变量的值。
  • ${var}:引用变量的值,并将其视为一个字符串。
  • ${var:-word}:如果变量 var 存在,则引用其值;否则,引用 word。
  • ${var:=word}:如果变量 var 存在,则引用其值;否则,将 word 赋值给 var,并引用该值。
  • ${var:+word}:如果变量 var 存在且不为空(不为 0),则引用 word;否则,引用变量 var 的值。

....

命令替换

  1. 格式:$(command)
bash
echo "The current directory is $(pwd)"
  1. 作用:将命令的输出作为字符串替换到当前命令中。
bash
echo "The current directory is $(ls)"

算术运算

  • + 加法运算符。
  • - 减法运算符。
  • * 乘法运算符。
  • / 除法运算符。
  • % 取模运算符。
  • ** 乘方运算符。
bash
echo $((1 + 2 * 3 / 4)) # 输出 3

字符串比较

  • -eq 等于。
  • -ne 不等于。
  • -gt 大于。
  • -lt 小于。
  • -ge 大于等于。
  • -le 小于等于。
bash
if [ $a -eq $b ]; then
    echo "a is equal to b"
fi

特殊变量

  • $# 传递给脚本或函数的参数个数。
  • $* 传递给脚本或函数的所有参数。
  • $@ 传递给脚本或函数的所有参数,每个参数区分对待。
  • $0 脚本或函数的名字。
  • $$ 当前进程的 ID。
  • $! 后台运行的最后一个进程的 ID。
  • $IFS 内部字段分隔符。
  • $HOME 当前用户的主目录。
  • $PATH 查找命令的路径。
  • $RANDOM 随机数。
  • $UID 当前用户的 ID。
  • $USER 当前用户的用户名。
  • $SECONDS 脚本运行的时间(秒)。
  • $FUNCNAME 当前函数的名字。

....

简单脚本

  1. 创建脚本文件

一般的脚本文件名以 .sh 结尾,例如:myscript.sh

当然也可以不用.sh.但是基于传统,还是建议加上后缀。

  1. 编写脚本内容

第一行:

bash
#!/bin/bash
  • #!/bin/bash:指定脚本的解释器。

对于某些任务,bush 并不是什么很好的选择,我们可以使用其他的解释器,例如:万能的 python 解释器

shellcheck

shellcheck 是一个 shell 脚本静态分析工具,它可以帮助我们检查 shell 脚本的语法错误,逻辑错误等等。

安装:

bash
sudo apt-get install shellcheck

使用:

bash
shellcheck myscript.sh

man

man 命令用于显示命令的手册页。

bash
man ls

tldr

tldr 是一个简单的命令行工具,它可以显示常用命令的简短描述。

安装:

bash
sudo npm install -g tldr

使用:

bash
tldr ls

更好的查找文件

在这之前我相信我们都是用ls

可是如果我们需要特地找一个文件呢?

我们可以使用find命令:

bash
find / -name "文件名"
  • /:表示从根目录开始查找。
  • -name:表示按照文件名查找。

例如:

bash
find / -name "myfile.txt"

这样就会在整个系统中查找名为myfile.txt的文件。

当然不止可以-name,我们还可以用-type参数指定文件类型,还可以-path参数指定文件路径。 甚至可以用-exec参数执行命令。

也许find还是太麻烦,我们可以使用fd命令:

bash
sudo apt-get install fd-find

我们也可以使用locate命令:

locate 命令用于快速查找文件。

bash
sudo updatedb
locate 文件名
  1. sudo updatedb:更新数据库。
  2. locate 文件名:查找文件名。

最后,我们可以使用grep命令:

grep 命令用于查找文件中的字符串。

bash
grep "字符串" 文件名

rg也是可以查找的


tree命令可以查看目录结构:

下载:

bash
sudo apt-get install tree

使用:

bash
tree 目录名