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
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
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
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
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
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
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
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
2
3
4
5
6
7
8
9
10
11
12
13
编辑 (opens new window)
上次更新: 2023/05/07, 17:27:54