顺序参数
假设在命令行执行以下脚本:
sh bin/test.sh -p 2048 -n huaji -e Byte
其中的 -p 2048 -n huaji -e Byte 即为参数传递的方式,在 test.sh
脚本中,你可以使用特殊变量 $1
、$2
、$3
等来获取命令行传入的参数。这些特殊变量分别表示第一个、第二个、第三个参数,以此类推。
例如,假设你的 test.sh 脚本内容如下:
#!/bin/bash
# 获取第一个参数值,即 -p 后面的值
PORT=$2
# 获取第二个参数值,即 -n 后面的值
NAME=$4
# 获取第三个参数值,即 -e 后面的值
ENVIRONMENT=$6
echo "Port: $PORT"
echo "Name: $NAME"
echo "Environment: $ENVIRONMENT"
echo "$@" # 输出所有参数,每个作为一个词,整体则为数组
echo "$*" # 输出所有参数,作为一个整体字符串
注意
$1
$2
$3
$4
$5
$6
分别对应 -p 2048 -n huaji -e Byte
当你执行以上命令时:输出将会是:
Port: 2048
Name: huaji
Environment: Byte
-p 2048 -n huaji -e Byte
-p 2048 -n huaji -e Byte
相关扩展:$ 和 @ 符号
$和@属于shell的特殊字符,用来表示传递给脚本或函数的位置参数(Positional Parameters)。
具体来说:
- $n:读取第n个位置参数的值。
- $@:以数组的形式读取所有位置参数。
- $*:以字符串的形式读取所有位置参数。
- $0:当前脚本或函数的名称
- $#:位置参数的个数
相关扩展:用于输出的命令和操作符:echo、printf、>、>>、tee
1. echo:echo
是一个内置命令,用于在标准输出(通常是终端)上打印一行文本。例如:
echo "Hello, world!"
这条命令会在终端上打印 “Hello, world!”,并且自带换行。
2. printf:printf
是一个更强大的内置命令,可以格式化输出文本。例如:
printf "Hello, world!\n"
printf "Hello, %s!\n" "world"
这条命令会在终端上打印 “Hello, world!”。%s
是一个占位符,表示一个字符串,\n
表示新行。
当使用格式化字符串时,printf 会保留换行空格等特殊字符,这在你需要保持原始字符串或者json数据时很有用。
name="Hello,\nworld!"
printf "Hello, %s!" "$name"
# 输出
# Hello, Hello,\nworld!!
3. > :>
是一个重定向操作符,用于将标准输出重定向到文件。如果文件已存在,则会覆盖文件的内容。例如:
echo "Hello, world!" > file.txt
这条命令会将 “Hello, world!” 写入 file.txt
,覆盖 file.txt
中的任何现有内容。
4.>> :>>
也是一个重定向操作符,与 >
类似,但如果文件已存在,则会将内容追加到文件的末尾,而不是覆盖现有内容。例如:
echo "Hello, again!" >> file.txt
这条命令会将 “Hello, again!” 追加到 file.txt
的末尾。
5.tee:tee
是一个命令,可以将输入同时发送到标准输出和一个或多个文件。例如:
echo "Hello, world!" | tee file.txt
这条命令会在终端上打印 “Hello, world!”,并将其写入 file.txt
。如果你希望追加内容而不是覆盖,你可以使用 -a
选项:
echo "Hello, again!" | tee -a file.txt
输出到多个文件
echo "Hello, world!" | tee file1.txt file2.txt file3.txt
快速获取本机 ip 地址
ifconfig | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}'
-
ifconfig
:这个命令用于显示和配置网络接口的信息,包括 IP 地址、MAC 地址等。 -
|
:管道操作符,它将前一个命令的输出作为后一个命令的输入。在这个命令中,ifconfig
的输出将作为后续命令的输入。 -
grep inet
:这个命令使用grep
工具来搜索包含 "inet" 的行,这些行通常包含了 IP 地址的信息。 -
grep -v 127.0.0.1
用于排除 "127.0.0.1" 这个回环地址,因为这是本地回环接口的地址,不是真正的网络接口。 -
grep -v inet6
用于排除 IPv6 地址,只保留 IPv4 地址。 -
awk '{print $2}'
:使用awk
工具来提取每行的第二个字段,这通常是 IP 地址部分。例如:ifconfig | grep inet | grep -v 127.0.0.1 | grep -v inet6
如果输出为:inet 10.203.80.135 netmask 0xfffff000 broadcast 10.203.95.255
使用 awk 提取第二个字段即为 10.203.80.135
相关扩展:grep 工具
grep
是一个强大的文本搜索工具,它可以在文本文件中搜索与指定模式匹配的行。
基本语法:
grep [选项] 搜索模式 [文件名]
选项
:grep
支持多种选项,用于控制搜索的行为。搜索模式
:是你要查找的文本字符串,可以是普通文本或正则表达式。文件名
:是你要搜索的文件名。如果不提供文件名,grep
将从标准输入(通常是键盘输入)读取文本。
选项概览
以下是一些常用的 grep
选项:
-i
:i
代表 "ignore case",表示不区分大小写搜索。-v
:v
代表 "invert match",表示反转匹配,只显示不匹配的行。-l
:l
代表 "files with matches",表示只显示包含匹配项的文件名,而不是匹配的行。-c
:c
代表 "count",表示只计数匹配的行数,而不显示匹配的行。-r
:r
代表 "recursive",表示递归搜索,用于搜索目录及其子目录中的文件。-E
:E
代表 "extended regex",表示启用扩展正则表达式(支持更多正则表达式语法)。-A
:A
代表 "after context",表示显示匹配行及其后的几行。-B
:B
代表 "before context",表示显示匹配行及其前的几行。-n
:n
代表 "line number",表示显示匹配的行及其行号。-o
:o
代表 "only matching",表示仅显示匹配的文本,而不是整行。
常见用法示例:
使用 -i
选项进行不区分大小写搜索行
假设有一个文本文件 test.txt
包含以下内容:
Apple
Banana
apple
banana
要在不区分大小写的情况下搜索 "apple",可以使用 -i
选项:
grep -i "apple" test.txt
输出:
Apple
apple
使用 -v
选项反转匹配,搜索不匹配的行(一般用不到)
假设有一个文本文件 test2.txt
包含以下内容:
Apple
Banana
Cherry
要查找不包含 "Banana" 的行,可以使用 -v
选项:
grep -v "Banana" test2.txt
输出:
Apple
Cherry
使用 -l
选项搜索包含匹配项的文件名
grep -l "404" *.log #只显示包含404的日志文件
grep -l "Pattern" file1.txt file2.txt #搜索多个文件
还可以搜索一个目录,举例来说,假设有一个名为 mydir
的目录,它包含以下结构:
mydir/
file1.txt
file2.txt
subdir/
file3.txt
file4.txt
如果要在 mydir
目录及其子目录中搜索包含 "pattern" 的文件并显示文件名,可以使用以下命令:
grep -rl "pattern" mydir
输出将是:
mydir/file1.txt
mydir/subdir/file3.txt
这将返回所有包含 "pattern" 的文件的路径列表,包括它们的相对路径。
使用 -r
选项递归搜索目录,返回匹配行
假设有一个目录 mydir
包含多个文本文件,我们想要递归搜索整个目录及其子目录中的 "pattern"。
grep -r "pattern" mydir
这将搜索 mydir
目录及其子目录中的所有文件,查找包含 "pattern" 的行。
加上 -l 则返回匹配的文件名,加上 -n 则返回行号。
使用 -n
选项显示匹配的行及其行号
假设有一个文本文件 example.txt
包含以下内容:
Line 1
This is Line 2
Line 3
Another Line 3
要显示包含 "Line 3" 的行及其行号,可以使用 -n
选项:
grep -n "Line 3" example.txt
输出:
3:Line 3
4:Another Line 3
使用 -c
选项计算匹配的行数
假设有一个文本文件 example.txt
包含以下内容:
Apple
Banana
apple
banana
要计算包含 "apple" 的行数,可以使用 -c
选项:
grep -c "apple" example.txt
输出:
2
使用 -E
选项启用扩展正则表达式搜索行
假设我们有一个文本文件 example.txt
包含以下内容:
apple
apples
applies
要查找包含 "apples" 或 "applies" 的行,可以使用 -E
选项启用扩展正则表达式:
grep -E "apples|applies" example.txt
输出:
apples
applies
使用 -A
和 -B
选项搜索匹配行及其前后的几行
假设有一个文本文件 example.txt
包含以下内容:
Line 1
Line 2
Match: Line 3
Line 4
Line 5
要显示包含 "Match: Line 3" 的行及其前后的两行,可以使用 -A
和 -B
选项:
grep -A 2 -B 2 "Match: Line 3" example.txt
输出:
Line 1
Line 2
Match: Line 3
Line 4
Line 5
使用 -o
选项仅显示匹配的文本,而不是整行
假设有一个文本文件 example.txt
包含以下内容:
apple:fruit
banana:fruit
cherry:fruit
要仅显示匹配 "banana" 的文本,可以使用 -o
选项:
grep -o "banana" example.txt
输出:
banana
grep
非常强大,你可以根据具体的需求组合不同的选项和参数(指定文件名、文件扩展名、目录、多个文件等)来定制你的搜索。
查看机器信息
查看当前服务器的信息,包括 Linux 版本,你可以使用以下命令:
查看 Linux 版本和发行版信息:
cat /etc/os-release
lsb_release -a
以上两个都可以查看,结果示例:
NAME="Ubuntu"
VERSION="16.04.7 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.7 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
查看内核版本:
uname -r
# 打印全部系统信息
uname -a
查看服务器硬件信息(CPU、内存等):
lshw
查看服务器 CPU 信息:
cat /proc/cpuinfo
查看服务器内存信息:
cat /proc/meminfo
查看磁盘空间和分区信息:
df -h
查看网络接口信息:
ifconfig -a
查看服务器启动时间和运行时间:
uptime
查看服务器的 CPU 核心数:
lscpu
#这个命令将输出有关 CPU 的详细信息,包括核心数、线程数等。
这个命令将直接输出 CPU 的核心数。
nproc
vim 编辑器快捷键
基本移动和编辑命令:
-
移动光标:
h
- 左移j
- 下移k
- 上移l
- 右移
-
跳转:
w
- 向前跳一个单词b
- 向后跳一个单词0
- 行首$
- 行尾gg
- 文档开头G
- 文档末尾
-
复制、剪切和粘贴:
yy
- 复制当前行dd
- 剪切当前行p
- 粘贴
-
撤销和重做:
u
- 撤销Ctrl + r
- 重做
-
查找和替换:
/pattern
:向前搜索指定模式。?pattern
:向后搜索指定模式。n
:跳转到下一个搜索结果。N
:跳转到上一个搜索结果。:s/old/new/g
- 替换单行所有匹配的字符串:%s/old/new/g
:全局替换old
为new
。
模式和编辑命令:
-
插入模式:
i
- 在光标前插入I
- 在行首插入a
- 在光标后插入A
- 在行尾插入o
- 在当前行下插入新行O
- 在当前行上插入新行
-
可视模式:
可视模式允许用户选择文本块以进行操作。在可视模式下,你可以使用键盘来选择文本,然后对所选择的文本执行各种操作,如复制、剪切、替换等。
v
- 字符可视模式V
- 行可视模式Ctrl + v
- 块可视模式- 命令模式:
:
- 进入命令模式,可以执行命令(例如保存、退出等)
文件操作:
:w
- 保存文件:q
- 退出 Vim:q!
- 强制退出 Vim,不保存修改:wq
- 保存并退出
窗口分割:
:sp
- 横向分割窗口:vsp
- 纵向分割窗口Ctrl + w
后跟方向键 - 在窗口之间切换
多文件操作:
:e filename
- 打开新文件:bnext
- 切换到下一个缓冲区文件:bprev
- 切换到上一个缓冲区文件
自动补全:
Ctrl + n
- 向下补全Ctrl + p
- 向上补全
标记和跳转:
m
+ 字母 - 创建标记'
+ 字母 - 跳转到标记`
+ 字母 - 跳转回上一个位置
宏录制和重放:
q
+ 字母 - 开始录制宏q
- 停止录制宏@
+ 字母 - 重放宏
折叠和展开:
zf
+ 移动命令 - 创建折叠zo
- 展开折叠zc
- 折叠zR
- 展开所有折叠
条件判断
shell中条件判断if中的-z到-d的意思
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2,or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
数字判断
[ $count -gt "1"] 如果$count 大于1 为真
-gt 大于
-lt 小于
-ne 不等于
-eq 等于
-ge 大于等于
-le 小于等于