Colderleo's blog Colderleo's blog
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)

Colder Leo

热爱代码的打工人
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)
  • 常见程序性能开销cost、latency延迟耗时的经验值
  • 面试常见问题
  • 静态链接-动态链接-elf详解-elfloader
  • 动态库和静态库的依赖问题
  • glibc和ld的编译调试-为某程序单独设置ld
  • dl_iterate_phdr遍历linkmap头、获取so加载地址
  • shell、bash语法和脚本模板
    • shell、bash语法模板
    • --传参
      • if语法
    • 多重引号中使用变量
      • 创建以当前日期-时间结尾的文件:
      • build.sh 模板、shell脚本设置根目录
    • vim
      • vim 插入模式/编辑模式
      • 设置vim的tab为四个空格
      • vim 普通模式
      • vim设置缩进
    • shell设置命令提示符格式:
  • so文件查找路径
  • 逻辑地址-线性地址or虚拟地址-物理地址
  • 通过ELF读取当前进程的符号表并获取符号的版本信息
  • 虚拟内存,cache,TLB,页表
  • 用户内存空间分布和mmap
  • numa网卡绑定
  • 隔核绑核、服务器优化
  • popen底层原理和仿照实现-execl
  • tmux用法
  • ASLR机制
  • 程序后台运行、恢复前台nohup
  • 大页内存huge_page
  • 用perf查看page-fault
  • Bash设置显示全部路径
  • 查看socket fd状态,设置nonblock
  • cout输出到屏幕的过程
  • 多进程写同一文件-write原子性-log日志
  • vim用法
  • epoll用法
  • signal信号、软中断、硬中断、alarm
  • 内核模块
  • 读写锁之pthread_rwlock和内核rwlock自旋读写锁
  • systemtap
  • xargs、awk用法
  • openssl libssl.so.10.so缺失问题
  • netstat用法
  • fork函数
  • tcp延迟确认ack
  • 90.centos7上一次std-string编译错误定位
  • docker用法
  • find用法
  • dmesg
  • gcc编译用法
  • avx-sse切换惩罚
  • Centos7防火墙
  • chmod用法
  • kernel-devel安装版本
  • Linux-Centos7系统安装、网络设置、常见报错
  • linux下g++编译c++文件
  • MegaCli 安装及使用
  • mysql
  • mysql忘记密码修改方法
  • set用法
  • crontab
  • ssh传文件scp
  • ssh连接
  • tcpdump、tshark、tcpreplay用法
  • ubantu root登录以及创建新用户
  • ubuntu安装g++和gdb
  • uClibc编译失败解决方法
  • win10安装WSL open-ssh
  • yum升级git
  • 比较so文件版本-md5sum
  • 查看磁盘信息
  • 合并两个硬盘,挂载到一个文件夹下
  • 软件安装目录usr-local-src
  • 下载centos历史版本
  • sh脚本转可执行文件、加密
  • Linux
gaoliu
2021-10-06
目录

shell、bash语法和脚本模板

# shell、bash语法模板

# --传参

脚本a.sh

#!/bin/bash

curdir=$(dirname $(realpath $0))
cd $curdir

if [ $1x =  -hx ]; then
    echo
    echo "usage:"
    echo "  ./{$1} xxx"
    exit 0
fi


while true; do
if [[ "$1" =~ "--" ]];then
  eval "${1#--}=$2"
  shift; shift
else
  break
fi
done

if [[ -z "${aa}" ]]; then
  aa="default"
fi
echo "aa=${aa}"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

执行:

./a.sh  --aa 123  --bb 456
1

# if语法

https://www.cnblogs.com/kaishirenshi/p/9729800.html

# 基本语法
if [ command ]; then
     符合该条件执行的语句
fi

# 扩展语法
if [ command ];then
     符合该条件执行的语句
elif [ command ];then
     符合该条件执行的语句
