Linux运维第6天:Linux下shell编程

shell编程:


编译器,解释器


编程语言:机器语言,汇编语言,高级语言


静态语言:编译型语言
    强类型
    关键字
    事先转换成可执行格式
    C,C++,JAVA,C#
    
动态语言:解释性语言
    弱类型
    边解释边执行(on the fly)
    PHP,SHELL,python,perl
    
bash:脚本解释器


面向对象
面向过程


变量:内存空间,命名


内存:编址的存储单元


变量类型:事先确定数据的存储格式和长度
    字符
    数值
        整型
        浮点型
    
强类型:变量在使用前,必须事先声明,甚至还要初始化
弱类型:变量用时声明,甚至不区分类型


显式转换
隐式转换


bash变量类型:默认是字符串
    环境变量
    本地变量(局部变量)
    位置变量
    特殊变量


本地变量:
    VARNAME=VALUE:作用域为个整个bash进程
    local VARNAME=VALUE:作用域为当前代码段
    
环境变量:
    export VARNAME=VALUE
    export VARNAME
    
变量引用:${}


脚本执行时会启动一个子shell
    命令行中启动的脚本会继承当前shell环境变量
    系统自动执行的脚本(非命令行启动)就需要自我定义各环境变量
    


位置变量:
    $1,$2,$3,...
    
特殊变量:
    $?:上一个命令的执行状态返回值
    
程序执行返回值:
    结果
    返回代码
        0:正确
        1-255:错误
        
    /dev/null:软件设备,bit bucket,数据黑洞


撤消变量:
    unset VARNAME
    
查看当前shell变量 :set
查看当前shell环境变量:printenv,env,export


脚本:命令的堆砌


shebang:魔数
#!/bin/bash


#后面为注释


练习:写一个脚本,完成以下任务
    1.添加5个用户, user1,..., user5
    2.每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;
    3.每个用户添加完成后,都要显示用户某某已经成功添加;
    useradd user1
    echo "user1" | passwd --stdin user1 &> /dev/null
    echo "Add user1 successfully."


bash中的条件判断
条件测试类型:
    整数测试
    字符测试
    文件测试
条件测试的表达式:
    [expression](命令)
    [[expression]](关键字)
    test expression
    
整数比较:
    -eq:equal
    -ne:not equal
    -gt:greater than
    -lt:less than
    -ge:greater or equal
    -le:less or equal


命令的逻辑关系:
    与:&&        第一个条件成立时才执行第二个条件
    或:||        第一个条件不成立时才执行第二个条件
    
    command1 && command2 || command3
    command1执行正确时执行command2
    command1执行错误时执行command3
    
练习,写一个脚本,完成以下要求:
    1.添加3个用户user1, user2, user3;但要先判断用户是否存在,不存在而后再添加;
    2.添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
    3.最后显示当前系统上共有多少个用户;
    
练习,写一个脚本,完成以下要求:
给定一个用户:
    1.如果其UID为0,就显示此为管理员;
    2.否则,就显示其为普通用户;
    
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
   如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
   
练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
   如果有,就显示其中一个的用户名;否则,就显示没有这类用户;


练习:写一个脚本
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。


练习:写一个脚本
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为“good guy”;否则,就显示此用户为“bad guy”。
进一步要求:不使用id命令获得其id号;


练习:写一个脚本
给定一个用户,获取其密码警告期限;
而后判断用户密码使用期限是否已经小于警告期限;
    提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;
    
如果小于,则显示“Warning”;否则,就显示“OK”。


圆整:丢弃小数点后的所有内容


练习:写一个脚本
判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示“Some command will gone.”;否则显示“OK”。






条件判断,控制结构:
    
    if ...; then
        ...
        
    fi 
    
    if ...; then
        ...
    else
        ...
    fi
    
    if ...; then
        ...
    elif ...;then
        ...
    elif ...;then
        ...
    ...
    else
        ...
    fi
    


shell中算术运算:
    1.let 运算表达式
    2.$[运算表达式]
    3.$((运算表达式))
    4.expr 运算表达式  c=`expr $a + $b`
    
exit:退出脚本
    exit n
    如果脚本没有明确定义退出码,那么,最后执行的一条命令的退出码作为脚本退出码
    
文件测试:
    -e:exist
    -f:regular file
    -d:directory
    -r:readable
    -w:writeable
    -x:excutable
    
测试脚本是否有语法错误
    bash -n filename:语法
    bash -x filename:单步
    
练习:写一个脚本
给定一个文件:
如果是一个普通文件,就显示之;
如果是一个目录,亦显示之;
否则,此为无法识别之文件;


位置参数:
    ./filetest.sh /etc/fstab /etc/inittab
          $0          $1          $2
    shift:参数偏移
        shift n;
          
特殊变量:
    $?:上一个命令退出码
    $#:位置参数的个数(不包括脚本本身)
    $*:位置参数列表
    $@:位置参数列表
          
练习:写一脚本
能接受一个参数(文件路径)
判定:此参数如果是一个存在的文件,就显示“OK.”;否则就显示"No such file."


练习:写一个脚本
给脚本传递两个参数(整数);
显示此两者之和,之乘积;


练习:写一个脚本,完成以下任务
    1.使用一个变量保存一个用户名;
    2.删除此变量中的用户,且一并删除其家目录;
    3.显示“用户删除完成”类的信息;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值