Shell学习笔记

来源:互联网 发布:网络键盘侠 编辑:程序博客网 时间:2024/06/05 14:35

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=1a=-1if [ $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循环体donefor命令会遍历列表中的每一个值,并且在遍历完成后退出循环。或者for ((...; ...; ...;))#直接类C风格的循环语句,简单粗暴

测试脚本
#!/bin/bashecho "遵循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/bashval=5while [ $val -lt 7 ] do    echo "val is: $val"   #  val=$(($val+1)) #或者写成下面这种形式    let val++ done

运行结果:


(3)until/do/done

注意until的条件是满足就不运行,不满足就一直运行
#!/bin/bashval=5until [ $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/basharr=(0 1 2 3 4)  #定义一个数组 数组名=(值1 值2 值3 ... 值n)#或者a[0]=12a[1]=23a[2]=34echo "读取arr数组第一个元素"echo ${arr[0]} #读取数组采用${数组名[下标]}echo "读取a数组中的所有元素"echo "${a[@]}" #使用@符号可以获取数组的所有元素echo "改变a数组的第三个位置数据的值"a[2]=13for ((i=0;i<${#a[@]};i++))do    echo "a[$i]=${a[$i]}"doneecho "获得arr数组长度的两种方法"echo "length=${#arr[@]}"echo "length=${#arr[*]}"

测试结果:



6.Shell脚本实现Hill排序的过程


#!/bin/basharr=(0 8 9 7 4 5 -1)n=${#arr[@]}echo "未经过Hill排序的数组"for ((k=0;k<n;k++))do    echo "arr[$k]=${arr[$k]}"donegap=$nwhile [ $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        donedonej=0echo "经过Hil排序之后的数组形式"while [ $j -lt ${#arr[@]} ]do    echo "arr[$j]=${arr[$j]}"       let j++done

测试结果:








原创粉丝点击