shell学习笔记

(1)、shell的语法特性

    shell是一种解释型的脚本语言,通过它可以直接调用linux的命令来与linux交互;

    需要注意,shell里面处理运算符号左右可以输入空格之外,进行行对齐等代码格式调整的时候,不要使用空格而是使用tab来控制缩进等,空格也会被bash当前命令处理,会报错;

(2)、shell与Java语言的对比;

    1、shell是一种弱类型的语言,变量没有主动的类型声明;

    2、shell的代码没有类似于java的{}和;来进行分隔的用法,关键字与其他代码之间必须有空格,代码相对简洁,但是可读性较差,举例 if 的写法如下;

    shell:    

        if [ $a == $b ]
        then
                 echo "a==b"
        fi

    Java:

        if( a == b){

                 System.out.println( "a==b");

        }

    3、shell没有像Java里面的比如网络、文件等,而且通过Linux的系统命令来控制,所以学习shell要熟知Linux的命令;

(3)、shell基本语法;

    1、变量的定义与使用(需要注意=号左右都不能有空格):

        word="Hello,World"

        echo "the word is ${word}"

    2、shell里面的基本类型:

        数字:

             shell里面的数字使用部分整数、浮点数,但是需要注意的是常用的bc、expr、let三种计算方法,其中最常用的expr只能用于整数的计算,具体他们的用法见[shell里面的运算符]章节;

        字符串:

            字符串的写法有两种:

                单引号(单引号里面的内容会原样输出,转移字符、变量等无效):'my name is ${name}',输出my name is ${name}

                双引号:"my name is${name}",输出my name is zhangsan

            与字符串有关的操作:

                获取字符串长度(Java : str.length()):${#str}

                截取字符串(Java : str.substring(2,7)):#{str:3:5},从第三个元素开始截取5个长度的子字符串;

                获取字符下标(Java : str.indexOf("h")):

                判断是否包含子字符串(Java : str.contains("h")):

        数组:

            shell里面的数组初始化不需要定义长度,其长度可变,里面的元素类型不需要一致,目前只支持一维数组;

            数组的定义(元素之间空格分开):arr_names=("zhangsan" "lisi" "wangwu")

            数组的使用:${arr_names[0]}

            数组的常用操作:

                获取数组的所有元素:${arr_names[*]}

                获取数组的长度:${#arr_names[*]}

                获取数组中的第n个元素:${arr_names[n-1]}

                删除数组中的第n个元素:unset arr_names[n-1](注意只是把n-1下标对应的数据置为空值,它的下标依然存在)

    3、shell里面的运算符:

        算术运算符:

类型 用法 举例 是否支持复合运算 备注
expr命令   score=`expr 88 + 99` +号左右必须有空格
let命令   let score=88+99

+号左右不能有空格;

如果要加空格,则必须使用双引号包裹运算

$[]方式   score=$[88+99]  
$(())方式   score=$((88+99))  

        关系运算符:

类型 含义 举例 快速记忆
-eq 等于 [ ${a} -eq ${b}] equals
-ne 不等于 同上 not equals
-lt 小于 同上 less than
-gt 大于 同上 greater than
-le 小于等于 同上 less or equals
-ge 大于等于 同上 greater or equals

 

 

 

 

 

 

 

 

        逻辑运算符:

类型 含义 举例 快速记忆
! 取反 [ !false ]   
-o 逻辑或 [ ${a} -eq ${b} -o ${c} -eq ${d} ] or
-a 逻辑与 [ ${a} -eq ${b} -o ${c} -eq ${d} ] and
&& 逻辑与 [[ ${a} -eq ${b} -o ${c} -eq ${d} ]]  
|| 逻辑或 [[ ${a} -eq ${b} -o ${c} -eq ${d} ]]  

        需要注意后面两种是用[[]]包裹的,这种写法跟[]的区别,后面再细说;

 

 

 

 

 

        字符串运算符:

类型 含义 举例 快速记忆
= 比较等于 [ ${a} = ${b}]  
!= 比较不等于 [ $[a] != ${b}]  
-z 长度是否为0 [ -z str ] zero
-n 长度是否不为0 [ -n str ] not zero
str 字符串是否为空 [ str ]  

    4、shell里面的流程控制:

类型 用法 示例 备注
if

if condition

then

     command

fi

if [ ${a} -eq ${b} ]

then

        echo 'a is equals b'

 

fi

 
while

while condition

do

     command

done

count=10

 while [ ${count} -gt 0 ]
do
       count=`expr ${count} - 1`
       echo "count is ${count}"
 done

 
for

for var in arr

do

  command

done

写法1:

for name in "zhangsan" "lisi" "wangwu"
do
           echo "he name is ${name}"
done

写法2:

for((i=0;i<10;i++))

do

           echo "${i}"

done

 
case

case 值 in

   value) 

        command;;

esac

case ${count} in
     3)
           echo "you choose is 3";;
     2)
           echo "you choose is 2";;
     1)
           echo "you choose is 1";;
     0)
           echo "you choose is 0";;
esac

注意每项匹配后面是跟的两个分号;

结尾字符是case倒过来写的

continue 与Java完全一致    
break 与Java完全一致    

    5、shell里面的函数定义以及使用:

        函数的定义:

            有两种方式,两种方式没有任何区别:另外函数参数的传递不会写到括号里面,这点与Java差别很大;

                function myFunction(){

                    echo "this function is being invoke"

                }

                myFunction(){

                    echo "this function is being invoke"

                }

        函数的传参与函数的调用:

            shell里面函数的参数是在调用函数的时候传递,函数里面通过${n}来获取从1开始的第n个参数

            调用的格式:functionName param1 param2 param3 .....

                举例:

                    function countScore(){

                        score=`expr ${1} + ${2}`

                        echo "score is ${score}"

                    }

                    countScore 99 77

        函数的中途退出:

            使用return 提前退出;return后面可以不跟参数,如果跟了则代表函数返回值,需要注意的是,return只能返回数字

        函数的返回值:

            当函数返回数字的时候,只能返回0-255之间的值,超过则会重新充0开始计算,最终返回的是n%256;

            如果显式的使用return的话,则函数返回return后面跟的内容;如果没有return,函数的返回值则是程序执行的最后一行代码的结果,两种方式都只能返回数字;

            举例如下:

                    function countScore(){

                        `expr ${1} + ${2}`

                    }

                    countScore 99 77

                    echo "countScore return is $?"

            以上方法都只能返回数字,如果想在函数中返回字符串的话,需要使用以下两种方式:

            全局变量:

                    str=""

                    function getStr(){

                        str=""

                    }

                    getStr

                    echo "${str}"

            把shell函数作为子程序调用,将其结果写到子程序的标准输出:

                    function getStr(){

                        echo ""

                    }

                    str=$(getStr)

                    echo ${str}

    6、shell接收脚本输入的参数:

        这里的写法跟函数那里非常类似,

        传递参数:./train.sh hello world

        使用参数:echo "${1} ${2}"

    7、shell里面各种括号的用法:

        ():

            1

        {}:

            1

        []:

            1

        (()):

            1

        {{}}:

            1

你可能感兴趣的:(Linux学习总结)