第一个Shell脚本
新建一个文件test.sh,扩展名为sh,扩展名不影响脚本的执行,见名知意就好。
#!/bin/bash #shell脚本第一行通常是该语句,#!是一个约定的标记,告诉系统脚本需要什么解释器来执行
echo "Hello World !"
运行Shell脚本的方法
chmod +x ./test.sh #是脚本具有执行权限
./tesh.sh #执行脚本
Shell变量
#定义变量
your_name="Tom" #变量的定义格式为 变量名=变量值,=两边不能有空格#使用变量
echo ${your_name} #使用变量需要加$,变量名外面的花括号可加可不加,{}是为了帮助解释器识别变量边界#只读变量:只读变量的值不能够被改变
readonly your_name #使用readonly将变量设置为只读#删除变量
unset your_name #使用unset 变量名可以删除变量,变量删除后不能再次使用,只读变量不能被删除
变量的类型有:字符串变量、整数变量、数组变量、环境变量、特殊变量
字符串变量:
注意:字符串的索引从0开始
str='this is a dog' #单引号的字符串任何字符都会原样输出,单引号字符串中的变量是无效的
str="this is ${gog_name}"
str1="hello, "$your_name"!" #可以使用双引号进行字符串的拼接#获取字符串的长度
string="abcd"
echo ${#string} #输出4#提取子字符串
string="runoob is a great site"
echo ${string:1:4} #从第二个字符开始,截取4个字符,输出unoo
数组变量:
#数组变量
my_array=(1 2 3 4 5)#关联数组(也称为哈希表或字典)
declare -A associate_array
associate_array["name"]="John" #获取数组的长度
length=${#array_name[@]}
或
length=${#array_name[*]}length=${#array_name[n]} #获取第n个元素的长度
环境变量:由操作系统或用户设置的特殊环境变量,用于配置shell的行为和影响其执行环境
#常见的环境变量
HOME:用户的主目录
PATH:执行命令时要搜索的目录列表
PWD:当前工作目录#设置环境变量
export MY_VARIABLE="my value" #使用export设置为环境变量#查看环境变量
printenv 或 env命令查看所有的环境变量#修改环境变量
PATH="$PATH:/new/directory"
export PATH#删除环境变量
unset MY_VARIABLE #使用unset删除环境变量
Shell传递参数
shell脚本内获取参数的格式为$n 表示第n个参数
#!/bin/bashfunction show(){echo "第一个参数为 $1"echo "第二个参数为 $2"
}show 0 1输出结果为:
第一个参数为0
第二个参数为1
Shell基本运算符
算术运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符
算术运算符:
原生的bash不支持简单的数学运算,但是可以通过expr命令来实现,能完成表达式的求值操作
[注] 运算符与表达式之间一定要加空格
#假定变量a为10,变量b为20
+ `expr $a + $b`
- `expr $a - $b`
* `expr $a \* $b`
/ `expr $b / $a`
= a=$b
== [$a == $b]
!= [$a != $b]
关系运算符:
关系运算符只支持数字,不支持字符串
-eq 检测两个数是否相等 [$a -eq $b]
-ne 检测两个数是否不相等 [$a -ne $b]
-gt 检测左边的数是否大于右边的 [$a -gt $b]
-lt 检测左边的数是否小于右边的 [$a -lt $b]
-ge 检测左边的数是否大于等于右边的 [$a -ge $b]
-le 检测左边的数是否小于等于右边的 [$a -le $b]
布尔运算符:
! 非运算
-o 或运算
-a 与运算
逻辑运算符:
&& 逻辑的and
|| 逻辑的or
字符串运算符:
= 检测两个字符串是否相等
!= 检测两个字符串是否不相等
-z 检测字符串长度是否为0,为0返回true
-n 检测字符串长度是否不为0
$ 检测字符串是否不为空,不为空返回true
文件测试运算符:
Shell流程控制
if else:
if []
thenxxx
elif []
thenxxx
elsexxx
fi
for循环:
for var in item1 item2 item3 ... itemN
docommand1command2...commandN
done#写成一行
for var in item1 item2 ... itemN; do command1 command2 ... done;
while语句:
until语句:
case ... esac语句:
#实例
site="runoob"
case "$site" in"runoob") echo "菜鸟教程";;"Google") echo "Google 搜索";;"taobao") echo "淘宝网";;
esac
跳出循环还是有break和continue两种方式
Shell函数
function funname [()]
{action;return int;
}#function是可选的,可加可不加 return 也是可选的
Shell输入输出重定向
> 输出重定向
>> 追加输出重定向
< 输入重定向
Shell文件包含