linux学习笔记 shell

一、了解shell

  • bash 是shell的一种
  • shell是一个用c编写的程序,它位于内核和应用程序之间。
  • shell是一种应用程序,用户通过这个界面访问操作系统内核的服务
  • 运行shell脚本的两种方法

              1.作为可执行程序    将代码保存为 .bash 

              2.作为解释器参数    直接运行解释器 其参数就是shell 脚本  /bin/bash hello.bash (不需要再第一行指定解释器信息)


运行bash  shell的变量种类

  • 1.环境变量:环境变量会在当前shell和该shell的所有子shell中生效。如果把环境变量写入相应的配置文件中,那么该环境变量就会在所有的shell中生效。设置环境变量 export 变量名=变量值
  • 2.局部变量:在脚本或命令中定义,仅在当前shell实例中有效
  • 3.shell变量:shell变量是有shell程序设置的特殊变量,有一部分是局部变量 有一部分是环境变量
  • 4.位置变量:

    位置参数变量

    作用

    $n

    n为数字,$0代表命令本身,$1-$9代表第一至第九个参数,十以上的参数需要用大括号包含,如${10}

    $*

    代表命令行中所有的参数,$*把所有的参数看成一个整体

    $@

    也代表命令行中所有的参数,不过$@把每个参数区分对待

    $#

    代表命令行中所有参数的个数

    shift
    shift n

    :踢掉参数

    :踢掉n个参数,默认踢掉一个参数

 vim test.sh  #新建test.sh 文件
#test.sh 文件内容
         
#!/bin/sh    
echo $0
echo $1
 
 chmod 777 test.sh  #授权
 ./test.sh 1 2      #命令 执行test.sh
#执行结果
1
2
  • 5.特殊变量(内置)

预定义变量

作用

$?

shell中最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确

$$

当前进程的进程号(PID)

$!

后台运行的最后一个进程的进程号(PID)


二、sell变量


       1.定义变量

  •                    变量名和等号之间不能有空格    

  •                    首字符为字母

  •                    中间不能有空格,可以使用下划线

  •                    不能使用bash的关键字

  •                    变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型

  •                    如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令

       2.定义只读变量

  •                    在定义变量的基础上 
  •                    添加语句: readonly 变量名

       3.删除变量

  •                    使用 : unset 变量名

字符串

             定义 用单引号 或 双引号 或者不用引号

#!/bin/bash
p=2
a=not_quotation\\marks$psd            #无引号  识别变量和转义字符  但字符串中不允许出现空格
b='single \\quotation \n marks$p'      #单引号  单引号内的字符原样输出
c="double \"quotation\\ 'm'arks$pas"   #双引号  识别变量和转义字符  
echo $a "|"$b "|"$c
#结果
not_quotation\marks |single \\quotation \n marks$p |double "quotation\ 'm'arks

长度 

########字符串长度#####
n="abcdef"
echo ${#n}           #6
expr length $n       #6

字符串拼接 

#!/bin/bash
c="abcdef"
a="double"${c}          #字符串拼接   #doubleabcdef
s='single'${c}          #字符串拼接   #singleabcdef
  
a="double"c              #doublec

s='single'"123"          #single123
s=$a$c                   #doublecabcdef
                      
a="double",${c}        #double,abcdef
a="double" ${c}        #报错 字符串拼接之间的地方,不可以是空格 分号; 和/
n=not${c}                #字符串拼接
#总结
#####字符串拼接 可以是 字符串常量和字符串变量之间任意两个

字符串截取

#####截取字符串  ${str:start开始位置:lenght}
str=${n:2:5} 
echo ${#str} ${str}       #5 tabcd
str=${n:(-1):1}
echo ${#str}  ${str}      #1 f
str=${n:-1:0}
echo ${#str} ${str}      ##9 notabcdef   
str=${n:(-2):5}
echo ${#str}  ${str}      #2 ef
str=${n:1:2}
echo ${#str}  ${str}      #2 ot

str=${n::}                
echo ${#str}  ${str}      #0
str=${n::}
echo ${#str}  ${str}      #0
str=${n:2:}
echo ${#str}  ${str}      #0
str=${n::2}
echo ${#str}  ${str}      #2 no

n="abcdef"
str=${n:4:3} 
echo ${#str} ${str}  #3 ef ###ef和一个空格
#结论 
##### start length默认为0 
#####截取后的子字符串的长度不大于原字符串的长度
#####仅当start为负数时  不带括号时 无论length正负还是0 截取全部  (什么原因呢?)
#####带括号 -1表示倒数第一个字符,-2表倒数第二个字符
####### 当length>0 若表示的位置不合法 则结果为空格
#######当length<=0 则返回 空

###得到的子串的长度 
start>0    start+length<= 原串长度 则长度=length+1  否则 子串长度=原串长度-start+1
start<0   length<=原串长度  长度=length 否则为空或者 length
?为什么start>0 在原串末尾会得到空格  标识字符串结尾吗 那为什么 start<0 时超出末尾没有呢

选取子串

str="abcdef"
expr substr "$str" 1 3  # 从第一个位置开始取3个字符, abc
expr substr "$str" -2 5  #空

查找字符串

c="abcdef"                  #<expr index 内容 字符 >   作用:提取指定字符的下标
echo `expr index "$c" eb`   #2   查找e或b  eb之间不能有空格
echo `expr index "$c" b`    #2
echo `expr index "$c" e`    #5
echo `expr index "$c" z`    #0

expr  命令四则运算和字符串的操作。 使用乘号时,必须用反斜线屏蔽其特定含义

expr 10 \* 2    
20


 

猜你喜欢

转载自blog.csdn.net/y2052/article/details/81219969