Fabric01-1

2019-04-22  本文已影响0人  刘岩2019

一:shell脚本基础

1.shell命令 : 在linux终端能够被解析出来的命令
2.shell脚本 : 多个shell命令的集合, 逻辑判断, 循环, 函数, 变量

二:shell命令被解析的过程:

1.有一个解析命令的进程: bash(linux)/shell(unix)
2.bash解析过程, 监测终端输入, 有回车的时候输入完成, bash检测环境变量PATH (有多个路径), bash从前往后依次遍历每个路径, 检测各个路径中有没有用户输入的命令, 如果找到了, 执行该路径下的命令, 如果没找到找下一个, 最后还是没找到, 提示这个命令无法解析

三:shell脚本的基本格式:

1.命名格式
shell脚本是一个文件, 命令方式: xxx.sh
.sh的后缀不是必须的, 目的是为了方便识别

2.书写格式
(1).第一行是固定的, 指定解析脚本内容使用的命令解析器:#! /bin/bash (指令使用的命令解析器是bash), 这行可以省略
(2).后边就是shell命令, 变量定义, 函数调用, 逻辑判断循环

四:shell脚本的执行

1.文件访问者:
拥有者u——-user
所属组g——-group
其他用户o—–other

2.文件访问权限的种类:
可读(r) 可写(w) 可执行(x)

3.目录初始默认权限为 : 775(八进制), 111 111 101(二进制),-rwxrwxr-x 1 root root
文件初始默认权限为: 644(八进制), 110 110 100(二进制),-rw-rw-r-- 1 root root

脚本文件需要执行权限:
chmod u+x xxx.sh //u:当前文件所有者 + x执行权限
chmod a+x xxx.sh //a:当前文件所有者所有组的人 + x执行权限
chmod 777 xxx.sh

4.脚本文件的执行
./xxx.sh 和执行可执行程序一样,最常用
sh xxx.sh 也可以执行xxx.sh脚本

五:shell脚本中的变量

echo shell命令:表示输出

1.普通变量(本地变量)
//变量名=变量值  (默认字符串类型)
hello=123
//在shell中定义变量的时候, 必须初始化,=前后不能有空格,普通变量名小写

2.环境变量(一般大写)
//export 环境变量名=值 或 set 环境变量名=值
export GOROOT=/usr/local/go
export GOROOT=$HOME/go
//环境变量在全局范围内都可以使用
3.位置变量和特殊变量

在执行脚本文件的时候, 可以进行参数传递, 在脚本内部需要接收这些参数, 这时候需要用到位置变量

$0:脚本的名字
$1:给shell脚本传递的第一个参数,
$2:给shell脚本传递的第二个参数,以此类推

$#:   给shell脚本传递的参数的个数
$@: 给shell脚本传递的所有参数的集合
$$:  shell脚本开始执行,产生的进程ID
$?:  进程执行状态(在脚本中没法体现,因为需要进程执行完,才能查看进程执行状态),脚本执行完成后,在命令行中查看
- 0     表示成功
- 非0  表示失败

编写脚本文件:vi position.sh

脚本代码:


#! /bin/bash

ls
echo "脚本的名字 = " $0
echo "第1个参数 = " $1
echo "第2个参数 = " $2
echo "第3个参数 = " $3
echo "第4个参数 = " $4
echo "第5个参数 = " $5

echo "参数的个数: " $#
echo "所有的参数: " $@
echo "脚本执行之后的进程ID: " $$


执行脚本,并传递参数以及执行结果:


image.png
4.取值

(1)取普通变量的值

$变量名
${变量名}
1.JPG

(2)取命令执行之后的结果值

str=$(shell命令)
str=`shell命令`
1.JPG
5.引号的使用

(1)双引号:加双引号和不加是一样的
如果是字符串, 原样输出
如果是待解析的指令, 会将其解析

(2)单引号:
如果是字符串, 原样输出
如果是待解析的指令, 不会解析, 原样输出

6.shell脚本中的if条件判断

注意事项:
if和[]之间有空格
[]和条件判断前后有空格

if [ 条件判断 ];then
    处理指令(shell命令)
fi

if [ 条件判断 ]
then
    处理指令(shell命令)
fi

if [ 条件判断 ];then
    处理指令(shell命令)
elif [ 条件判断 ];then
    处理指令(shell命令)
else
    处理指令(shell命令)
fi

shell条件测试参考:

1.JPG 2.JPG

例:给脚本传参, 文件名, 在脚本中判断这文件名对一个的文件是普通文件还是目录

#! /bin/bash

# 取出文件名
filename=$1
# 判断
if [ -d $filename ];then        //当pathname 存在并且是一个目录时返回真

    echo "$filename 是一个目录!"   
elif [ -s $filename ];then     //当filename 存在并且文件大小大于0 时返回真
    echo "$filename 存在!!!"
else
    echo "$filename 不存在, 或者文件为空"
fi

结果:


1.JPG
7.shell脚本中的for循环

语法: for 变量名 in 列表;do ... done

for num in 123 345 22 33 44 55;do
    echo "$num"
done

for dir in $(ls);do
    echo "$dir"
done
# 脚本内容
#! /bin/bash
# 遍历当前目录
for dir in `ls`;do
    echo $dir
done

# 遍历传递进来的参数
for arg in $@;do
    echo $arg
done

结果:


1.JPG
8.shell脚本中的函数

没有函数修饰符, 没参数, 没有返回值
没有参数但是可以传参数, 在函数内部取参数使用的是位置变量
可以得到返回值, 表示的函数的执行状态, 0或非0
0 -> 成功
非0 -> 调用有问题

  1. 函数定义, 定义完成, 函数体不会执行, 必须被调用
myfunc()
{
    函数体
    shell指令(for循环, if语句等)
}

2.函数调用

函数名 [参1 参数2 参数3]
myfunc 11 22 33

例子代码:

# 写个函数判断传递进去的文件名是不是目录, 如果存在什么也不干, 不存在, 创建
#! /bin/bash
# 定义函数
myfunc()
{
    # 遍历接收到的所有文件名
    for name in $@;do
        # 文件类型判断
        if [ -d $name ];then
            echo $name 是一个目录!
        else
            # 创建目录
            mkdir $name
            # 判断目录是不是创建成功了
            if [ $? -ne 0 ];then
                echo "目录创建失败: $name"
            else
                echo " $name 创建成功..."
            fi
        fi
    done
}

# 函数调用
myfunc a b c d e f g

结果:


1.JPG
上一篇下一篇

猜你喜欢

热点阅读