else
     符合该条件执行的语句
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
  • [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
  • 在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
  • 注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
  • 判断是不支持浮点值的
  • 如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
  • 在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
  • 使用-z或者-n来检查长度的时候,没有定义的变量也为0
  • 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
  • ? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

判断变量是否等于某字符串:

# 这样变量aa不存在时不会报错
if [ "${aa}" == "auto" ]; then echo yes; fi

# 这样变量aa不存在时也不会报错
if [[ ${aa} == "auto" ]]; then echo yes; fi

# 这样变量aa不存在时, 会报错!!!
if [ ${aa} == "auto" ]; then echo yes; fi

1
2
3
4
5
6
7
8
9

# 多重引号中使用变量

单引号内嵌双引号,再里面使用变量时,用单引号引起来即可

$ var=123

# 外层单引号,内存双引号时,无法直接使用变量
$ echo 'aaa"bbb${var}"ccc'
aaa"bbb${var}"ccc

# 加上单引号可以正常使用
$ echo 'aaa"bbb'${var}'"ccc'
aaa"bbb123"ccc

# 外层是双引号,内存单引号,可以直接使用变量
$ echo "aaa'bbb${var}'ccc"
aaa'bbb123'ccc
1
2
3
4
5
6
7
8
9
10
11
12
13

# 创建以当前日期-时间结尾的文件:

tcpdump -i any -w $(date "+%Y%m%d-%H%M%S").pcap > /dev/null &

dt=`date +%Y%m%d-%H%M%S`
echo $dt

# 获取当前目录下最新的pcap文件
ls -tr OrderServer_2022*.log | tail -1
ls -t OrderServer_2022*.log | head -1
1
2
3
4
5
6
7
8

# build.sh 模板、shell脚本设置根目录

开始记录当前位置为根目录,后面需要cd到根目录时直接用, 避免cd .. 找错位置。

build.sh 模板

# ################### set rootdir
set -x
# rootdir=`pwd`
rootdir=$(dirname $(realpath $0))
cd $rootdir


# ################### clean
cd ${rootdir}
# rm -rf bin build
mkdir -p bin build
cd bin
echo "cd ..  &&   chmod +x build.sh   &&  ./build.sh \$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9" > build.sh
chmod +x build.sh
cd ..


# ################### build
cd ${rootdir}
mkdir -p build
cd build
cmake ..
make
# make install


# ################### execute 
cd ${rootdir}/bin
# ./run_something
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# vim

# vim 插入模式/编辑模式

  • Ctrl+W,删除光标所在位置前面的一个单词
  • Ctrl+U,删除到行首

# 设置vim的tab为四个空格

命令模式下冒号,输入set ts=4

# vim 普通模式

dd:删除游标所在的一整行(常用)

  • 移动到行首:

    • 按home键
    • 按住shift + 6 键(也就是^,正则表达中代表行首)
  • 移动到行尾:

    • 按end键
    • 按住shift + 4 键(也就是$,正则表达中代表行尾)
  • 复制某行和粘贴

    • 在光标的位置按“yy”,复制当前行;
    • 然后再光标的行按“p”,粘贴到下一行,原来的往下顺移。
  • 移动光标

    • w 或 W 移动到下一单词的开头
    • b 或 B 移动到上一单词的开头
    • e 或 E 移动到光标所在单词的末尾
    • de 删除到本单词末尾
    • db 删除到前一个单词

# vim设置缩进

set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab / expandtab
1
2
3
4

说明: 其中 tabstop 表示一个 tab 显示出来是多少个空格的长度,默认 8。

softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。

shiftwidth 表示每一级缩进的长度,一般设置成跟 softtabstop 一样。

当设置成 expandtab 时,缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。

# shell设置命令提示符格式:

https://blog.csdn.net/Linuxprobe18/article/details/107352419 (opens new window)

  • \w: 显示全路径
  • \W: 显示当前文件夹名
  • \u: 显示当前用户
  • \h: 显示主机名
\e[0;31m 红色  
\e[1;32m 绿色  
\e[0;35m 绿色   
\e[m 默认颜色   

\\u 用户名 
\\h host  
\\w 当前全路径


# 设置为红色,显示 [用户名@主机 全路径] 换行$: 
# \e[0;31m 红色, \\u@\\h 用户名@主机名  \e[0;36m蓝色  \\t时间  \\w路径
export PS1="\e[0;31m\\u@\\h \e[0;36m\\t \e[0;31m\\w \e[m\n$ "
1
2
3
4
5
6
7
8
9
10
11
12
13
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54
dl_iterate_phdr遍历linkmap头、获取so加载地址
so文件查找路径

← dl_iterate_phdr遍历linkmap头、获取so加载地址 so文件查找路径→

最近更新
01
通过模板实现结构体成员拷贝-按成员名匹配
05-07
02
c++17通过模板获取类成员的个数
05-01
03
avx-sse切换惩罚
04-30
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Colder Leo | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×