Shell脚本学习笔记

变量的使用:

定义变量  variable=value  “=”两端不能有空格

使用变量   推荐加{}

e.g. skill=’Java’

   echo “I am a ${skill} engineer.”

只读变量: readonly url  不能修改

删除变量:unset 变量名           unset不能删除只读变量

单双引号的区别

‘’:原样输出,不解析其中的变量/命令,用于纯字符串

“”:双引号会解析命令和变量

如果变量的值是数字或者无空格的字符串,可以不加引号

 

将命令的结果赋值给变量 variable=‘command’或者$(command)

变量作用域

(1)局部变量:只在函数内起作用,但是在函数内的变量默认是全局的,除非用local声明

(2)全局变量:作用域为当前shell进程中

          在shell中定义的变量都是该类型

(3)环境变量:在子进程中也可以使用的变量

          用export声明,环境变量被创建时的shell进程称为父进程

          只传子不传父,必须是父子关系才可以传递环境变量,没有父子关系的不能传递环境变量

           使用exit一层层退出shell

(4)把变量写入shell的配置文件,则该变量在所有shell文件中都有效,无论是否有父子关系

特殊变量

特殊变量

$0

当前脚本的名称

$n

传递给脚本或者函数的位置参数

$#

传递给脚本或者函数的参数个数

$*

传递给脚本或者函数的所有参数

$@

传递给脚本或者函数的所有参数

$?

上个命令的退出状态,或者函数的返回值

$$

当前shell的进程ID

$n:当n大于10时,要用{}    e.g. $5,${10}

$*和$@不加双引号时完全相同,加了双引号就有不同

“$*”:将所有参数从整体上看作一份数据,不把每个参数看作一份数据

“$@”:将每个参数看作一份数据,彼此独立

字符串:

(1)获取字符串长度:${#字符串名}

(2)字符串拼接   

                 str=$str1$str2  或

                 str=”$str1:;$str2”  或

                 str=$str”:;”$str2

 (3)字符串截取

指定位置开始截取(截取方向都是从左往右):

1从左往右,从0开始计数,到start位置开始,截取长度为length的字符串     ${string:start:length}

 2从右往左,从1开始计数,到start位置开始,截取长度为length的字符串     ${string:0-start:length}

指定字符开始截取:

使用#截取右边字符,从左往右匹配${string#*chars}

使用%截取左边字符,从右往左匹配${string%chars*}

${string:start:length}

从字符串string左边的第 start个,向右截取length个字符

${string:start}

从字符串string左边的第 start个,向右直到最后

${string:0-start:length}

从字符串string右边的第 start个,向截取length个字符

${string:0-start}

从字符串string右边的第 start个,向右直到最后

${string#*chars}

从字符串string左边开始,第一次出现chars的位置开始,截取chars右边所有的字符(不包括chars)

${string##*chars}

从字符串string左边开始,最后一次出现chars的位置开始,截取chars右边所有的字符(不包括chars)

${string%chars*}

从字符串string右边开始,第一次出现chars的位置开始,截取chars左边所有的字符(不包括chars)

${string%%chars*}

从字符串string右边开始,最后一次出现chars的位置开始,截取chars左边所有的字符(不包括chars)

数组:

用()来定义,下标[]获取元素,从0开始编号,元素之间用空格分开

Array_name=(ele1 ele2 ele3 …)      等号两边不能有空格

不要求数组中的元素类型全部相同

数组长度不固定,还可以增加

无需逐个元素给数组赋值

e.g. ages=([3]=24 [5]=19 [10]=12)   只给第3、5、10个元素赋值,数组长度为3

(1)获取数组元素:${array_name[index]}

         获取所有元素:${array_name[*]}或者${array_name[@]}

                                用*/@,将数组扩展成列表,再计数

        获取数组的长度,即数组元素的个数:

                            ${#array_name[@]}或者${#array_name[*]}

如果数组的某个元素是字符串,还可获得字符串的长度:

e.g. 下标为2的元素是字符串,${#array_name[2]}

(2)数组拼接:

                          array_new=(${array1[@]  ${array2[@]})

                    或者   array_new=(${array1[*]  ${array2[*]})

(3)删除元素:

           删除指定下标的元素:unset array_name[index]

           删除整个数组:unset array_name

命令:

(1)别名

        定义别名:alias new_name=’command’

        删除别名:unalias 别名

                          unalias  -a 删除当前shell中的所有别名

(2)echo         

         echo 输出字符串,默认换行,不解析转义字符

         echo  -n 字符串    不换行

        echo  -e 字符串  解析字符串中的转义字符,仍默认换行

read命令

exit命令

declare和typeset  设置变量的属性

数学计算:

(())

用于整数计算,效率高

let

用于整数计算,和(())类似

$[ ]

用于整数计算,不如(())灵活

expr

用于整数计算,也可以处理字符串,麻烦

bc

Linux下的一个计算器程序,shell本身只支持整数运算,小数运算就要用bc

declare  -i

将变量定义为整数再运算,但仅支持最基本的加减乘除,

let 表达式 或者 let “表达式” 或者let ‘表达式’ 都等价于((表达式))

let 表达式1  表达式2    #多个表达式用空格隔开,整个命令的运行结果是最后一个表达式的结果

选择结构:if….else 和 case….in

(1)if….else

       if….else有4种形式:

(1) if   condition

      then

         statement(s)

      fi

(2)  if  condition;then

         statement(s)

       fi

(3)  if  condition

       then

           statement1(s)

      else

           statement2(s)

      fi

(4) if  condition

      then

           satement1(s)

      elif  condition2

      then

           satement2(s)

      .... 

     else

            satementn(s)

      fi

test命令可以对数值、字符串和文件 进行检测

    test expression 或  [  expression  ]                                # [空格expression空格],空格不能省

test命令中使用变量时,要用双引号“"包起来

[[ ]]:shell内置关键字

        使用:[[  expression  ]]            #表达式两边要有空格,[[ ]]命令不用双引号包变量,不用对>、<进行转义

 

test或[ ]

[[  ]]

[ -z”$str1” ] || [ -z”$str2” ]

[ -z”$str1” -o -z”$str2” ]

×

[[ -z”$str1” || -z”$str2” ]]

×

[[ ]]使用=~支持正则表达式

      [[ str=~regex ]]               e.g.[[ $telnumber=~^1[0~9]{10}$ ]]

使用 if 判断条件时,用(( ))来处理整型数字,用 [[ ]] 来处理字符串或者文件

(2)case....in

使用:       case expression in

                        pattern1)

                              statements1

                                   ;;               # 双分号,类似break

                        pattern2)

                              statements2

                                 ;;

                          ...

                              *)

                              statementsn

                esac

shell循环结构:while、until、for、select in、break、continue

whileuntilwhile和until的区别:

while  condition

do 

    statements

done

until condition

do

    statements

done

while:当条件为真,进入循环

until:当条件为真,退出循环

for循环有两种结构:

for((exp1;exp2;exp3))    #注意括号 (( ))

do

      statements

done

for value in value_list

do

     statements

done

用法同C/C++用法同Python

select ... in           常与case...in一起使用

用法:

            select variable in value_list

           do

                   statements

           done

 break 、continue用法同C/C++,但是在shell中,它还可以用参数n,表示跳出循环的层数,如果省略,表示跳出当前整个循环

break n                

continue n

shell函数

定义:

     function 函数名(){

         statements

      [ return value ]

}

直接调用函数名,也可以给函数传递位置参数:函数名  param1  param2....

shell中的函数可以先定义再调用,也可以先调用再定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值