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 查看

原文地址:https://www.cnblogs.com/zawjdbb/p/8494470.html