zoukankan      html  css  js  c++  java
  • Shell基础

    通常不区分sh和bash,#!/bin/sh同样也可以改为 #!/bin/bash

    #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

    echo 命令用于向窗口输出文本

    执行shell脚本的两种方法:

      1.作为可执行程序 

        chomd +x ./test.sh #使脚本具有执行权限

        ./test.sh #执行脚本,注意加上./,告诉系统在当前目录查找,否则系统会去PATH路径查找

      2、作为解释器参数

        直接运行解释器,其参数就是 shell 脚本的文件名,/bin/sh test.sh

    shell变量:

      my_name="amm"

      使用定义过的变量,在变量名前加上$  echo ${my_name}

      使用 readonly 命令可以将变量定义为只读变量  readonly my_name

      unset删除变量

      对于字符串,单引号忽略包含的变量名,按字面输出,双引号可以有变量和转义符  str="hello, my name is "$my_name"! "

      获取字符串长度  echo ${#my_name}

      提取子串  echo ${my_name:1:4}

      截取字符串  ${my_name#*/},从左边开始删除第一个/的左边,保留右边,##表示删除所有/的左边,%和%%相反,从右边开始,删除右边

      数组,shell只支持一维数组  array_name=(value0 value1 value2 value3)

      可以单独定义数组的各个分量  array[0]=1

      获取数组元素  ${array[0]}

      获取数组元素个数  len=${#array[@]}或者len=${#array[*]}

      获取数组所有元素  ${#array[@]}或者len=${#array[*]}

      获取数组单个元素长度  len=${#array[0]}

    shell参数:

      $0:执行的文件名

      $1:运行脚本时传递的第一个参数

      $#:传递给脚本的参数个数

      $*:以一个字符串显示所有向脚本传递的参数,如果$*被双引号抱起来,则显示的字符串也有双引号

      $$:脚本运行的当前进程ID号

      $!:后台运行的最后一个进行的ID号

      $@:与$*类似,但按多个字符串显示参数

      $-:显示shell使用的当前选项,与set命令功能相同

      $?:显示最后命令的退出状态,0表示没有错误,其他都表示有错误

    shell运算符:

      原生bash不支持简单的数学运算,可以用其他命令实现,例如awk和expr,expr最常用

      expr时一款表达式计算工具,用来完成表达式求值操作

      val=`expr 2 + 2` #val为4,注意使用的是反引号`,表达式和运算符之间要有空格

      变量运算:`expr $a + $b`  `expr [$a == $b]` #返回布尔值,条件表达式要放在方括号之间,且有空格

      特殊:*乘号前必须要加转义

      关系运算符只支持数字,不支持字符串,除非字符串的值是数字,运算符前后也得有空格

      -eq 是否相等 equal

      -ne 是否不相等 not equal

      -gt 是否左边大于右边 greater than

      -lt 是否左边小于右边 less than

      -ge 是否左边大于等于右边 greater than or equal

      -le是否左边小于等于右边 less than or equal

      !非运算

      -o或运算

      -a与运算

      &&逻辑与

      ||逻辑或

      -z检测字符串长度是否为0,0则true

      -n检测字符串长度是否不为0,不位0则true

      str检测字符串是否为空,不空则true

      -b检测文件是否是块设备文件

      -c检测文胸是否是字符设备文件

      -d检测文件是否是目录

      -f检测文件是否是普通文件(既不是目录,也不是设备文件)

      -g检测文件是否设置了SGID位

      -k检测文件是否设置了粘着位(Sticky Bit)

      -p检测文件是否有名管道

      -u检测文件是否设置了SUID位

      -r检测文件是否可读

      -w检测文件是否可写

      -x检测文件是否可执行

      -s检测文件是否为空(文件大小是否大于0)

      -e检测文件(包括目录)是否存在

    shell函数

      定义格式:functionname(){...}

      返回值,有return情况为return返回的,没有则为函数最后一条命令运行结果

      返回值在调用该函数后通过$?获得

      通过$n得形式获取参数,n大于9时要用{n},functionname 1 2 3

    shell输入输出重定向

      command > file 将输出重定向到 file

      command < file 将输入重定向到 file

      command >> file 将输出以追加的方式重定向到 file

      n > file 将文件描述符为 n 的文件重定向到 file

      n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file

      n >& m 将输出文件 m 和 n 合并

      n <& m 将输入文件 m 和 n 合并

      << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入

    shell文件包含

      通过. filename或者source filename形式引入外部文件

      被包含的文件不需要执行权限

    其他命令

    set去追踪一段代码的显示情况,执行后在整个脚本有效

    set -x 开启 

    set +x关闭

    set -o 查看

    sh -x 调试脚本

    cp file1 file2

    如果file2不存在,就先创建 file2 ,然后把 file1 内容复制到 file2 中

    如果 file2 存在,把把 file1 的内容覆盖 file2 的内容

    cp -i file1 file2

    参数 -i 可以提示是否覆盖 file2

    参数 -n 让复制命令不覆盖 file2 的内容

    参数 -r 递归复制

    sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

    sed -i 's/book/books/g' file

    -i表示直接编辑文件,s是替换指定字符,g表示行内全面替换,把file文件中每一行的第一个book替换为books

    tar打包命令

    -c 建立压缩命令

    -x 建立解压命令

    -t 查看

  • 相关阅读:
    ASP.NET 高级编程基础第七篇—开发原则2
    反垃圾邮件引发的Email格式变异!
    .NET框架程序设计生成,打包,部署及管理应用程序与类型(2:Assembly的生成以及版本信息)
    .NET框架程序设计NET框架开发平台的体系架构概览(FCL,CTS,CLS)
    .NET框架程序设计生成,打包,部署及管理应用程序与类型(1:程序集的PE格式)
    [电影]蝴蝶效应
    .NET框架程序设计.NET框架开发平台的体系架构概览(.NET程序本质)
    [转贴]浅析.NET Framework对PE文件格式的扩展
    [MSDN今日讲座]Whidbey 开发系列讲座二:Visual Studio 2005团对开发系统简介
    郁闷!我的Gmail邮箱的问题!
  • 原文地址:https://www.cnblogs.com/zawjdbb/p/8494470.html
Copyright © 2011-2022 走看看