shell 学习(一)

#! 表示约定的标记,他会告诉系统这个脚本需要什么样的解释器来执行,即是一种脚本的体现。
#!/bin/bash 定义文件申明
  echo "hello world"
  ls -l ShellHello.sh 查看权限 -rwxr-xr-x
  chmod +x ./ShellHello.sh 修改文件权限
  ./ShellHello.sh 执行
  执行:./
表示命令用于输出文本信息:echo
输出变量:${}
查看权限:ls -l
修改文件权限:chmod +x ./文件名
# 注释 没有多注释
 
变量的定义:
  注意1:定义变量的时候,变量的名称不需要加$符号
  注意2:变量名和等号不能有空格(和一般语言不一样)
  注意3:变量名必须是字母 ( a-z A-Z)+下划线
  注意4:变量名中间不能有空格
  注意5:不允许使用标点符号
 
只读变量: 类似常量
  关键字:readonly 只读不能修改
 
删除变量
  语法:unset 
  案例 unset name
 
变量类型
  类型1:本地变量
  作用域整个bash进程可以使用
  语法:name="lsg"
类型2:局部变量
  作用域:当前代码段(修饰:local)
  local name="lsg2"
类型3:环境变量 -> 相当于静态变量
  作用域:当前shell进程以及子进程
  语法:export name="lsg3" [export 导出]
类型4:位置变量
  案例脚本代码:
  name=${0}
  age=${1}
  sex=${2}
  echo $name \n
  echo $age \n
  echo $sex \n
echo "姓名:${name} - 年龄:${age} - 性别:${sex}"
 
${0}表示脚本名称 所以不要用${0}这个变量
  参数从1开始
 
特殊变量
  ${0}->特殊变量->文件名称
  ${?}->表示返回上一个命令执行状态的返回值
  返回0表示执行成功
  返回1程序执行的结果
  返回2表示程序状态返回码(0-255)
  系统的预留错误 (1、2、127)
案例:
  sex=${3}
  echo ${?}
 不要加括号也可以
  $#->参数个数
  $*->参数列表
  $@->参数列表
  $$->获取当前shell进程ID
  $!->执行上一个指令PID
 $@和$*有区别
  echo $*
  echo $@
执行脚本
  ./ShellHello.sh lsg 200 男
  脚本结果
  ${*}->参数列表:将所有的参数组成一个字符串
  ${@}->参数列表:分开的->"lsg" 200 将参数一个一个分开
字符串:
  单引号 name='lsg' echo ${name}
  双引号 name="lsg" echo ${name}
字符串拼接
  第一中方式:
    naem="lsg"
    sex="男"
    info="${name}${sex}" 拼接
    echo $info
第二中方式:
    naem="lsg"
    sex="男"
    info="姓名"${name}" 性别:"${sex}" " 拼接
    echo $info
获取字符串长度 在变量名加# ->${#name}
    name="lsg"
    echo ${#name}
字符串截取
   语法:${变量名:开始位置:截取长度}
    案例一:
    name="i have Dreame"
    从字符串第三个开始截取,截取3个 截取的下标从0开始
    result=${name:2:3}
    echo ${result}
    案例二:
    从字符串第5开始截取,到最后一个结束
     方式1:
      name="i have Dreame"
      length=${#name}
      result=${name:2:length-1}
      echo ${result}
     方式2:
      name="i have Dreame"
      result=${name:5}
      echo ${result}
字符串删除
  语法1:${变量名#删除的字符串 正则表达式}
  作用:从字符串开头(左边)开始匹配要删除的字符
  案例1:匹配不到(错误)
    name="i have Dreame"
    result=${name#Dreame}
    echo ${result}
  案例2:从左到右 下面这个可以删除
    name="i have Dreame"
    result=${name#i}
    echo ${result}
  案例3:查找指定字符第一个,并且删除前面所有的字符包含自己
    name="i have Dreame"
    result=${name#*D}删除D 前面所有的字符包含自己 (从左到右匹配)
    echo ${result}
  案例4:指定删除的范围
    name="i have Dreame"
    result=${name#i*D} 从i到D包含D都删除了(从左到右匹配)
    echo ${result}
  语法2:${变量名##删除的字符串 正则表达式}
  作用:从开始删除指定的字符
  案例1:
    name="i have Dreame"
    result=${name##*m}删除m之前的所有的字符包含m(从开始到m)
    echo ${result}
  总结:语法1和语法2从左边删除到右边,查找方向不一样
  语法3:${变量名%删除的字符串 正则表达式}
  作用:从字符串结尾开始匹配,删除的字符串
  案例1:查找第一个字符
  代码1:查不到
    name="i have Dreame"
    result=${name%a}
    echo ${result}
  代码2:
    name="i have Dreame"
    result=${name%e}可以删除 执行结果:删除e
    echo ${result}
  案例2:查找指定字符第一个,并且删除前面所有字符(包含自己)
    name="i have Dreame"
    result=${name%h*}(用%h*删除*在右边->字符右边的包含自己都删除了。用#*h,也就是*在左边,字符左边的都被删除了包含自己)
    echo ${result}
  案例3:指定删除的范围
    name="i have Dream"
    result=${name%a*m}指定的范围必须是前面任意一个字符到最后字符 ,否则向${name%h*e}这种不起作用
    echo ${result}
  语法4:${变量名%%删除的字符串 正则表达式}
  案例1:查找指定字符的最后一个,并且删除前面所有的字符(包含自己)
  name="i have Dream"
  result=${name%%a*}字符串里面有多个相同的字符就比如变量name里面的a 如果你用%%a*你就是从左到右删除,执行结果为(i h),如果%a*这样从右匹配,结果:(i   have Dre)
  echo ${result}
 
总结:
从左边删除到右边
#->表示查询方向从左到右
##->表示查询方向从右到左
从右边删除到左边
%->表示查询方向从右到左
%%->表示查询方向从左到右
替换字符串
str="apple, tree, apple tree apple"
echo ${str/apple/APPLE} # 替换第一次出现的apple
echo ${str//apple/APPLE} # 替换所有apple
echo ${str/#apple/APPLE} # 如果字符串str以apple开头,则用APPLE替换它
echo ${str/%apple/APPLE} # 如果字符串str以apple结尾,则用APPLE替换它
posted @ 2018-09-10 17:02  FreeBreath_stack  阅读(84)  评论(0编辑  收藏  举报