一、什么是shell脚本
Shell脚本是一种脚本语言,用于自动化执行一系列的命令和任务。它是由一系列的命令和控制结构组成的文本文件,通过解释器执行。Shell脚本可以执行系统命令、处理文件和目录、控制流程、定义变量和函数等。它是一种非常方便和灵活的工具,常用于系统管理、自动化任务和批处理等场景。shell脚本类似windows的批处理文件,shell脚本就是将连续执行的命令写成一个文件。shell脚本提供数组、循环、条件判断的等功能。shell脚本一般是Linux运维或者系统管理员要掌握的,作为嵌入式开发人员,只需要掌握shell脚本最基础的部分即可。
二、shell脚本写法
shell脚本是个纯文本文件,命令从上而下,一行一行的开始执行。shell脚本扩展名为.sh。shell脚本用于编写批处理任务的脚本语言。在shell脚本中,可以使用命令、控制结构和变量来完成各种任务。下面是一个简单的shell脚本的写法示例:
#shell脚本第一行一定要为:
#!/bin/bash
# 这是一个注释,用于解释脚本的功能,表示使用bash。
# 定义变量
name="John"
age=25
# 打印变量的值
echo "My name is $name"
echo "I am $age years old"
# 使用控制结构
if [ $age -lt 18 ]; then
echo "I am a minor"
else
echo "I am an adult"
fi
# 使用循环
for i in 1 2 3 4 5; do
echo "Number: $i"
done
# 调用命令
current_date=$(date +%Y-%m-%d)
echo "Current date: $current_date"
在这个示例中,脚本以#!/bin/bash
开头,这是指定脚本在Bash shell下运行的声明。然后定义了两个变量name
和age
,并使用echo
命令打印出变量的值。接下来使用if
语句根据年龄判断是否为未成年人,并使用for
循环打印出数字1到5。最后使用date
命令获取当前日期,并将结果保存到变量current_date
中,然后再次使用echo
命令打印出当前日期。
这只是一个简单的示例,shell脚本可以做更复杂的任务,比如文件操作、网络通信等。根据具体的需求,可以使用不同的命令、控制结构和变量来完成任务。
三、shell脚本语法
3.1、交互式shell脚本
使用read关键字从shell中获取输入。
当然,以下是一个用Bash语言编写的简单交互式Shell脚本的示例:
#!/bin/bash
# 提示用户输入姓名
echo "请输入您的姓名:"
read name
# 输出欢迎语句
echo "欢迎您,$name!"
在这个示例中,脚本首先使用echo
命令打印出提示信息,要求用户输入姓名。然后使用read
命令读取用户的输入,并将其保存到名为name
的变量中。最后使用echo
命令输出欢迎语句,其中的$name
会被替换为用户输入的姓名。
要运行这个脚本,可以将其保存为一个文件(例如welcome.sh
),然后在终端中使用以下命令执行:
bash welcome.sh
然后脚本会提示用户输入姓名,用户输入后,脚本会输出相应的欢迎语句。
3.2、shell脚本的数值计算
shell仅支持整形,数值计算使用$((表达式))。
shell脚本进行计算a + b:
#!/bin/bash
# 提示用户输入a和b的值
read -p "请输入a的值:" a
read -p "请输入b的值:" b
# 计算a + b的结果
result=$(($a + $b))
# 输出结果
echo "a + b的结果为:$result"
将上述脚本保存为一个.sh文件(例如add.sh),然后在终端中运行该脚本。将被提示输入a和b的值,并且脚本将计算并输出a + b的结果。
3.3、test命令
test命令是一个用于测试文件类型和比较值的Shell命令。它可以用于检查文件的存在性、类型、权限等,也可以用于比较数值的大小、字符串的相等性等。
常见的用法有:
test -e file:判断文件是否存在
test -f file:判断是否为普通文件
test -d directory:判断是否为目录
test -r file:判断文件是否可读
test -w file:判断文件是否可写
test -x file:判断文件是否可执行
test value1 -eq value2:判断两个值是否相等
test value1 -lt value2:判断value1是否小于value2
test string1 = string2:判断两个字符串是否相等
test命令的另一种形式是使用方括号[]
,例如[ -e file ]
和[ value1 -eq value2 ]
。两者功能完全相同,只是使用方式不同。
需要注意的是,test命令和方括号之间需要有空格,并且test命令的返回值为0或1,用于判断条件的成立与否。
例如可以使用test命令或者方括号[]
来判断一个目录是否存在。以下是用bash编写一个test命令的例子,判断目录是否存在并给出相应的提示信息:
#!/bin/bash
# 提示用户输入目录路径
read -p "请输入目录路径: " directory
# 使用test命令判断目录是否存在
if test -d "$directory"; then
echo "目录存在"
else
echo "目录不存在"
fi
或者使用方括号[]
来实现相同的功能:
#!/bin/bash
# 提示用户输入目录路径
read -p "请输入目录路径: " directory
# 使用方括号判断目录是否存在
if [ -d "$directory" ]; then
echo "目录存在"
else
echo "目录不存在"
fi
以上代码会让用户输入一个目录路径,然后判断该目录是否存在,并输出相应的提示信息。你可以将代码保存为一个扩展名为.sh的文件,并使用chmod命令给予执行权限后运行。
3.4、中括号[]判断符
在shell中使用方括号[]可以进行条件判断。方括号内的条件可以是数值比较、字符串比较、文件判断等。以下是一些常见的方括号条件判断:
数值比较:
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
字符串比较:
=:等于
!=:不等于
-z:空字符串
-n:非空字符串
文件判断:
-e:文件存在
-d:目录存在
-f:普通文件存在
-r:可读
-w:可写
-x:可执行
可以结合逻辑运算符进行复合条件判断,如&&
表示与运算,||
表示或运算。
&&和||命令:
cmd1 && cmd2 当cmd1执行完并且正确,那么cmd2开始执行,如果cmd1执行完毕错误,那么cmd2不执行。
cmd1 || cmd2 当cmd1执行完毕并正确,那么cmd2不执行,反之cmd2执行。
3.5、默认变量
Shell 的默认变量是一组预定义的特殊变量,这些变量对于 Shell 脚本来说非常有用。以下是一些常见的 Shell 默认变量:
$HOME:当前用户的主目录路径。
$PWD:当前工作目录的路径。
$USER:当前用户名。
$SHELL:当前 Shell 的路径。
$PATH:用冒号分隔的一组目录路径,用于查找可执行文件。
$IFS:用于分隔字符串的内部字段分隔符。
$PS1:Shell 提示符的格式字符串。
$PPID:当前进程的父进程 ID。
$RANDOM:生成一个随机数。
$LINENO:当前代码行的行号。
$0~$n,表示shell脚本的参数,包括shell脚本命令本身,shlle脚本命令本身为$0
$#:#表示最后一个参数的标号。
$@:表$1、$2、$3......
一、shell脚本条件判断
shell脚本支持条件判断,虽然可以通过&&和||来实现简单的条件判断,但是稍微复杂一点的场景就不适合了。shell脚本提供了if then条件判断语句,写法
if 条件判断 ; then
//判断成立要做的事情
fi
还有if then else 语句,写法
if 条件判断 ; then
//条件判断成立要做的事情
else
//条件判断不成立要做的事情。
fi
或:
if 条件判断 ; then
//条件判断成立要做的事情
elif [条件判断]; then
//条件判断成立要做的事情
else
//条件判断不成立要做的事情。
fi
最后还有case语句
case $变量 in
“第1个变量内容”)
程序段
;; //表示该程序块结束!!
“第2个变量内容”)
程序段;;
“第n个变量内容”)
程序段
;;
esac
判断两个变量是否相等并且文件是否存在:
if [ "$var1" = "$var2" ] && [ -e "/path/to/file" ]
then
echo "both conditions are true"
else
echo "at least one condition is false"
fi
二、shell脚本函数
shell脚本也支持函数,函数写法如下:
function fname ()
{
//函数代码段
}
三、shell循环
shell脚本也支持循环,比如 while do done,表示当条件成立的时候就一直循环,直到条件不成立。
while [条件] //括号内的状态是判断式
do //循环开始
//循环代码段
done
还有另外一种until do done,表示条件不成立的时候循环,条件成立以后就不循环了,写法如下:
until [条件]
do
//循环代码段
done
for循环,使用for循环可以知道有循环次数,写法:
for var in con1 con2 con3……
do
//循环代码段
done
for循环数值处理,写法:
for((初始值; 限制值; 执行步长))
do
//循环代码段
done