's Blog

Shell脚本学习

  • operation
    bash a.sh [参数直接添加]
  • 引申
    • [` `]倒引号,被括起来表示是需要执行的命令
    • [" "]双引号,里面出现$(表示取变量名)、`(表示执行命令)、\(转义),其余的表示字符串
    • [' ']单引号,里面所有的都表示字符串,包括特殊字符
  • linux 不挂断执行shell
    # nohup命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
    nohup command &
    # nohup 和 &的区别
    nohup # 不挂断的运行,单独的nohup没有后台运行的意思。
    & # 在后台运行  当用户退出或者挂起的时候,命令跟着退出
      
  • 字符串截取操作汇总
    # ${status}* 匹配result字符串中以status变量为开头的子字符串,同时匹配这个开头后面的任意字符(包括空字符)。
    # % 表示从result结尾处执行截取操作,删除最短匹配{status}*的子串,并返回剩余的部分。如果没有匹配到,则返回原字符串。
    # 例 $result 的值为 hello-world, status的值为‘world‘,则‘{result%${status}}的值为hello-,因为在 $result 中,匹配 ${status}所得的最短子串为-world,将其删除后,剩下的字符串就是hello-`。
    code=${result%${status}*}

     

  • if-elif-else
    • 不含参
      # 查看当前目录是否存在a.sh文件
      if ls -l a.sh; then
        echo "ls return true"
      elif [ 表达式 ]
      then 
        echo "..."
      else 
        echo "ls return false"
      fi
        echo "all"
    • 含参数
      # 字符串比较 =或者==
      # 运算符两边要有空格
      # 字符串两边要有空格,才会被解析
      # []内两边要有空格
      if [ "$1" = "me" ];then
       echo "You are female..."
      else
       echo "$1 is male..."
      fi
    • 字符串比较:==、=、!=
    • 整数比较:
      -lt # 小于
      -le # 小于等于
      -gt # 大于
      -ge # 大于等于
      -eq # 等于
      -ne # 不等于
    •  逻辑判断:&&、||、!
  • for循环
    • # 可以使用数组变量替换 $array
      for num in 1 2 3 4 5 six
      do
       echo "num=$num"
      done
      
      for((num=1;num<7;num++))
      do
       echo "num=$num"
      done
    • # ${file%.*}
      for file in a.sh b.sh c do
          fname="${file%.*}"
          echo fname
  • while循环
    • $常量 
      while [ "$1" = "me" ];
      do
       echo "num=$1"
       break # 终止循环
      done
    • $变量
      i=7
      j=10
      while[ $i -lt $j ]
      do 
       echo "num1=$i,num2=$j"
       ((i++))# 单括号不被解析
      done
  • dirname、$0使用
    # dirname 指定脚本所在的路径
    # $0 当前脚本的名称(包括后缀名,默认带包路径)
    # `basename $0` 直接显示脚本名称,不带包路径
    # $(命令)返回该命令的结果
    dir=`dirname $0`
    echo $dir
  • 文件测试运算符
    # 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是则返回true
    -f filename 
    # 案例:
    if [ -f `dirname $0` ];then
     echo "common"
    else
     echo "not common"
  • $?使用
    # $?获取上一个命令的退出状态
    # 步骤1:
    exit 0
    
    # 步骤2:
    if [ $? == "0" ]
    then ...
  • ln -s使用
    # 软连接
    # ln -s 源文件 目标文件
    # 作用:
    # 1.为某一个文件在另外一个位置建立一个`副本`,`副本`并不占用内存。
    # 2.而且,`副本`内容和源文件是同步的。
    # 3.若目标文件不存在,自动帮你创建文件
    vi source.log
    ln -s source.log target.log
  • > 和 >>
    # > 创建
    # >> 追加
    echo 'hello shell' > out.txt
    # > 和 >> 都会默认创建out.txt
    # > 将字符串保存到out.txt中,当out.txt存在时,首先将原文件内容清空,再追加
    # >> 将字符串直接追加到文件的末尾
  • expr
    # expr实现数值运算、数值和字符串比较、字符串匹配、字符串提取、字符串长度计算等
    # expr 算术表达式优先级低于字符串表达式、高于逻辑关系表达式
    CNT=1
    CNT=`expr $CNT + 1`
  • 新建文件夹,如果文件夹名称出现^M或者?
    # 首先打开配置文件或者shell查看当前 文件的格式
    vi a.sh
    # 查看文件格式
    :set ff
    # fileformat=dos 表示是windows下的文件需要转化为linux文件
    # 修改文件格式为unix
    :set ff=unix # 或者 :set fileformat=unix
    # 直接保存退出即可
  • $$、$!、$?、$*、$@、$#、$0
    # $$ Shell本身的PID(ProcessID)
    
    # $! Shell最后运行的后台Process的PID
    
    # $? 前一次运行的命令的结束代码(返回值)
    
    # $* 所有参数列表。
    
    # $@ 所有参数列表。
    
    # $0 当前脚本的文件名
    
    # $1...$n 分别是第一个参数...第n个参数
  • 使用 "x",防止字符串比较出现语法错误
    # 如果不使用"x"当参数file为空字符串时,会出现 if[ == "0" ]的语法错误
    [[ "x"${file} = "x""file"]]
  • find
# find 在指定目录下查找文件
# 语法 find   path   -option   [   -print ]
# 搜索深度 -maxdepth 1  当前目录
# 搜索名字 -name *.zip  允许模糊查询
# 指定文件类型 -type f 一般文件
# 输出命令 printf 独立的命令 允许格式化字符串 可以手动添加换行符
find [目录] -maxdepth 1 -name "*.zip" -type f  -printf "%f\n"
  • windows->linux文件格式
# windows上传文件到linux存在格式问题
sed -i 's/\r//g' filename
  • 字符串操作符
    # -z	检测字符串长度是否为0,为0返回 true。
      if [ -z "$CSV_FILE" ]; then
        exit
      fi
    # -n	检测字符串长度是否不为 0,不为 0 返回 true。
      if [ -n "$CSV_FILE" ]; then
        exit
      fi
      
posted @ 2022-01-07 10:08  Limit℃  阅读(66)  评论(0)    收藏  举报