sh编程
1.sh脚本
Shell脚本是一种用于在Unix、Linux和其他类Unix系统上编写和执行命令序列的脚本语言。它使用Shell解释器(如sh、bash、csh等)来解释和执行脚本。Shell脚本可以包含一系列命令、控制结构、变量和函数,用于完成特定的任务或自动化一系列操作。通过编写Shell脚本,你可以将一组命令和操作组织在一起,以便重复使用、批量处理或自动化任务。
2.sh脚本与c程序
相同点
- 变量:无论是Shell脚本还是C程序,都支持变量的使用。变量用于存储和操作数据,在程序执行过程中可以进行赋值、引用和修改。
- 控制结构:Shell脚本和C程序都支持条件语句和循环结构,用于根据条件执行不同的操作或重复执行一系列操作。无论是if-else语句、for循环还是while循环,它们在Shell脚本和C程序中的基本语法和用法是相似的。
- 函数:尽管Shell脚本和C程序的函数机制有所不同,但它们都支持函数的定义和调用。函数用于封装一组相关的操作,以实现代码的模块化和重用。
区别
- Shell脚本是一种脚本语言,而C程序是一种编译型语言。
- Shell脚本是解释执行的,需要通过Shell解释器解释并执行脚本。C程序需要经过编译器的编译,生成可执行文件后才能运行。
- Shell脚本中的变量无需事先声明,可以直接使用,且不需要指定数据类型。C程序中的变量需要先声明后使用,且需要指定数据类型。
3. sh命令行参数
在Shell脚本中,可以通过命令行参数向脚本传递额外的信息和参数。Shell脚本可以通过特殊的变量来获取和处理这些命令行参数。
$0 |
表示脚本本身的名称,即脚本文件的路径 |
---|---|
$1$2$3 |
表示命令行参数的位置参数。$1表示第一个参数,$2表示第二个参数,依此类推。例如,如果执行脚本时使用了命令 ./script.sh arg1 arg2 ,那么$1 为arg1 ,$2 为arg2 。 |
$# |
表示命令行参数的个数。例如,$# 为2表示有两个命令行参数。 |
$* |
表示所有的命令行参数,以列表形式展示。 |
sh变量
在Shell脚本中,变量的声明和使用是比较灵活的,可以直接进行赋值而无需显式声明变量的类型。
A=variable
4.sh命令
sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程。sh可以执行所有的Linux命令。其中,有些命令几乎已经成为sh不可分割的一部分,因为它们广泛用于sh脚本中。
内置命令
命令 | 含义 |
---|---|
.file | 读取并执行文件 |
break[n] | 从最近的第n个嵌套循环中退出 |
continue[n] | 重启最近的第n个嵌套循环 |
cd[dirname] | 更换目录 |
eval[arg...] | 计算一次参数并让sh执行生成的命令 |
exec[arg...] | 通过这个sh执行命令,sh将会退出 |
exit[n] | 使sh退出,退出状态为n |
export[var...] | 将变量导出到随后执行的命令 |
read[var...] | 从stdin中读取一行并为变量赋值 |
set [arg...] | 在执行环境中设置变量 |
shift | 将命令行参数向左移动 |
trap[arg][n] | 接收到信号n后执行参数 |
umask[ddd] | 将掩码设置为八进制数 ddd 的 |
wait[pid] | 等待进程pid,如果没有给出pid,则等待所有活动子进程 |
read | 当sh执行read命令时,它会等待来自stdin的输人行 |
Linux命令
命令 | 含义 |
---|---|
echo | 将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。 |
expr | 所有的sh变量都是字符串,所以我们不能直接把它们改为数值 |
awk | 数据处理程序 |
cmp | 比较两个文件 |
comm | 选择两个排序文件共有的行 |
grep | 匹配一系列文件的模式 |
diff | 找出两个文件的差异 |
join | 通过使用相同的键来连接记录以比较两个文件 |
sed | 流或行编辑命令 |
sort | 排序或合并文件 |
tail | 打印某个文件的最后n行 |
tr | 一对一字符翻译 |
uniq | 从文件中删除连续重复行 |
管道命令
sh脚本经常使用管道作为过滤器
ps -ax | grep httpd
cat file | grep word
5.命令替换
命令替换是一种在Shell脚本中使用的技术,用于将命令的输出结果嵌入到另一个命令或表达式中。
# 使用命令替换获取文件列表并进行循环处理
files=$(ls)
for file in $files; do
echo "处理文件:$file"
done
6.控制语句
- 条件语句:
条件语句根据给定的条件来执行不同的代码块。
if condition
then
# 条件为真时执行的代码块
else
# 条件为假时执行的代码块
fi
if condition1
then
# 执行条件1为真时的操作
elif condition2
then
# 执行条件2为真时的操作
elif condition3
then
# 执行条件3为真时的操作
else
# 执行所有条件都为假时的操作
fi
- 循环语句:
循环语句允许重复执行一段代码块,直到满足指定的条件。
for variable in list
do
# 代码块
done
while condition
do
# 代码块
done
until condition
do
# 代码块
done
- case语句:
case语句根据一个变量的值,在一系列模式匹配中选择执行相应的代码块。
case variable in
pattern1)
# 代码块1
;;
pattern2)
# 代码块2
;;
pattern3)
# 代码块3
;;
*)
# 默认代码块
;;
esac
7.I/O重定向
I/O重定向是一种在Shell中管理输入和输出流的机制。它允许将命令的输入或输出重定向到文件或其他流,以便对其进行处理或存储。
- 输入重定向(
<
):
通过输入重定向,可以将命令的输入从文件中读取而不是从标准输入(键盘)中读取。
command < input_file
示例:
# 从input.txt文件中读取内容并传递给cat命令
cat < input.txt
- 输出重定向(
>
):
通过输出重定向,可以将命令的输出写入文件而不是显示在标准输出(终端)上。
command > output_file
示例:
# 将ls命令的输出写入到output.txt文件中
ls > output.txt
- 追加输出重定向(
>>
):
追加输出重定向与输出重定向类似,但是它将命令的输出追加到文件的末尾,而不是覆盖文件中的内容。
command >> output_file
示例:
# 将date命令的输出追加到log.txt文件的末尾
date >> log.txt
8.sh函数
在Shell脚本中,函数是一种用于封装一段可重复使用的代码块的机制。通过定义函数,可以将一系列命令组织在一起,并在需要时进行调用。
#!/bin/bash
# 定义函数
function greet {
echo "Hello, $1!"
}
# 调用函数
greet "Alice"
9.sh中的通配符
- 星号通配符:sh中最常用的通配符*,可以拓展到目录中的所有文件
- file*:列出当前目录中所有文件信息
- ls*.c:列出当前目录中所有以.c结尾的文件
- file???:有三个字符的所有文件名
- ls*.??:一个点号.后有2个字符的所有文件名
- file*[ab]*:包含a或b的所有文件名
- ls*[xyz]*:列出所有包含x、y、z的文件名
- ls*[a-m]*:列出包含a到m范围内字符的所有文件名
问题解决思路
Shell脚本执行失败
脚本执行失败是一种非常常见的问题。通常,它会出现一些错误提示信息,如“command not found”、“permission denied”等。
这些错误提示信息意味着命令无法正确执行。解决这种问题的方法是检查Shell脚本中的命令是否正确、拥有足够的权限、以及相
关的环境变量是否设置正确。
Shell脚本中的变量
在Shell脚本中,可以使用变量来存储数据,例如路径、文件
名等。当我们调用Shell脚本中的变量时,需要使用“$”符号来访问变量。如果我们忘记使用“$”符号,Shell脚本将无法正确识别变量,并可能导致错误。
Shell脚本中的循环
在Shell脚本中循环是一个常见结构,当我们使用循环时要注意变量的作用域和循环使用条件。