目 录
一、引言
二、脚本代码实现
三、bash语法和结构
(一)基本语法
1、脚本开始与结束
2、注释
3、变量
4、数据类型
5、控制结构
6、循环控制
7、函数
8、算术运算
9、算术操作符和逻辑操作符
(二)命令相关
1、命令执行
2、命令的执行顺序
3、命令的执行优先级
4、命令的返回值
5、命令替换
6、输入/输出重定向
7、信号处理
8、 命令的退出状态
9、 命令的参数
10、命令的返回值
(三)内置函数和变量
1、内置变量
2、内置函数:
(四)其他
1、文件测试操作符
2、参数扩展
前面写了一篇文章:History命令解释,及一个相关的bash脚本(如何编写脚本程序从记录文件中提取history命令),有伙伴试过了,想知道,输出的命令列表能否进行排序,方便查看?
当然是可以的,本节就介绍一下如何实现。
其他的不多说了,直接上代码:
#!/bin/bash
# 检查输入参数
if [ "$#" -ne 1 ]; then
echo "Usage: $0 "
echo “用法:$0 带路径的文件名”
exit 1
fi
# 检查记录文件是否存在
if [ ! -f "$1" ]; then
echo "Error: File $1 does not exist."
exit 1
fi
# 创建一个临时文件来存储格式化的历史记录
tempfile=$(mktemp)
# 读取.bash_history文件,将时间戳和linux 命令存储到临时文件中
while IFS= read -r line; do
# 检查行是否以#开头,如果是,则认为是时间戳
if [[ $line =~ ^\#[0-9]+$ ]]; then
timestamp=${line:1}
else
# 将时间戳和命令写入临时文件
echo "$timestamp $line" >> "$tempfile"
fi
done < "$1"
# 按时间戳排序临时文件中的内容
sort -n -k 1,1 "$tempfile" | cut -d ' ' -f 2- | cat -n | sed 's/^\s*//'
# 最后删除临时文件
rm -f "$tempfile"
其他操作请参考前面的文章:History命令解释,及一个相关的bash脚本(如何编写脚本程序从记录文件中提取history命令)
Bash(Bourne Again SHell)是Linux和其他类Unix系统中默认的shell,它提供了脚本编程语言的功能。下面详细介绍Bash脚本的基本语法和结构。
脚本通常以#!/bin/bash开头,这被称为shebang,它告诉系统使用bash来执行这个脚本。
脚本结束没有特定的标记,但通常以一个非执行的空白行结束,这样可以使脚本结构更清晰。
在脚本中,#符号用于注释,它之后的所有内容直到行尾都会被视为注释。
变量名以字母或下划线开头,后面可以跟字母、数字或下划线。
变量赋值不需要使用等号两边有空格,例如:name="John"。
读取用户输入到变量中:read name。
字符串:由零个或多个字符组成的有序字符序列。
整数:没有小数点的数字。
if...then...else...fi:用于基于条件执行不同的操作。如下:
if [ condition ]; then
# commands
elif [ condition ]; then
# commands
else
# commands
fi`
for...in...do...done:用于循环遍历一组值。
for variable in value1 value2 ...; do
# commands using $variable
done
while...do...done:只要给定的条件为真,就会重复执行一系列命令。
while [ condition ]; do
# commands
done
break:跳出当前循环。
continue:跳过当前循环的剩余部分,进入下一次循环。
通过名字调用一段代码的复用方式。定义函数时使用function_name() { ... }的格式。函数参数通过位置来传递。
使用expr或双括号(( ))进行算术运算。例如,expr 2 + 3 或 (( a = 2 + 3 ))。
例如,+、-、*、/ 用于算术运算,==、!= 用于字符串比较,&&、|| 用于逻辑操作。
控制结构中的模式匹配:使用 [[ ... ]] 进行模式匹配,例如 [[ $variable == pattern ]]。
数组:Bash 支持数组,可以通过索引访问元素。
使用分号(;)或换行符来分隔命令。例如,echo "Hello"; echo "World" 或 `echo "Hello"
World"`。
Bash脚本会按照从上到下的顺序执行命令,你可以使用 && 和 || 控制命令的执行顺序。
使用括号可以改变命令的执行优先级。
每个命令执行后都会返回一个状态码,可以使用 $? 获取上一个命令的返回值。状态码0表示成功,非0表示有错误发生。
可以使用反引号()或$()来执行命令并将输出替换到当前位置。例如,echo "Today is $(date)"`。
使用尖括号(>)和(>>)来重定向标准输出和标准错误输出到文件。例如,echo "Hello" > file.txt。使用尖括号(<)来重定向标准输入从文件。例如,cat < file.txt。
可以使用 trap 命令捕获和处理信号。
每个命令执行后都会返回一个退出状态码,0通常表示成功,非0表示有错误发生。你可以使用特殊变量 `$?` 来获取上一个命令的退出状态码。
在脚本中,你可以通过特殊变量 `$0`、`$1`、`$2` 等来获取传递给脚本或函数的参数。例如,在函数中,你可以使用 `$1` 来获取第一个参数的值。另外,你也可以使用特殊变量 `$#` 来获取传递给脚本或函数的参数的数量。
命令执行后返回的状态码用于判断命令是否成功执行。0表示成功,非0表示有错误发生。可以通过特殊变量$?获取上一个命令的返回值。
例如 $#、$*、$1、$2 等用于获取位置参数的信息;$? 用于获取上一个命令的返回值;`` 用于获取当前脚本的进程ID等。
例如 echo、read、test 等,这些函数提供了基本的输入输出和测试功能。
用于检查文件或目录的存在、权限、类型等属性。例如,-e 检查文件或目录是否存在,-f 检查是否为常规文件,-d 检查是否为目录等。
if [ -e "/path/to/file" ]; then
echo "File exists"
fi
例如 ${variable#pattern} 可以删除变量值的最前面与模式匹配的部分。
以上是Bash脚本的基本语法和结构的概述,Bash脚本还有很多高级特性和用法,可以参考相关的文档和教程进行深入学习。希望这些信息,可以帮助您更好地了解Bash脚本的语法和结构!