linux shell学习笔记整理

顺序参数

假设在命令行执行以下脚本:

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. echoecho 是一个内置命令,用于在标准输出(通常是终端)上打印一行文本。例如:

echo "Hello, world!"

这条命令会在终端上打印 “Hello, world!”,并且自带换行。

2. printfprintf 是一个更强大的内置命令,可以格式化输出文本。例如:

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.teetee 是一个命令,可以将输入同时发送到标准输出和一个或多个文件。例如:

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 选项:

  • -ii 代表 "ignore case",表示不区分大小写搜索。
  • -vv 代表 "invert match",表示反转匹配,只显示不匹配的行。
  • -ll 代表 "files with matches",表示只显示包含匹配项的文件名,而不是匹配的行。
  • -cc 代表 "count",表示只计数匹配的行数,而不显示匹配的行。
  • -rr 代表 "recursive",表示递归搜索,用于搜索目录及其子目录中的文件。
  • -EE 代表 "extended regex",表示启用扩展正则表达式(支持更多正则表达式语法)。
  • -AA 代表 "after context",表示显示匹配行及其后的几行。
  • -BB 代表 "before context",表示显示匹配行及其前的几行。
  • -nn 代表 "line number",表示显示匹配的行及其行号。
  • -oo 代表 "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:全局替换 oldnew
模式和编辑命令:
  • 插入模式:

    • 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 小于等于

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值