通常不区分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 查看