目录
一、什么是Shell?
Shell是一种计算机程序,它充当了用户与操作系统之间的接口。在Linux系统中,Shell允许用户通过命令行界面(CLI)来控制计算机。Shell脚本则是一种使用Shell语言编写的脚本,它可以自动执行一系列的命令,帮助用户实现任务自动化,提高工作效率。
二、 编写第一个Shell脚本
- 创建脚本文件:使用文本编辑器(如vi、nano)创建文件,推荐扩展名为
.sh
。 - 添加执行权限:运行
chmod +x filename.sh
。 - 编写脚本:首行添加
#!/bin/bash
或#!/bin/sh
作为shebang,指示Shell解释器类型。
新建一个shell脚本: touch xx.sh 第一行:#!/bin/bash 意思是使用/bin/bash来解释执行 执行方式: sudo chmod 权限 ./xx.sh #使脚本具有执行权限 ./xx.sh #执行脚本
编辑
2.2 变量
- 自定义变量:通常大写,直接赋值无需类型声明。
一般用大写 进行赋值时用=,左右两边不能有大写 引用变量前面加$ VAR=10 echo $VAR #10
- 位置参数:
$0
代表脚本名称,$1
,$2
, ... 表示参数。
$0或者${0}与输入的命令行一样,表示包含脚本名./xx.sh的参数 $1,$2,$3...表示命令行输入的剩下的参数 $# 表示包含命令行参数的个数(不包含脚本文件名这个参数) $@ $* 包含命令行所有参数:“$1 $2 $3...”
- 预定义变量:
$?
记录最后命令的退出状态,$$
表示当前进程ID。
$? 包含前一个命令的退出状态(0表示真 非0表示假) $$ 包含正在执行进程的ID号
- 环境变量:
$HOME
指向用户主目录,$PATH
定义搜索路径。
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。 $HOME: /etc/passwd文件中列出的用户主目录 $PATH :shell搜索路径,就是是一系列目录,当执行命令时,linux就在这些目录下查找。
2.3 功能语句
- 注释:使用
#
标记。 - 算术运算:
expr
或let
命令。
算数运算符命令expr主要用于进行简单的算数运, 包括+ - \* / %等操作。 #!/bin/bash VAR=10 NUM=`expr \( 2 + $VAR \) \* 4` echo $NUM 48
- 输入读取:
read
命令,read -p
提供输入提示。
功能:read从标准输入读入一行,并赋值给后面的变量 格式:read VAR1 VAR2 VAR3 把读入行中的第一个单词赋值给VAR1,第二个单词赋值给VAR2,第三个单词赋值给VAR3,以此类推。 read -p "提示语句" 变量名列表:可以将提示语句输出,同时输入变量。 类似 scanf read a b c d read -p "字符串" a b c d
- 条件测试:
test
或方括号[]
用于测试字符串、整数和文件属性。
可测试对象:字符串 整数 文件属性 每种测试对象都有若干个操作符 字符串的测试: s1 = s2 测试两个字符串是否完全一样 s1 != s2 测试两个字符串是否有差异 -z s1 测试s1字符串的长度是否为0 -n s1 测试s1字符串的长度是否不为0 整数的测试: a -eq b 测试a和b是否相等 eqaul a -ne b 测试a和b是否不相等 not equal a -gt b 测试a是否大于b grater than a -ge b 测试a是否大于等于b grater equal a -lt b 测试a是否小于b litter than a -le b 测试a是否小于等于b litter equal (3)文件属性测试: -d name 测试name是否为一个目录 -f name 测试name是否为普通文件 -e name 测试文件是否存在 #!/bin/bash #测试字符串 VAR="hello" test $VAR = "hello" echo $? test $VAR != "hello111" echo $? #测试整数 NUM=10 test $NUM -eq 1 echo $? test $NUM -ne 1 echo $? test $NUM -gt 0 echo $? test $NUM -lt 0 echo $? #测试文件 read FILE #从终端读取一个字符串赋值给变量FILE test -e $FILE echo $? test -d $FILE echo $? test -f $FILE echo $?
- 控制结构:
- If语句:支持基本、多路和嵌套条件。
基本结构 if 条件 then 命令1 else 命令2 fi 多路分支结构: if 条件1 then 命令表1 elif 条件2 then 命令表2 else 命令表3 fi 嵌套结构: if 条件 then if 条件 then 命令表1 fi else 命令表2 fi 补充操作符: -o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true -a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false ! 非运算 例如 [ ! false ] 返回 true && 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false || 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true | 位或 例如 echo $[2|2] &位与 例如 echo $[2&1]
- Case语句:模式匹配。
格式: case 变量 in 模式1) 命令表1 ;; 模式2) 命令表2 ;; *) 命令表3 ;; esac 也可以用+\或者其他的字符来实现输入特殊字符就可以执行命令
- While循环:基于条件的循环。
格式: while 命令或表达式 do 命令表 done 执行顺序: while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
- For循环:遍历列表或范围。
格式 for 变量名 in 单词表 do 命令表 done 执行顺序: 变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令. 循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。 for语句的几种书写格式: 1)for i in 1 2 3 4 do....done : 变量i从单词表中取值 2)for i do...done: 变量i从命令行取值,可以省略in 单词表 3)for i in {1..10} do...done: 变量i从1-10个数中取值 4)for ((i = 0; i < 10; i++)) do...done: 书写格式类似c语言
- 循环控制:
break
和continue
分别用于跳出和跳过循环。
break n: 结束n层循环 continue n:结束n层循环,继续下一次循环 for ((i=1;i<5;i++ )) do if [ $i -eq 3 ] then # break # continue # exit fi echo $i done echo OK 输出的结果 break的结果 1 2 OK continue的结果 1 2 4 OK
2.4 数组
- 赋值:直接赋值或通过
read
命令。
array=(1 2 3 4 5) array1=($1 $2 $3 $4) read a b c array2=($a $b $c) read -a array4
- 引用:
"${array[i]}"
访问特定元素。"${array[@]}"
遍历所有元素。"${#array[@]}"
获取元素总数。
${array[i]} #数组下标i从0开始到n-1结束 array[i]=3 #对数组元素重新赋值 ${array[@]} #遍历数组 ${#array[@]} #计算数组种元素的个数