Shell Tools & Scripting
变量
- 定义变量
foo=bar
- 使用变量
echo $foo
- 删除变量
unset foo
字符串操作
- 字符串拼接
echo "Hello, " $name "!"
- 字符串长度
echo ${#string}
- 字符串截取
echo ${string:start:length}
- 字符串替换
echo ${string/old/new}
简单的函数编写
- 创建脚本文件
vim myscript.sh # 当然这里可以用其他的编辑器
- 编写脚本内容
例如:
mad(){
mkdir -p $1
cd $1
}
mkdir -p "$1"
mkdir:创建目录的命令。
-p:递归创建目录。如果父目录不存在,会自动创建(例如:mcd a/b/c 会依次创建 a、a/b、a/b/c)。
"$1":函数的第一个参数(即用户传入的目录名)。用双引号包裹是为了处理包含空格或特殊字符的路径(例如:mcd "my folder")。
cd "$1"
cd:切换工作目录的命令。
"$1":切换到刚刚创建的目录。
这样的话:
source mcd.sh # 加载脚本,我们也可以直接./mcd.sh
mcd test # 创建目录 test,并切换到该目录
$_
变量保存上一个命令的最后一个参数。sudo!!
重复上一个命令,并以管理员权限运行。这是一个很方便的命令。$?
保存上一个命令的返回值。||
逻辑或运算符。如果前面的命令失败(返回非 0 值),则执行后面的命令。如果前面的命令成功,则什么也不做。&&
逻辑与运算符。如果前面的命令成功(返回 0 值),则执行后面的命令。;
用于分隔多个命令,并在每个命令执行完毕后,才执行下一个命令。*
通配符。匹配零个或多个字符。?
通配符。匹配单个字符。{}
花括号。用于匹配一组命令。
我们甚至可以这样
foo=$(pwd)
echo $foo
变量甚至可以储存一些意想不到的东西
$
变量引用
$var
:引用变量的值。${var}
:引用变量的值,并将其视为一个字符串。${var:-word}
:如果变量 var 存在,则引用其值;否则,引用 word。${var:=word}
:如果变量 var 存在,则引用其值;否则,将 word 赋值给 var,并引用该值。${var:+word}
:如果变量 var 存在且不为空(不为 0),则引用 word;否则,引用变量 var 的值。
....
命令替换
- 格式:
$(command)
echo "The current directory is $(pwd)"
- 作用:将命令的输出作为字符串替换到当前命令中。
echo "The current directory is $(ls)"
算术运算
+
加法运算符。-
减法运算符。*
乘法运算符。/
除法运算符。%
取模运算符。**
乘方运算符。
echo $((1 + 2 * 3 / 4)) # 输出 3
字符串比较
-eq
等于。-ne
不等于。-gt
大于。-lt
小于。-ge
大于等于。-le
小于等于。
if [ $a -eq $b ]; then
echo "a is equal to b"
fi
特殊变量
$#
传递给脚本或函数的参数个数。$*
传递给脚本或函数的所有参数。$@
传递给脚本或函数的所有参数,每个参数区分对待。$0
脚本或函数的名字。$$
当前进程的 ID。$!
后台运行的最后一个进程的 ID。$IFS
内部字段分隔符。$HOME
当前用户的主目录。$PATH
查找命令的路径。$RANDOM
随机数。$UID
当前用户的 ID。$USER
当前用户的用户名。$SECONDS
脚本运行的时间(秒)。$FUNCNAME
当前函数的名字。
....
简单脚本
- 创建脚本文件
一般的脚本文件名以 .sh
结尾,例如:myscript.sh
。
当然也可以不用.sh
.但是基于传统,还是建议加上后缀。
- 编写脚本内容
第一行:
#!/bin/bash
#!/bin/bash
:指定脚本的解释器。
对于某些任务,bush 并不是什么很好的选择,我们可以使用其他的解释器,例如:万能的 python 解释器
shellcheck
shellcheck 是一个 shell 脚本静态分析工具,它可以帮助我们检查 shell 脚本的语法错误,逻辑错误等等。
安装:
sudo apt-get install shellcheck
使用:
shellcheck myscript.sh
man
man 命令用于显示命令的手册页。
man ls
tldr
tldr 是一个简单的命令行工具,它可以显示常用命令的简短描述。
安装:
sudo npm install -g tldr
使用:
tldr ls
更好的查找文件
在这之前我相信我们都是用ls
可是如果我们需要特地找一个文件呢?
我们可以使用find
命令:
find / -name "文件名"
/
:表示从根目录开始查找。-name
:表示按照文件名查找。
例如:
find / -name "myfile.txt"
这样就会在整个系统中查找名为myfile.txt
的文件。
当然不止可以-name
,我们还可以用-type
参数指定文件类型,还可以-path
参数指定文件路径。 甚至可以用-exec
参数执行命令。
也许find
还是太麻烦,我们可以使用fd
命令:
sudo apt-get install fd-find
我们也可以使用locate
命令:
locate 命令用于快速查找文件。
sudo updatedb
locate 文件名
sudo updatedb
:更新数据库。locate 文件名
:查找文件名。
最后,我们可以使用grep
命令:
grep 命令用于查找文件中的字符串。
grep "字符串" 文件名
rg
也是可以查找的
tree
命令可以查看目录结构:
下载:
sudo apt-get install tree
使用:
tree 目录名