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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值