• shellb编程 之 实践出真知


     1、查询file1 里面空行的所在行号

     纯空行:awk ‘{if($0~/^$/)print NR}’ file 

      空行和带空格,制表符等的行:awk '$0~/^s*$/' file

     2、查询file1 以abc 结尾的行(是行的结尾,不是行内某个字段的结尾)

     grep abc$ file1

     3、打印出file1 文件第1 到第3 行

     sed -n ’1,3p’ file1

     head -3 file1     #-3中的短横必不可少

    4, 在11 月份内,每天的早上6 点到12 点中,每隔2 小时执行一次/usr/bin/httpd.sh 怎么 实现?

     0 6-12/2 * 11 * /usr/bin/httpd.sh

    5,用shell编程中的while写1+2+3...+100:

    #!/bin/bash
    
    i=1
    total=0
    while (($i<=100))    #while后的条件语句是整体,计算i是否小于等于100优先级比较高 ,此处用[$i -le 100]也是可以的
    do
        total=$(($total+$i))    #实际上shell编程不靠缩进来显示语句等级,故而缩进不如done有用。
        i=$(($i+1))
    done    #done是必须的,不然会输出5050次“结果是xxx。”
    echo "结果是$total"
    

    6 shell文件操作

    当前目录下创建四个文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell编程,实现自动创建m1,m2,m3,m4四个目录,并将m1.txt ,m2.txt,m3.txt,m4.txt 四个文件分别拷贝到各自相应的目录下。

    个人版:

    #!/bin/bash
    #创建四个文件和目录
    touch m{1..4}.txt
    mkdir m{1..4}
    
    for i in {1..4}
    do
        cp m$i.txt ./m$i
    done

    答案版:

    #!/bin/bash
    touch m1.txt m2.txt m3.txt m4.txt
    I=1 
    while [ $I -le 4 ]
    do 
       mkdir m$I
       cp m$I.txt m$I
       I=$((I+1))
    done

    7 账户和用户操作

        编写shell程序,实现自动删除50个账号的功能。账号名为stud1至stud50 

    #! /bin/bash
    i=1
    while [ $i -le 50]
    do
    if [ -n "`ls /etc/passwd | grep stud$i`" ]    #个人觉得此处应该使用cat /etc/passed |grep stud$1
    then
     userdel -r stdu$i
    else
     echo "No find stdu$i"
    i=$(($i+1))
    done
    

    8 判断文件类型,主要看test用法

    判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下 。

    echo -e "pls input filename 
    "    #-e其实没特别的用处,echo的目的是让read完成获得信息的工作
    read FILENAME    #相当于从键盘上获取应得的,
    if [ -c $FILENAME ]      #这个是test用法,意思是判断FILENAME是否是字符设备,方括号必须跟着空格
    then
        cp $FILENAME /dictionary1
    else
        echo "not charactor device file"
    fi

    补充,关于test的一些用法,可以直接写在方括号中,不加“test”

    -d file 检查file是否存在并是一个目录     #-d测试会检查指定的文件名是否在系统上以目录形式存在
    -e file 检查file是否存在 
    -f file 检查file是否存在并是一个文件 
    -r file 检查file是否存在并可读 
    -s file 检查file是否存在并非空 
    -w file 检查file是否存在并可写 
    -x file 检查file是否存在并可执行 
    -O file 检查file是否存在并属当前用户所有 
    -G file 检查file是否存在并且默认组与当前用户相同 
    -c file 检查file是否是字符设备文件 file1 -nt file2 检查file1是否比file2新 file1 -ot file2 检查file1是否比file2旧  

    9 创建目录批量设置权限

        目录下建立10个目录,即user1~user10,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限为:读、写、执行;文件所有者所在组的权限为:读、执行 

        我的答案:

    #!/bin/bash
    
    #批量创建目录并且设置权限(默认当前文件位置下)
    for i in {1..10}
    do
        mkdir user$i
        chmod 754 user$i
    done
    

     官方解答:

    #! /bin/bash
    i=1
    while [ $i -le 50 ]    #个数多少不影响
    do
    if [ -d /userdata ]    #首先判断一下userdata是不是一个目录
    then
    	mkdir -p /userdata/user$i     #如果是一个目录,直接在其下创建user目录就可以了
    else
     	mkdir  /userdata    #如果不存在或者不是目录格式文件,那就先创建,再开始创建user目录
     	mkdir -p /userdata/user$i
    fi
    chmod  754 /userdata/user$i    #设置目录权限
    i=$(($i+1))    #迭代条件
    done
    

        注意,查看某个目录的权限的情况需要用:ls 的-d参数,意思是查看这个目录本身的权限。

    10 用户和用户组的问题

        添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30

        答案:

    #!/bin/sh
    i=1
    groupadd class1    #创建群组
    while [ $i -le 30 ]
    do
    if [ $i -le 9 ] ;then    #个位数的时候添加0凑够两位数
    	USERNAME=stu0${i}
    else    #两位数的时候直接用就行了
    	USERNAME=stu${i}
    fi
    useradd $USERNAME    #添加用户,此时没有指定用户的根目录,所属的组等信息,唯一指定的是账户名
    mkdir /home/$USERNAME    
    chown -R $USERNAME  /home/$USERNAME    #把文件夹的所属改为USERNAME变量代表的名称
    chgrp -R class1  /home/$USERNAME    
    #把所有/home/$USERNAME文件夹下的子文件或者子文件夹改变属于为class1这个组的
    i=$(($i 1))
    done
    

      

     

  • 相关阅读:
    hdu1151 二分图(无回路有向图)的最小路径覆盖 Air Raid
    二分图多重匹配问题
    二分图最大匹配问题及其扩展
    ZOJ3741 状压DP Eternal Reality
    POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
    POJ2396:Budget(带下界的网络流)
    POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)
    POJ1637:Sightseeing tour(混合图的欧拉回路)
    URAL1277 Cops and Thieves(最小割)
    Leetcode 44. Wildcard Matching
  • 原文地址:https://www.cnblogs.com/0-lingdu/p/9291152.html
Copyright © 2020-2023  润新知