1.shell脚本的特点
(1)shell是一种弱类型语言
(2)shell是一门解释型语言
(3)shell没有数据类型(结构体),所以类型可以直接使用,不用先定义再使用,需要注意二义性
(4)非编译
2.shell脚本的执行方式
(1)直接执行脚本./pid.sh
首先赋予chomd u+x pid.sh //只授予这个文件所属组的执行权限
然后就可以./pid.sh
(2)source命令
作用:不产生新shell,忽略脚本的权限,在当前环境下直接执行脚本。
source由于不产生新shell,第一种会产生新的shell
执行结果会影响当前的shell,所以我们经常使用source来设置当前的shell环境
#!/bin/bash
echo $$ #获得当前bash的进程号
运行时的结果:
3.shell语句的条件判断
(1)如何判断大小
#:整数比较
-eq 判断相等 -ne 判断不相等
-gt 大于 -ge大于等于
-lt 小于 -le小于等于
#:字符串比较
== != =
字符串比较建议两端加"" 或者 -z
(2)if/then/else /elif/else
if[ command ]; then #[]表示条件测试,特别注意在 '['的后面和']'的前面要加上空格
符合该条件执行的语句
elif[ command ]; then #记住和C语言的else if区别开来
符合该条件执行的语句
else
符合该条件执行的语句
fi
#最后不要忘了if和fi要配套使用类似C语言中一个作用域的意思
测试脚本
#!/bin/bash
#a=0 #shell的注释符为#,因为shell为弱类型,所以不用指定变量的类型
#a=1
a=-1
if [ $a -eq 0 ];then
echo "a=0"
elif [ $a -lt 0 ];then
echo "a<0"
else
echo "a>0"
fi
测试用例:
4.循环语句
(1)for/do/done
for 变量 in 列表
do
循环体
done
for命令会遍历列表中的每一个值,并且在遍历完成后退出循环。
或者
for ((...; ...; ...;))#直接类C风格的循环语句,简单粗暴
测试脚本
#!/bin/bash
echo "遵循shell语法版本"
for i in {1..4}
do
echo "val is : $i"
done
echo "类C风格版本"
for ((i=1;i<=4;i++))
do
echo "val is : $i"
done
(2)while/do/done
while和C语言学的差不多,只要条件成立就执行循环体
测试代码:
#!/bin/bash
val=5
while [ $val -lt 7 ]
do
echo "val is: $val"
# val=$(($val+1)) #或者写成下面这种形式
let val++
done
运行结果:
(3)until/do/done
注意until的条件是满足就不运行,不满足就一直运行
#!/bin/bash
val=5
until [ $val -eq 10 ]
do
echo "val is: $val"
val=$(($val+1)) #或者写成下面这种形式
# let val++
done
shell中变量自增的几种方法
1. let i += 1;
2. ((i++));
3. i = $[$i + 1];
4. i = $(($i + 1))
5.数组
数组的测试用例:
#!/bin/bash
arr=(0 1 2 3 4) #定义一个数组 数组名=(值1 值2 值3 ... 值n)
#或者
a[0]=12
a[1]=23
a[2]=34
echo "读取arr数组第一个元素"
echo ${arr[0]} #读取数组采用${数组名[下标]}
echo "读取a数组中的所有元素"
echo "${a[@]}" #使用@符号可以获取数组的所有元素
echo "改变a数组的第三个位置数据的值"
a[2]=13
for ((i=0;i<${#a[@]};i++))
do
echo "a[$i]=${a[$i]}"
done
echo "获得arr数组长度的两种方法"
echo "length=${#arr[@]}"
echo "length=${#arr[*]}"
测试结果:
6.Shell脚本实现Hill排序的过程
#!/bin/bash
arr=(0 8 9 7 4 5 -1)
n=${#arr[@]}
echo "未经过Hill排序的数组"
for ((k=0;k<n;k++))
do
echo "arr[$k]=${arr[$k]}"
done
gap=$n
while [ $gap -gt 1 ]
do
let gap=$gap/3+1
for ((i=0;i<n-gap;i++))#类C风格的for循环加C风格之外加()即可
do
end=$i
temp=${arr[$end+$gap]}
for ((; end >= 0; end=end-gap))
do
if [ $temp -gt ${arr[$end]} ]
then
break
else
arr[$end+$gap]=${arr[$end]}
fi
done
arr[$end+$gap]=$temp
done
done
j=0
echo "经过Hil排序之后的数组形式"
while [ $j -lt ${#arr[@]} ]
do
echo "arr[$j]=${arr[$j]}"
let j++
done
测试结果: