zoukankan      html  css  js  c++  java
  • 《Linux命令行与shell脚本编程大全》23章24章

    第二十三章 使用其他shell

    bash shell是linux发行版中最广泛使用的shell。但是它并不是唯一的选择,还有其他的shell可以供你选择。

    23.1 什么是dash shell

    百度百科上说:Dash shell是一个Unix shell,比Bash shell小的多,符合POSIX标准。

    下面是书上的:

    dash shell是作为debian linux发行版的一部分开发的,主要出现在Ubuntu linux发行版中。它是Bourne shell的精简版。所以它并不像bashshell一样支持那么多功能,这可能会给脚本编程带来一些问题。

    用的少,就不展开介绍了。

    23.4 zsh shell

    是由Paul Falstad开发的已个开源Unix shell。它汲取了所有现在shell的设计理念并增加了许多独到的功能,为程序员创建了一个无所不能的高级shell。

    下面的zsh shell的一些独特的功能:

    1)改进的shell选项处理

    2)shell兼容性模式

    3)可加载模块(最先进的功能)

    zsh shell提供了一组核心内建命令,并提供了添加额外命令模块的能力。

    每个命令模块都为特定场景提供了另外一组内建命令。比如网络支持和高级数学功能,你可以只添加你觉得有用的模块。

    zsh shell通常会用在编程环境中,因为它为shell脚本程序员提供了许多很好的功能。

    它是以可加载的模块来加载单独的代码库,这使得高级函数的使用在命令行上运行命令一样简单。

    从复杂的数学算法到网络应用(如FTP HTTP),可加载模块支持许多功能。

    这里也不展开介绍了。有人看我再好好写一写。

    第二十四章 编写简单的脚本实用工具

    演示一些实用的工具

    24.1 归档

    1,如果备份大量文件最好是创建一个专门的目录(下面这波操作还是很六的)

    $sudo mkdir /xcybak

    这样子直接拷贝东西进去是会失败的,除非加sudo。

    解决方法:可以通过sudo命令或者创建一个用户组的方式,为需要在集中归档目录中创建文件的用户授权。可以创建一个特殊的用户Xcybak

    $sudo groupadd Xcybak  // 创建一个用户组。Xcybak  是用户组

    $sudo chgrp Xcybak /xcybak  // 改变文件或目录(这里是/xcybak目录)所属的用户组

    可以查看一下

    $ls-ld /xcybak

    $sudo usermod –aG Xcybak xcy //这里的xcy是指当前登录用户。将xcy添加到Xcybak用户组

    $sudo chmod 775 /xcybak  //文件属组的权限的7了。xcy用户就可以对/xcybak进行读写了

    可以再查看一下

    $ls-ld /xcybak

    将用户添加到Xcybak组后,用户必须先登出在登入,才能使成员关系生效。

    我这里就重启了一下虚拟机。

    接下来就可以直接在/xcybak目录下创建文件了。

    本人亲测有用。

    补充:关于linux用户组、文件权限

    1.linux每个用户都必须有一个组,不能独立与组外。

    2.文件所有者:一般为文件的创建者

    3.文件所在组:用户创建文件后,这个文件所在组就是该用户所在组。可以chgrp去改变用户所在的组。用户所在的组。可以更改

    4.其他组:除了上面那两个

    5.对于一个文件来说,文件权限分为所有者权限、属组权限、其他权限。可以用chmod改变

    6.改变用户组:

    在添加用户时,可以指定将该用户添加到哪个组中。

    可以用root的管理权限可以改变某个用户所在的组

    usermod –g 组名 用户名   // usermod还可以接很多其他的参数

    7.查看组信息: cat  /etc/group (字段解释 组名:口令:组标识号GID:组内用户列表)

    8.查看用户信息:cat  /etc/passwd

    9. 还可以将用户添加到用户组上 $sudo usermod –aG groupname username

    一个用户可以添加到多个组上。

    24.1.1 代码如下:

    配置文件(要备份的文件)。将要备份的目录或文件写在Files_To_Backup文件中

    $ cat Files_To_Backup

    /home/xcy/shell/

    /home/xcy/shellxcy

    脚本如下:

    xcy@xcy-virtual-machine:~/shell/24zhang$ cat Daily_Archive.sh

    #!/bin/bash

    DATE=$(date +%y%m%d)

    # save file name

    FILE=xcybak$DATE.tar.gz

    # config file directory

    CONFIG_FILE=/xcybak/Files_To_Backup

    DESTINATION=/xcybak/$FILE

    if [ -f $CONFIG_FILE ]

    then

             echo

    else

             echo

             echo "$CONFIG_FILE does not exist"

             echo "Backup not completed due ti missing configuration File"

             echo

             exit

    fi

    FILE_NO=1

    # Redirect std input to name of config file

    exec < $CONFIG_FILE

    read FILE_NAME

    while [ $? -eq 0 ]

    do

             # make sure file or directory exists

             if [ -f $FILE_NAME -o -d $FILE_NAME ]

             then

                       # add its name to the list

                       FILE_LIST="$FILE_LIST $FILE_NAME"

             else

                       echo

                       echo "$FILE_NAME, does not exist"

                       echo "Obviously, I will not include it in this xcybak"

                       echo "It is listed on line $FILE_NO of the config file"

                       echo

             fi

             FILE_NO=$[ $FILE_NO + 1 ]

             read FILE_NAME

    done

    echo "Starting xcybak ..."

    echo

    tar -czf $DESTINATION $FILE_LIST 2> /dev/null

    echo "xcybak completed"

    echo "Resulting xcybak file is: $DESTINATION"

    echo

    exit

    这个脚本要做的事情就是将Files_To_Backup包含的文件或目录打包压缩起来。保存的名字是当前的时间。

    还可以加在cron中。创建按日或按小时备份的文件。

    24.2 管理用户账户

    不仅仅是添加修改删除账户,还得考虑安全问题,保留工作的需求以及对账户的精确管理。

     删除账户时,至少需要四个步骤:

    1)获得正确的删除用户账户名

    2)杀死正在系统上运行的属于该账户的进程

    3)确认系统中属于该账户的所有文件

    4)删除该用户账户

    可以把它设计成交互式脚本。就不应该放在cron表中。

    脚本很长,我就不写了。

    24.3 检测磁盘空间

    这个工具会帮你找出目录中磁盘空间使用量位居前十名的用户。会生成一个以日期命名的报告。

    1.用du命令可以显示单个文件和目录的磁盘使用情况

    -s用来总结目录以及的整体使用状况

    -S为每个目录和子目录分别提供了总计信息。这个才是我们要的

    $sudo du –S /home/xcy/

    还可以进行排序,降序排列:

    $sudo du –S /home/xcy/ | sort –rn   // -r是逆序,-n是允许按数字排序

    下面筛选排名前十的用户列表:

    sed编辑器的输出会通过管道输出到gawk命令,然后打印出来

    xcy@xcy-virtual-machine:/var$ sudo du -S /var/log/ | sort -rn |

    > sed '{11,$D; =}'|  # =是加行号,11行到末尾全部删除

    > sed 'N; s/ / /'|  # N命令用来将行号和文本放在同一行

    > gawk '{printf $1 ":" " " $2 " " $3 " "}'

    1:      4940         /var/log/

    2:      4028         /var/log/vmware-caf/pme

    3:      804      /var/log/installer

    4:      544           /var/log/upstart

    5:      184           /var/log/samba

    6:      120           /var/log/apt

    7:      40              /var/log/lightdm

    8:      16              /var/log/cups

    9:      12              /var/log/mysql

    10:   12              /var/log/fsck

    xcy@xcy-virtual-machine:/var$

    下面是真正的脚本:

    xcy@xcy-virtual-machine:~/shell/24zhang$ cat  Big_Users.sh

    #!/bin/bash

    CHECK_DIRECTORIES="/var/log /home"

    DATE=$(date +%m%d%y)  # Date for report file

    exec > disk_space_$DATE.rpt  # Make report file STDOUT

    echo "Top Ten Disk Space Usage"

    echo "for $CHECK_DIRECTORIES Directory"

    for DIR_CHECK in $CHECK_DIRECTORIES

    do

             echo ""

             echo "The $DIR_CHECK Directory:"

             du -S $DIR_CHECK 2>/dev/null |

             sort -rn |

             sed '{11,$D; =}' |

             sed 'N; s/ / /' |

             gawk '{printf $1 ":" " " $2 " " $3 " "}'

    done

    exit

    xcy@xcy-virtual-machine:~/shell/24zhang$

    运行:

    ./Big_User.sh

    上面只指定了两个目录/var/log /home,生成的报告在disk_space_$DATE.rpt这里。

    这个脚本可以用cron表来实现,让它自动运行。

    补充:

    1.最近在安装软件时总是会报错

    在处理时有错误发生:

     open-vm-tools

     open-vm-tools-dkms

     open-vm-dkms

    E: Sub-process /usr/bin/dpkg returned an error code (1)

    解决办法:相当于把VM-tools移除了。移除之后不能全屏了,看着很不爽

    sudo apt-get autoremove open-vm-dkms open-vm-tools --purge

    2. 在shell里面,“%”、“#”、“*” 是什么意思,如${a%#.}、${a%%.*}、${a##.*}

    ${varible##*string} 从左向右截取最后一个string后的字符串

    ${varible#*string}从左向右截取第一个string后的字符串

    ${varible%%string*}从右向左截取最后一个string后的字符串

    ${varible%string*}从右向左截取第一个string后的字符串  {USB2%:*}

    “*”只是一个通配符有时可以不要

    例子:

    $ MYVAR=foodforthought.jpg

    $ echo ${MYVAR##*fo}

    rthought.jpg

    $ echo ${MYVAR#*fo}

    odforthought.jpg

  • 相关阅读:
    WebView中实现文件下载功能
    PrograssBar的setIndeterminateDrawable不起作用
    62个Android Studio小技巧合集
    Touch 事件的分发和消费机制
    AndroidStudio
    pagefile.sys and heberfil.sys
    android ANR产生原因和解决办法
    JAVA中分为基本数据类型及引用数据类型
    handler
    洛谷 P2709 小B的询问
  • 原文地址:https://www.cnblogs.com/xcywt/p/8011415.html
Copyright © 2011-2022 走看看