zoukankan      html  css  js  c++  java
  • 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
    

      

     

  • 相关阅读:
    HDU 5115 Dire Wolf (区间DP)
    HDU 4283 You Are the One(区间DP(最优出栈顺序))
    ZOJ 3469 Food Delivery(区间DP好题)
    LightOJ 1422 Halloween Costumes(区间DP)
    POJ 1651 Multiplication Puzzle(区间DP)
    NYOJ 石子合并(一)(区间DP)
    POJ 2955 Brackets(括号匹配一)
    POJ 1141 Brackets Sequence(括号匹配二)
    ZOJ 3537 Cake(凸包+区间DP)
    Graham求凸包模板
  • 原文地址:https://www.cnblogs.com/0-lingdu/p/9291152.html
Copyright © 2011-2022 走看看