LV02-02-shell-08-自己常用的shell脚本

本文主要是shell——自己平时常用的脚本汇总相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
开发板 正点原子 i.MX6ULL Linux阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
STM32开发板 正点原子战舰V3(STM32F103ZET6)
点击查看本文参考资料
参考方向 参考原文
------
点击查看相关文件下载
--- ---

1.路径获取与拆分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ${parameter#*word}  即从左向右截取第一个word后的字符串
# ${parameter##*word} 即从左向右截取最后一个word后的字符串
# ${parameter%word*} 即从右向左截取第一个word前的字符串
# ${parameter%%word*} 即从右向左截取最后一个word前的字符串
#!/bin/sh
FILE_PATH=a/b/c/d/file.tar.gz
echo "\${FILE_PATH} = ${FILE_PATH}"
echo ""
echo "\${FILE_PATH#*/} = ${FILE_PATH#*/}"
echo "\${FILE_PATH##*/} = ${FILE_PATH##*/}"
echo "\${FILE_PATH%/*} = ${FILE_PATH%/*}"
echo "\${FILE_PATH%%/*} = ${FILE_PATH%%/*}"
echo ""
echo "\${FILE_PATH#*.} = ${FILE_PATH#*.}"
echo "\${FILE_PATH##*.} = ${FILE_PATH##*.}"
echo "\${FILE_PATH%.*} = ${FILE_PATH%.*}"
echo "\${FILE_PATH%%.*} = ${FILE_PATH%%.*}"

运行结果为:

1
2
3
4
5
6
7
8
9
10
11
12
hk@vm:~/1sharedfiles/6temp$ ./1.sh 
${FILE_PATH} = a/b/c/d/file.tar.gz

${FILE_PATH#*/} = b/c/d/file.tar.gz
${FILE_PATH##*/} = file.tar.gz
${FILE_PATH%/*} = a/b/c/d
${FILE_PATH%%/*} = a

${FILE_PATH#*.} = tar.gz
${FILE_PATH##*.} = gz
${FILE_PATH%.*} = a/b/c/d/file.tar
${FILE_PATH%%.*} = a/b/c/d/file

2.获取shell参数

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
ARGC=$# # 参数的数量(不包含./file.sh)
ARGV="$@" # 作为数组使用
ARGS="$*" # 作为字符串使用
echo "\${ARGC} = ${ARGC}"
echo "\${ARGV} = ${ARGV}"
echo "\${ARGV[@]} = ${ARGV[@]}"
echo "\${ARGV[*]} = ${ARGV[*]}"
echo "\${ARGS} = ${ARGS}"
echo "shell pram = ${0} ${ARGS}"

【注意】

1
2
当 $* 和 $@ 不被双引号 " " 包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。
当 $* 和 $@ 不被双引号 " " 包围时,"$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

运行结果如下:

1
2
3
4
5
6
7
hk@vm:~/1sharedfiles/6temp$ ./1.sh 1 2
${ARGC} = 2
${ARGV} = 1 2
${ARGV[@]} = 1 2
${ARGV[*]} = 1 2
${ARGS} = 1 2
shell pram = ./1.sh 1 2

3.获取当前时间字符串

1
2
3
4
5
#!/bin/sh

day=`date +%Y_%m_%d_%H_%M_%S`
echo "${day}"

运行结果如下:

1
2
hk@vm:~/1sharedfiles/6temp$ ./1.sh
2023_03_25_21_39_32