shell编程基础

(一)解释型语言
解释一行执行一行,比较灵活,但是效率会比编译型语言©低一点。
需要先新建、赋予执行权限
#!/bin/bash 指的是当前默认命令行的解释器bash
脚本的常用执行方式
(1)bash +相对/绝对路径/xxx.sh 在使用时往往不使用这种方式
(2)使用绝对/相对路径执行脚本,需要chmod +x xx.sh 赋予可执行权限。
(3)子在脚本的路径前面使用. 或者source命令。如.+空格 xxx.sh source xxx.sh
第一3种方式是单独的使用了一个bash命令的进程,从而进行了脚本的解析。
第二种方式是用当前的bash环境去执行这个脚本,所以也需要有可执行权限。
第三种方法是用的点命令和source命令,直接执行当前环境shell命令,前两种方式都是相当于打开一个子shell去执行,这样容易造成环境变量获取不到,而用这个命令就不会造成这个现象。
开子shell和不开子shell的区别在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。
使用ps -f 查看是否进入子shell
exit 退出子shell
(二)变量
可分为系统预定义变量和自定义变量,也可以分为全局和局部。也可以分分乳如下。
(1)系统预定义变量
1.常用系统变量
$HOME $PWD $SHELL $USER
env 查看系统
set 查看所有变量,是所有的,包括全局和局部、自定义和系统定义。
(2)自定义变量
赋值时等号两边不能有空格。
使用export将局部变量导出升为全局变量。
1.只读变量
只能读不能写,使用readonly定义
2.撤销变量,使用unset 变量名,只读变量不能unset
(3)特殊变量

  1. $n
    n为数字,$0代表该脚本名称,$1- 9 代 表 第 一 个 到 第 九 个 参 数 , 十 个 以 上 的 参 数 需 要 用 大 括 号 表 示 , 如 9 代表第一个到第九个参数,十个以上的参数需要用大括号表示,如 9{10}
  2. $#
    获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性。
  3. $* $@
    ∗ 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * 这个变量代表命令行中所有的参数, *把所有的参数看成一个整体。
    @ 作 用 和 前 者 一 致 , 只 不 过 这 个 把 每 个 参 数 区 别 对 待 。 4. @ 作用和前者一致,只不过这个把每个参数区别对待。 4. @4.?
    最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行。如果这个变量的值为非0,证明上一个命令执行不正确。
    (三)运算符
    (1)普通运算符
    expr 1 + 2 将1和2当作参数传进去
    expr 5 * 2 将乘号转义
    在shell为了简化,使用 ( ( ) ) 或 者 (()) 或者 (())[]
    a= ( ( 1 + 2 ) ) 命 令 替 换 a = ((1+2)) 命令替换 a= ((1+2))a=(命令a) 将命令a的结果赋值给a
    也可以使用 a= 命令a 来赋值
    输出键盘输入的两个参数的和
    sum = $($1+$2)
    echo $sum
    (2)判断
    test 表达式,如果正确为真,错误为假,使用echo $? 正确返回0
    a=hello
    test $a = hello
    echo $? 这里为真 返回0
    使用[ $a = hello ]可以等价替代test,前括号后面空格 后括号前面空格 等号前后空格。
    (3)常用判断条件
    1.两个整数之间的比较
    -eq 等于(equal) -ne 不等于(not equal)
    -lt 小于(less than)-le 小于等于(less equal)
    -gt 大于 (greater than) -ge 大于等于(greater equal)
    如果是字符串之间的比较,用等号判断相等,用!= 判断不等。
  4. 按照文件权限进行判断
    -r 判断文件是否有读的权限
    -w 有些的权限
    -x 有执行的权限
    [ -r hello.sh ]
    5.按照文件类型进行判断
    -e 文件存在
    -f 文件存在且是一个常规的文件(file)
    -d 文件存在且是一个目录(directory)
    [-e /home/info]
    6.多条件判断
    && 表示前一条命令执行成功时,才执行后一条命令,||表示上一个命令执行失败后,才执行下一条命令。
    [] && []. => [xxx. -a xxxx ]
    [] || [] => [xxx -o xxxx ]
    (四)流程控制
    1.if 判断
    (1)单分支
    if [条件表达式];then
    程序
    fi
    或者
    if [ 条件判断式]
    then
    程序
    fi
    (2)双分支
    if []
    then
    程序
    else
    程序
    fi
    (3)多分支
    if []
    then
    程序
    elif []
    then
    程序
    else
    程序
    fi
    2.case语句
    case $变量名 in
    “值1”)
    如果变量的值等于值1,则执行程序1
    ;;
    “值2”)
    如果变量的值等于值2,则执行程序2
    ;;
    …省略其他分支
    *)
    如果变量的值都不是以上的值,则执行此程序。
    ;;
    esac
    注意事项:
    (1)case行尾必须为单词 in,每一个模式匹配必须以右括号结束。
    (2)双分号“;;” 表示命令序列结束,相当于jaca中的break。
    (3)最后的 *)表示为默认模式,相当于java中的default。
    3.for循环
    (1)
    for((初始值;循环控制条件;变量变化))
    do
    程序
    done
    (2)增强for循环
    for 变量 in 值1 值2 值3·····
    do
    程序
    done
    $*把所有的参数看成一个整体
    @ 把 所 有 的 参 数 区 别 对 待 。 在 s h e l l 中 如 果 不 把 这 两 个 用 引 号 引 起 来 , 效 果 是 一 样 的 , 用 双 引 号 引 起 的 来 话 会 有 不 同 的 效 果 , @把所有的参数区别对待。 在shell中如果不把这两个用引号引起来,效果是一样的,用双引号引起的来话会有不同的效果, @shell*会把列表看成一个整体,是一个元素。
    4.while循环
    while []
    do
    程序
    done
    (五) read 读取控制台的输入
    (1)基本语法
    read (选项) (参数)
    选项:
    -p 指定读取时的提示符
    -t 指定读取时等待饿时间(s) 如果-t不加就会一直等待。
    参数:
    变量: 指定读取值的变量名

(六) 函数
(1)自定义函数
[function] funname[()]
{

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜大大的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值