shell脚本
shell语言定义的变量,数据类型默认都是字符串类型
在定义数据类型时,不用主动声明该类型
执行sh
./xx.sh # 使用“./”执行shell文件
基础语法
#! /bin/bash # shebang,表示使用bash解释器,同(/bin/sh)
history # 查看输入的历史命令
!! # 执行上一次执行的命令
!3000 # 执行id为3000的命令
echo $HISTSIZE # 输出最大记录历史命令数
a=1 # 定义一个值=1的变量a *变量和值之间不能出现空格
echo $a # 输出变量a的值
var=`ls` # 反引号 会编译成liunx命令
name="zhangsan"
${变量} # 返回变量值
> ${name} # zhangsan
${#变量} # 返回变量长度,字符长度
> ${#name} # 8
${变量:start} # 返回变量start数值之后的字符
> ${name:2}
${变量:start:length} # 提取start之后的lehgth限制的字符,字符串截取
> ${name:2:6}
${变量#word} # 从变量开头删除最短匹配的word子串
> ${name#zhang} # san
${变量##word} # 删除最长的
> ${name##an}
${变量%word} # 从后往前删
${变量%%word} #
${变量/pattern/string} # 替换第一个匹配的
${变量//pattern/string} # 替换所有
shell逻辑运算
shell的一些基础命令,只支持整数的运算
echo $((7>8)) # 双小括号运算0=false,1=true
echo $((12+10)) # 22
num=5
((num=num*3)) # 运算并赋值 15
####### if语句
if [ num>10 ]; then
echo ok
else
echo no
fi
if [ -f file ] # 如果文件存在
if [ -d ... ] # 如果目录存在
if [ -s file ] # 如果文件存在且非空
if [ -r file ] # 如果文件存在且可读
if [ -w file ] # 如果文件存在且可写
if [ -x file ] # 如果文件存在且可执行
if [ a -eq b ] # 如果a==b
if [ a -ne b ] # 如果a!=b
if [ a -ge b ] # 如果a>=b
if [ a -gt b ] # 如果a>b
if [ a -le b ] # 如果a<=b
if [ a -lt b ] # 如果a<b
if [ $a=$b ] # 如果字符串a==b
if [ $a!=$b ] # 如果字符串a!=b
if [ -n $a ] # 如果字符串a非空,返回0
if [ -z $a ] # 如果字符串a为空
if [ $a ] # 如果字符串a非空,返回0
if [ a -o b ] # 逻辑或相当于||
if [ a -a b ] # 逻辑于相当于&&
for循环
for var in i1,i2,i3
do
echo ${var}
done
for dir in `ls` # 遍历当前目录下所有文件及文件夹
do
echo ${dir}
done
字符串拼接
a="100"
b="200"
c="$a$b" # 100200
d="$a-$b" # 100-200
特殊变量
#########参数变量
$0 # 获取shell脚本文件名,以及路径
$n # 获取shell脚本的第n个参数
$# # 获取执行的shell脚本后面的参数总个数
$* # 获取shell脚本所有参数
$@ # 不加引号,效果同上,加引号,是接受所有参数为独立字符串
#########状态变量
$? # 上一次命令执行状态 0正确, 非0失败
$$ # 当前shell脚本的进程号
$! # 上衣次后台进程的pid
$_ # 再次执行上一次的命令,最后一个参数
bash基础内置命令
echo # 输出打印
eval # 执行多个命令
exec # 不创建子进程,执行后续命令,执行完后自动exit
export #
read #
shift #
变量的作用域
本地变量,针对shell进程的变量
全局变量,针对shell及其所有子进程的变量
局部变量,针对shell函数中定义的变量
每次调用basn/sh解释器执行脚本,都会开启一个子shell,因此不保存当前shell中定义的变量
如果使用source 执行脚本,将保存定义的变量