内核主要功能: 系统内存管理 软件程序管理 硬件设备管理 文件系统管理 Linux 基本原则: 1.有目的单一的小程序组成,组合小程序完成复杂任务 2.一切皆文件 3.尽量避免捕获用户接口 4.配置文件保存为纯文本文件 GUI接口: CLI接口: 命令提示符:prompt 管理员:# 普通用户:$ 命令格式: 命令 选项 参数 使用凭证:验证身份 su 命令切换当前用户身份到其他用户身份, su -c 执行完指定指令后,恢复原来的身份 su -l 改变身份时,同时也修改工作目录,环境变量,HOME SHELL 认证: 授权: 审计: -------------------------------------------------------------------------------------------------- 常见Linux目录名称 目 录 用 途 / 虚拟目录的根目录。通常不会在这里存储文件 /bin 二进制目录,存放许多用户级的GNU工具 /boot 启动目录,存放启动文件 /dev 设备目录,Linux在这里创建设备节点 /etc 系统配置文件目录 /home 主目录,Linux在这里创建用户目录 /lib 库目录,存放系统和应用程序的库文件 /media 媒体目录,可移动媒体设备的常用挂载点 /mnt 挂载目录,另一个可移动媒体设备的常用挂载点 /opt 可选目录,常用于存放第三方软件包和数据文件 /proc 进程目录,存放现有硬件及当前进程的相关信息 /root root用户的主目录 /sbin 系统二进制目录,存放许多GNU管理员级工具 /run 运行目录,存放系统运作时的运行时数据 /srv 服务目录,存放本地服务的相关文件 /sys 系统目录,存放系统硬件信息的相关文件 /tmp 临时目录,可以在该目录中创建和删除临时工作文件 /usr 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里 /var 可变目录,用以存放经常变化的文件,比如日志文件 --------------------------------------------------------------------------------------------------- linux 文件系统:(层次化) 文件系统树型目录结构 filesystem hierarchy standard (文件系统层级标准) FHS 绝对路径: 相对路径: pwd 命令: 以绝对路径显示当前工作目录 ls -l 长格式 文件类型: - :普通文件 d : 目录文件 b : 块设备文件 c : 字符设备文件 l : 符号链接文件 p : 命令管道 s :套接字文件 -rw-r--r-- 1 root root 36 Jun 29 14:31 user.txt - :文件类型 rw-r--r-- : 读写执行 1 : 文件硬链接的次数 root: 文件的拥有者 {owner} root: 文件的属组 {group} 36 :文件大小 {size} 默认单位字节 Jun 29 14:31 :时间戳 {timestamp} 最近一次被修改的时间{访问时间,修改时间,改变时间} 访问:access 修改:modify 改变:change user.txt : 文件名或目录名 -h : 单位换算 当用户指定特定文件的名称作为过滤器时,ls命令只会显示该文件的信息。有时你可能不知 道要找的那个文件的确切名称。ls命令能够识别标准通配符,并在过滤器中用它们进行模式匹配: 问号(?)代表一个字符; 星号(*)代表零个或多个字符。 问号可用于过滤器字符串中替代任意位置的单个字符。例如: $ ls -l my_scr?pt -rw-rw-r-- 1 christine christine 0 May 21 13:25 my_scrapt -rwxrw-r-- 1 christine christine 54 May 21 11:26 my_script -A:显示除影藏文件“.”和“..”以外的所有文件列表 -d :显示目录自身属性 -i :显示index node,简写inode -r :逆序显示文件 命令类型: 内置命令:{shell 内置} 外部命令:在文件系统的某个目录下有与命令名称相应的可执行文件 环境变量:命名的内存空间 变量赋值 printenv: 显示环境变量 PATH:使用冒号分割的路径 hash :命令显示命令缓存 {hits 命中的字数} type: 显示指定命令属于哪种类型 date :时间管理 linux: rtc date -s "2012-05-23 01:01:01" //这样可以设置全部时间 硬件时间:hwclock 系统时间:date ———————————————————————————————————————————————————————— #!/bin/bash start=$(date +%s) nmap man.linuxde.net &> /dev/null end=$(date +%s) difference=$(( end - start )) echo $difference seconds. —————————————————————————————————————————————————————————— 获得命令的使用帮助: 内部命令: help command 外部命令: command --help {大多数外部命令支持} 命令手册:manual man command whatis command 查看命令在哪些章节 man 分章节: 八个章节 1.用户命令 2.系统调用 3.库用户 4.特殊文件 {设备文件} 5.文件格式 {配置文件的语法} 6.游戏 7.杂项 miscellaneous 8.管理命令 {/bin , /usr/sbin, /usr/local/sbin} synopsis :概要 <> :必选 [] : 可选 .......:可以出现多次 | : 多选一 {} : 分组 MAN : NAME : 命令名称及功能简要 SYMOPSIS :用法说明 OPTIONS :说明每一个选项的意义 FILES : 此命令的相关配置文件 BUGS : EXAMPLES :使用示列 SEE ALSO :另外参照 翻屏: 向后翻一屏:SPACE 向前翻一屏:b 向后翻一行:enter 向前翻一行:k 关键字查找: /KEYWORD : 向后查找 n: 查找下一个 N: 查找上一个 q :退出 info :在线手册 hwclock -w :读取系统时间 hwclock -s :读取硬件时间 hwclock--------SYNOPSIS hwclock -r or hwclock --show hwclock -w or hwclock --systohc hwclock -s or hwclock --hctosys hwclock -a or hwclock --adjust hwclock -v or hwclock --version hwclock --set --date=newdate hwclock --getepoch hwclock --setepoch --epoch=year 文档目录: /usr/share/doc cal 日历: echo 命令用法: -e 启用换行 printf 命令: Windows :PE Linux :ELF 文件系统: rootfs :根文件系统 FHS:文件系统层级化标准 /boot :系统启动相关文件:如内核 ,initrd ,以及grub {bootload 启动引导程序} /dev :设备文件 块设备:随机访问,数据块 字符设备:线性访问: 按字符为单位 设备号:主设备号和次设备号 /etc : 配置文件 /home ;用户家目录 /lib : 库文件, /lib/modules :内核模块文件 动态库:.dll .so {share object} 静态库:.a /media :挂载点目录,移动设备 /mnt : 挂载点目录,额外的临时文件 /option : 可选目录,第三方程序的安装目录 /proc :伪文件系统,内核映射文件 /sys : 伪文件系统,跟硬件设备相关的属性映射文件 /tmp : 临时文件 /var/tmp /var :可变化的文件,用于存放经常变化的数据,比如日志 /bin : 可执行文件,用户命令 /sbin :管理命令 /usr :shared ,read-only 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里 /usr/bin /usr/sbin /usr/lib/ /usr/local: /usr/local/bin /usr/local/sbin /usr/local/lib 命名规则: 1.长度不能超过255个字符 2.不能使用 / 当文件名 3.严格区分大小写 introduction :介绍 描述GPL,BSD,apache www.kernel.org linux ,GUN/linux 源代码 发行版:http://os.51cto.com/art/201703/534139.htm?mobile 十大发行版 redhat {centos} ,SUSE ,Debin 三大发行版 文件管理 touch ,stat, file ,rm ,cp ,mv 日期时间: date ,clock , hwclock ,cal 文本处理:cut ,join ,sed ,awk cat ,more ,less ,head ,tail ,cut ,sort ,uniq ,grep cat :链接并显示 -n :显示行号 -E :每行末尾显示$ shift + pageup or pagedown 翻屏 tac :和cat 的输出相反 分屏显示: more less : more : 向后翻 less :space 向后翻屏,b 向前翻屏 ,enter 向下一行 ,k 向上一行 head :看前多少行 head -n number tail :看最后多少行 tail -n number tail -f : 立即显示末尾追加的内容 cut : -d : 指定分隔符 -f : 指定要显示的字段 sort : -n :根据字符串数值进行比较 -r : 降序排序 -t :字段分隔符 -k :分隔符号指定的的字段 -u :排序时相同的行只显示一次 -f :排序时忽略大小写 examples: sort -t : -k 3 -n /etc/passwd uniq : 报告和省略重复的行 -c : 统计重复的行出现的次数 -d : 只显示重复的行 单词:duplicate 重复 wc : wc /etc/issue 3 9 48 /etc/issue 对应行数 单词数 字节数 -l :行数 -w :单词数 -c :字节数 -L :输出最长的行 tr :转换或者删除字符 examples : tr "a-z" "A-Z" < passwd_test //将小写全部换成大写 -d :删除字符 目录管理 ls cd pwd mdkir rmdir -p 创建父目录 命令行展开: {} 列入: mkdir /root/test/{test1/qqq,test_222} mkdir /root/test/{a,b}{c,d} tree: 查看目录树 删除目录文件: rmdir {remove directory} 删除空目录 touch :修改文件时间戳 -a 修改access 时间 -m 修改modify 时间 -t 自定义时间 -c 只更新时间戳,不创建文件 stat :显示文件状态 标准:GB18030, GBK,GB2312,unicode , rm :删除命令 rm 别名为 rm -i \rm test1 :能够不提示直接删除文件目录 执行程序 设备管理 软件管理 进程管理 网络管理 bash 及其特性: shell :外壳 GUI :GNOME ,KDE ,Xface CLI :sh ,bash ,csh ,ksh , rcsh, zsh 程序 :进程 允许一个用户账号登录多次,每次登录打开一个bash 进程 进程:在每个程序看来,当前主机只存在内核和当前进程 进程是程序的副本,进程是程序执行的实列 用户工作环境: shell :子shell bash: 1. 支持命令历史 2.管道,重定向 3.支持命令别名 4.支持命令编辑 5.支持命令行展开 6.支持文件名统配 7.变量 8.编程 命令行编辑: Ctrl + a :跳到命令行首 Ctrl + e :跳到命令行尾 Ctrl + u :删除光标至行首 Ctrl + k :删除光标至行尾 命令历史: history : 查看历史命令 -c :清楚所有历史命令 -d :删除指定位置的命令 examples : history -d 59 6 //删除指定位置后的命令个数 -w :保存命令历史至历史文件中 ! n :执行指定序号的命令 !! :执行是一条命令 !string : 执行近段时间以这个字符开头的命令 !$ :应用前一个命令的最后一个参数 Esc . :应用前一个命令的最后一个参数 //按下Esc键,按 . 环境变量: PATH :命令搜索路径 HISSIZE :命令历史大小 //查看方式为 echo $HISSIZE 命令补全: Tab 键 路径补全: Tab 键 //连按两下 命令别名: alias : examples :alias cp='cp -i' 别名有效时间为当前shell 生命周期有效,只作用在当前shell 进程 unalias : 取消别名 执行命令本身,不带参数 使用 \command 命令替换:格式 $(COMMAND) or `` 反引号 echo "the current directory is $(pwd)" //命令替换 date +%F-%H-%M-%S //显示年月日小时分钟 touch ./file-$(date +%F-%H-%M-%S).txt bash 支持的引号: ·· :命令替换 "" :弱引用,可以实现变量替换 '' :强引用,不完成变量替换 文件名通配:globbing * :任意长度的任意字符 ? :任意单个字符 [] :匹配指定范围的任意字符 examples: [abc],[a-z],[1-9],[A-Z],[a-zA-Z] [0-9a-zA-Z] [[:space:]]:空白符号 [[:punct:]]:标点符号 [[:lower:]]:小写字母 [[:upper:]]:大写字母 [[:alpha:]]:大小写 [[:digit:]]:数字 [[:alnum:]] :数字和大小写字母 查询: man 7 glob ^ :脱字符,匹配指定指定范围外的选项, //examples ls [^0-9]* 用户及权限: 计算资源 权限 用户 用户,容器,关联权限, 用户组:利于分配权限 用户 :标识符 用户组:标识符 文件: 用户,组,权限 安全上下文 (secure context) 权限:r, w, x 文件: r :可读,可以使用类似cat 等命令查看文件内容 w :可写,可以编辑或者删除此文件 x :可执行,exacutable,可以在命令行下提交给内核运行 目录: r :可以对此目录执行ls 列出内部所有文件 w : 可以在此目录创建文件 x :可以使用cd 切换进去目录,也可以使用ls -l 列出文件内部详细信息 r--:只读 r-x:读和执行 ---:无权限 0 000 ---:无权限 1 001 --x: 可执行 2 010 -w-:可写 3 011 -wx: 可写可执行 4 100 r--: 可读 5 101 r-x: 可读可执行 6 110 rw-: 可读可写 7 111 rwx: 可读可执行 //8进制 用户:UID /etc/passwd 组 :GID /etc/group 解析:名称解析 影子口令: 用户: /etc/shadow 组 : /etc/gshadow 用户类别: 管理员: 0 普通用户:1-65535 系统用户:1-499 一般用户:500-60000 用户组: 系统组: 一般组: 用户组类别: 基本组:用户默认的组 私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个与用户同名的组 附加组:额外组 程序在执行时属于进程,进程的权限=执行者的权限 加密方式: 对称加密,相同密码 非对称加密:公钥,私钥 单向加密:散列加密,提取数据特征码,常用与完整性效验 1.雪崩效应 2.定长输出 MD5: 128 定长输出 SHA1 :secure hash algorithm 160 位定长输出,hash 算法 /etc/passwd 解析: account ;账户名称 passwd :密码 UID :用户ID GID :基本组ID GECOS :用户注释信息 directory :用户家目录 shell : 用户使用的shell // 查看 cat /etc/shells 有哪些shell /etc/shadow 解析: 1.account : 用户名 2.encrypted password :加密的密码,单向加密 3.days since Jan 1, 1970 that password was last changed:1970.1.1 到最近一次修改密码的天数 4.days before password may be changed:密码最短使用期限 5.days after which password must be changed:密码最长使用期限 6.days before password is to expire that user is warned:密码到期之前的几天,该用户被警告 7.days after password expires that account is disabled:密码到期后的几天该帐户被禁用 8.days since Jan 1, 1970 that account is disabled:账号有效期 9.a reserved field: 一个保留字段 useradd name :添加用户 /etc/default/useradd //不指定使用默认参数配置文件 /etc/group 解析: 1.组名 2.密码占位符 3.组ID ,GID 4.以这个组为附加组的用户列表,没有及为空 groupadd name :添加组 环境变量: echo $SHELL //保存当前用户的shell echo $PATH echo $HISTSIZE 用户管理: useradd , userdel ,usermod ,passwd , chsh ,chfn ,finger ,id ,chage 组管理: groupadd ,groupdel ,groupmod ,gpasswd newgrp 权限管理: chown ,chgrp ,chmod ,umask useradd [option] USERNAME -u UID -g GID (基本组) -G GID ,,,,,,,附加组 -c "COMMENT" -d /path //用户指定家目录 -s :指定shell 路径 examples : useradd -s /bin/tsch user5 -m -k :创建家目录,并且将/etc/skel 的文件copy 到家目录 -M :不创建家目录 // /etc/login.defs 指定了创建用户的默认期限 userdel [option] USERNAME //不指定选项,默认不删除家目录 -r :同时删除用户家目录 usermod [option] USERNAME -u :改UID -g :改基本组 // 组必须事先存在 -G :修改附加组 //此前附加组将被删除 -a -G : 追加附加组 -c :注释信息 -d :为用户创建新的家目录,原有文件无法访问 -d -m :将原目录文件copy 到新的目录 -l : 修改用户名 -L :锁定账号 -U :解锁账号 shch :修改shell shch account // 修改的shell 需要带路径 chfn : 修改注释信息 chfn account 密码管理: passwd USERNAME --stdin :从标准输入中读取密码 examples: echo "test" |passwd --stdin user6 -l :lock 账号 -u :unlock account -d :删除密码 passwd [-k] [-l] [-u [-f]] [-d] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] -n :最短使用期限 -x :最长使用期限 pwck :检查密码文件的完整性,用户账号完整性 组管理: 创建组:groupadd groupadd: -g :指定GID -r : 对于useradd 添加系统用户 0-500 -r :对于groupadd 添加系统组 groupmod : -g :GOD -n :修改组名 groupdel :删除组 groupdel groupname gpasswd :修改组密码 newgrp : 切换属组,临时切换用户基本组,登录为一个新组,exit 还原 chage :改变用户密码过期信息 -d :最近一次的修改时间 -E :过期时间 -I :非活动时间 -m :最短使用期限 -M :最长使用期限 -W :警告时间 id :查看账户属性信息 -u :UID -g :GID -G :GID -n :显示name finger :检索用户信息 examples :finger userone 权限管理:chown ,chgrp 三类用户: u:用户 g:组 o:其他 chown :改变文件属主 -R :修改文件及其内部的文件的属组,递归方式 --reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同; chgrp :修改文件及目录属组 -R :递归修改 --reference=参考目录属组 chmod : chmod mode file,...... -R : 递归修改 --reference= 参考修改 修改某类用户权限: u,g,o,a u=user g=group o=other a=all examples : chmod u=rwx abc chmod u=r,g=r,o=r abc 修改某类用户的某个权限 chmod u-x,g+x abc chmod u+x,g+rwx,o+x abc ---------------------------------------------------------------- ls -l `which passwd` -rwsr-xr-x 1 root root 27936 Aug 11 2010 /usr/bin/passwd ---------------------------------------------------------------- openssl passwd -1 -salt '12345678' 将后面输入的密码进行加密,-1 指定MD5 加密,-salt 指定加"盐"进行加密,单向加密 umask :遮罩码,决定用户默认目录或文件默认权限 显示当前用户的umask 权限为:文件为666 -umask 目录为777 -umask 文件默认不能具有执行权限,否则权限+1 , SHELL 的类型, 登录式shell : 正常通过某终端登录 su - unername su -l usernal 非登录式shell: su username 图形终端打开命令窗口 自动执行的shell 脚本 bash 的配置文件: 全局配置: /etc/profile, /etc/profile.d/*.sh, /etc/bashrc 个人配置 ~/.bash_profile, ~/.bashrc 分析: profile 类的文件: 设定环境变量 运行命令或脚本 bashrc 类的文件: 设定本地变量 定义命令别名 登录式shell 读取配置文件: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc 非登录式shell 读取配置文件: ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh echo "Hello . welcome my system `date`." profile设定环境变量 /etc/profile /etc/profile.d/*.sh . bash_profile ******************************************************************** 查看PATH:echo $PATH 以添加mongodb server为列 修改方法一: export PATH=/usr/local/mongodb/bin:$PATH //配置完后可以通过echo $PATH查看配置结果。 生效方法:立即生效 有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置 用户局限:仅对当前用户 修改方法二: 通过修改.bashrc文件: vim ~/.bashrc //在最后一行添上: export PATH=/usr/local/mongodb/bin:$PATH 生效方法:(有以下两种) 1、关闭当前终端窗口,重新打开一个新终端窗口就能生效 2、输入“source ~/.bashrc”命令,立即生效 有效期限:永久有效 用户局限:仅对当前用户 修改方法三: 通过修改profile文件: vim /etc/profile /export PATH //找到设置PATH的行,添加 export PATH=/usr/local/mongodb/bin:$PATH 生效方法:系统重启 有效期限:永久有效 用户局限:对所有用户 #####环境变量的几种修改方式,大多数我们使用第三种 修改方法四: 通过修改environment文件: vim /etc/environment 在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入“:/usr/local/mongodb/bin” 生效方法:系统重启 有效期限:永久有效 用户局限:对所有用户 ********************************************************************************* 管理及I/O 重定向 管道和重定向: 程序:指令和数据 控制器:指令 运算器: 存储器: 地址总线:内存寻址 数据总线:传输数据 控制总线:控制指令 寄存器:CPU 暂时存储器 I/O 硬盘 系统设定 默认输出设备:标准输出 ,STDOUT 数字表示1 默认输出设备:标准输入,STDIN 数字表示0 标准错误输出:STDERR .数字表示2 Linux : 0: Standard Input (STDIN) 1: Standard Output (STDOUT) 2: Standard Error Output (STDERR) 输出 > 覆盖文件中原有内容 set -C 禁止对已存在文件使用覆盖重定向 set +C 表示关闭上述功能 强制覆盖输出 >| 追加输出 >> 不覆盖原有内容 &> 重定向标准输出或者错误输出到同一个文件 输入 < tr "a-z" "A-Z" < /etc/fstab 输入无追加方式,不能使用<< << 表示在此处生成文档 examples : ----------------------------------------------- [root@centos /]# cat << END > sffs > sfsfs > fsfsff > END sffs sfsfs fsfsff [root@centos /]# ------------------------------------------------ [root@centos /]# cat >> /qazwsx.txt << EOF > sfsfs > gdgdg > gdgdg > EOF [root@centos /]# cat qazwsx.txt sfsfs gdgdg gdgdg [root@centos /]# 在脚本中使用文件 cat >> file.name << EOF 内容 >EOF EOF 和END 一对表示起始和结束 ----------------------------------------------------- 管道:| : 前一个命令的输出作为后一个命令的输入 ------------------------------------- echo "hello" | tr "a-z" "A-Z" HELLO 前一个命令的输出做为后一个命令的输入 [root@centos /]# echo "default_zy" |passwd --stdin zy Changing password for user zy. passwd: all authentication tokens updated successfully. // 将输出结果作为后面passwd 的输入来改变用户密码 cut -d: -f3 /etc/passwd |sort -n // 排序 cut -d: -f1 /etc/passwd |sort |tr "a-z" "A-Z" // 排序换成大写 ls /var |tr "a-z" "A-Z" // 换成大写 -------------------------------------- tee命令文件过滤分割与合并 tee命令用于将数据重定向到文件, 另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。 简单的说就是把数据重定向到给定文件和屏幕上。 ls |tee out.txt //屏幕输出一份,导入out.txt 文件一份 wc -l out.txt |cut -d " " -f1 //只显示行号 查看 usr/bin 的个数 ls /usr/bin |ls -l 查看passwd 有哪些shell cut -d: -f 7 /etc/passwd |sort -u file /var/log/* or file `ls /var/log` 取出第6行,使用这个方法 head -6 /etc/inittab |tail -1 取出第七行的shell 类型,并显示保存 tail -9 /etc/passwd |head -1 | cut -d : -f 7 |tee /out.put 显示/etc 目录下以pa 开头的文件 ls -d /etc/pa* grep :文本查找需要 根据模式搜索文本,并将符合模式的文本显示出来 grep ,egrep ,fgrep pattern :文本字符和正则表达式的元字符组合而成的匹配条件 使用方法: grep [options] PATTERN [FILE...] -i :忽略大小写 --colour :语法高亮 -v :显示没有被匹配到的行 -o :只显示被模式匹配到的字符串 正则表达式:Regular Expression *:任意长度任意字符 ?:任意单个字符 {} :范围内 {^} :范围外 [] :匹配指定范围内的单个字符 字符集合:[:digit:],[:lower:],[:upper:],[:space:],[:alpha:],[:alnum:] 元字符: . 匹配任意单个字符 grep 'r..t' /etc/passwd --colour 匹配次数(竟可能长去匹配): *:匹配其前面的任意次数 grep 'a*b' ccc.txt // *号前面的字符出现任意次数 .*: 任意字符 // *号前面的. 代表的任意字符出现任意次数 ?:前一项可选,0次或者1次 \?转义 \{m,n\}: 匹配其前面的字符,至少m 次,至多n 次 位置锚定: ^ :位置锚定 ,指定字符必须在行首出现 grep '^r..t' /etc/passwd $ :此字符前面的内容不必须出现在行尾 grep 'w$' /etc/inittab …^$:空白行 grep '^$' /etc/inittab |wc -l grep '[[:digit:]]$' /etc/inittab //查找数字结尾的行 grep '[[:space:]][[:digit:]]$' /etc/inittab //前面有一个空白字符 \< :锚定词首,其后面的任意字符必须作为单词首部出现 \> :锚定词尾,其前面的任意字符必须作为单词尾部出现 或者 \b 表示等同于 \>或者\< 分组: \(\) \(ab\)* 后向引用 \1:第一个左括号以及对应右括号所包括的所有内容 grep '\(l..e\).*\1' maoding.txt // 前面匹配到什么后面就引用什么,要求一致 grep '\([0-9]\).*\1$' /etc/inittab //前面有数字并且以相同数字结尾的行 正则表达式: 基本正则表达式:basic regexp 扩展正则表达式:extended regexp 基本正则表达式: .: []: [^]: 次数匹配: *: \? :0 或者1次 \{m.n\} :至多n 次 ,至少m次 .* :任意长度的任意字符 锚定: ^ : $: \< .\b \< .\b \1 , \2 ,\3 ........应用第几个括号内的内容 grep :使用基本正则表达式定义的模式来过滤文本的命令。 -i :忽略大小写 -v :不匹配的显示 -o :只显示匹配到的字符串 --colour :匹配高亮 -E :使用扩展的正则表达式 -A:并且显示后面多少行 -B: 后面多少行 -C:前后多少行 扩展正则表达式: 字符匹配: .: 任意那个字符 [] :范围内 [^]: 范围外 次数匹配: * :其前字符任意次 ?: + :匹配其前面字符至少一次 {m,n} : 至少m 次至多n 次 位置锚定相同 分组: 或者 | : or grep -E 'C|cat' maoding.txt //表示查询C或者cat grep -E '(C|c)at' maoding.txt //查询 Cat 或者cat grep -E '^[[:space:]]+' maoding.txt //查询使用空格结尾的行 egrep 等同于 grep -E 找出 /boot/grub/grub.conf 文件中1-255 之间的数字: egrep --colour '\<([1-9]|[1-9][0-9]|1[0-9]|2[0-4][0-9]|25[0-5])\>' \. \为逃逸符让 . 表示本身的意思 类IP段 1.0.0.0 到126.255.255.255 (0段和127段不使用) B类IP段 128.0.0.0 到191.255.255.255 C类IP段 192.0.0.0 到223.255.255.255 grep, egrep, fgrep fgrep :不支持正则表达式 shell 脚本编程: 编辑器,解释器 编程语言:机器语言,汇编语言,高级语言 静态语言:编译型语言 强类型 (变量) 编译完成才能够执行 C,C++ .JAVA,C# 动态语言:解释型语言 弱类型 边解释边执行 ASP, ASP.net PHP ,shell python,perl 面相对象:JAVA,python ,perl ,C++ 面向过程:shell ,C 变量:内存空间,命名 内存:内存是编址的存储单元 变量类型:确定数据的存储格式和长度 字符 数值 整型 浮点型:带小数点 整型:8bit 0-255 布尔型:逻辑变量定义符 与运算: 1 0 0 1 1 1 0 0 0 非运算: !真 假 !假 真 异或运算 1 1 0 0 0 0 1 0 1 0 1 1 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0 NULL 空 N/A 表示不适用 :Not Applicable bash 变量类型: 环境变量: 本地变量: 局部变量 位置变量: 特殊变量: 本地变量 bash: 引用变量${ } 可以省略 echo "this is ${name}" // 不引起混淆可以不加花括号 '' 单引号做强引用不做变量替换,否则"" 本地变量:作用于为整个bash 进程 VARNAME=VALUE 局部变量:作用于当前代码段 环境变量:作用于当前进程及其子进程 脚本在执行时会启动一个子shell 进程 命令行中启动的脚本会继承当前sehll 环境变量 系统自动执行的脚本{非命令行启动} 需要自我定义环境变量 pstree 查看当前进程 位置变量: $1 $2 //引用脚本参数 特殊变量:$? 保存上一个命令的执行状态返回值 //保存某些特殊数据 程序执行,可能有两类返回值 程序执行结果 程序状态返回代码 {0-255} 0:正确执行 1-255:错误执行:1 2 127 系统预留 s输出重定向: > >> $>同时重定向 2> 错误重定向 /dev/null 软件设备,bit bucket ,数据黑洞 ls fsfdsfds >out_success.txt 2>out_err.txt //将正确的导入success ,错误的导入err ls fsdfsfds &> test.txt //正确和错误的都导入一个文件 不支持&>> 追加输出 ------------------------------------------------------------------------------------------------------------------- ********************************************************************************************************************** ls /etcfsdfdsfs >/dev/null 2>&1 //将标准错误输出导入标准正确输出,然后将标准正确输出重定向到 /dev/null ********************************************************************************************************************** ---------------------------------------------------------------------------------------------------------------- >/dev/null 2>&1 // 实际上,应该等同于这样: 1>/dev/null 2>/dev/null , 默认情况下就是1,标准输出,所以一般都省略。 而&符号, 后面接的是必须的文件描述符。不能写成2>1, 这样就成了标准错误重定向到文件名为1的文件中了, 而不是重定向标准错误到标准输出中。 所以这里就是:标准输出重定向到了/dev/null,而标准错误又重定向到了标准输出, 所以就成了标准输出和标准错误都重定向到了/dev/null 2>&1 >/dev/null //此方式为不正确方式 命令从左往右执行,2>&1 为将标准错误输出重定向到标准输出,而这时标准输出是打印在屏幕上的,还没执行到 >/dev/null 命令行的重定向什么的, 是在执行命令之前就准备好了的. 解释顺序从左至右依次进行, 2&>1 ,而1是屏幕, 所以标准错误重定向到屏幕, 再而 1>/dev/null , 即标准输出重定向到 /dev/null, 上述2>&1 >/dev/null 并不是什么同一时刻要么产生标准输出要么产生标准错误. 而是两个不同的东西. ---------------------------------------------------------------------------------------------------------------------- 撤销变量: unset VARNAME //不用带变量$ 符号 查看当前shell 中变量: set //不带任何参数,查询结果包含环境变量和本地变量 查看当前shell中的环境变量: printenv: env: export: export PATH=$PATH:/usr/local/apache/bin 添加环境变量 name=$name:zy_test //添加新的环境变量 脚本:命令的堆砌,按实际需要,编写的程序 shebang:魔数 magic number) ******************************************************************* bash 实现条件判断: 条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式: [ expression ] [[ expression ]] test expression 整数比较: -eq :测试两个整数是否相等 比如 $A -eq $B 等于为真 // 0 为正确 1-255 表示错误 -ne :测试两个整数是否不等,不等为真 , -gt :测试一个数是否大于另一个数,大于为真,否则为假 -lt :测试一个数是否小于另一个数 -ge :大于或等于 -le :小于或等于 命令间的逻辑关系: 逻辑与: && id user1 &> /dev/null && echo "test" //前面执行成功,继续执行后面,前面不成功后面不执行 逻辑或: || id user1 &> /dev/null && echo "test" //前面执行成功,就完成,不成功就执行后面的 !取反 !id user1 && useradd user1 //分析id user1 查看用户是否存在, //存在为0 ,不存在为1,如果用户不存在取反为0 ,与的关系需要 //执行后半部分,使用种方式添加用户,并检测用户是有以存在 。 变量名称:只能包含字母数字下划线,并且不能以数字开头,不应该和系统中 已有的环境变量重名。最好做到见名知意。 ***************************************************** #!/bin/bash lines=`wc -l /etc/inittab` #echo $lines //判断文件大小, finlines=`echo $lines |cut -d " " -f 1` //与和或的使用 #echo $finlines [ $finlines -gt 100 ] && echo "/etc/inittab is big file" || echo "/etc/inittab is small file" **************************************************************** #!/bin/bash name=root userid=`id -u $name` [ $userid -eq 0 ] && echo "$name is management" ||echo "$name is common user" ******************************************************************************** 条件判断,控制结构: 单分支的if 语句, if 判断条件,then statement1 statement2 ..... fi ———————————————————————————————————————————————————————————— 双分支的if 语句, if 判断条件 ; then statement1 statement2 ..... else statement1 .... fi ______________________________________________________ #!/bin/bash name=test110 if id $name &>/dev/null ;then echo "$name is exists" else useradd $name && echo "$name" | passwd --stdin $name echo "add $name is successful" fi ********************************************************************************* `` 反引号,引用命令执行结果 #!/bin/bash # # # # if grep '^$' /etc/inittab &> /dev/null ; then k_number=`grep '^$' /etc/inittab |wc -l ` echo "/etc/inittab null_line is $k_number" else echo "etc/inittab is null_line is null" fi *******// 判断结构结尾必须有 fi // '^$' 表示空白行 ************************************************************** bash 之算数运算 let 命令: 1. let 算数表达式: let c=$a + $b 2.$ c=$[$a + $b] 3.$(()) c=$(($a+$b)) 4.expr 算数运算表达式,有空格 c=`expr $a + $b` exit :退出脚本 exit number —————————————————————————————————————————————————————— exit命令同于退出shell,并返回给定值。 在shell脚本中可以终止当前脚本执行。 执行exit可使shell以指定的状态值退出。 若不设置状态值参数,则shell以预设值退出。 状态值0代表执行成功,其他值代表执行失败 ——————————————————————————————————————————————————————— 整数测试及特殊变量: ****************************************************** #!/bin/bash # # # # user_name=root_007 if ! grep "^$user_name\>" /etc/passwd &> /dev/null ;then // !取反,如果grep 为真,取反为假,所以不会执行then 的动作, //如果用户不存在为假,取反为真,因此会执行then 的动作 echo "$user_name is non-existent" fi ******************************************************* 文件测试: 整数测试, -gt 大于 -le 小于等于 -ne 不等于 -eq 等于 -ge 大于等于 -lt 小于 number1 -eq number2 :比较number1和number2是否相等。如果相等,测试结果为0 number1 -ne number2 :比较number1和number2是否不相等。如果不相等,测试结果为0 number1 -gt number2 :比较number1是否大于number2。如果number1大于number2,测试结果为0 number1 -lt number2 :比较number1是否小于number2。如果number1小于number2,测试结果为0 number1 -ge number2 :比较number1是否大于等于number2。如果number1大于等于number2,测试结果为0 number1 -le number2 :比较number1是否小于等于number2。如果number1小于等于number2,测试结果为0 测试方法: [ expression ] 命令测试 [[ expression ]] 关键字测试 test 命令: test 命令是shell 环境中测试条件表达式的实用工具 -e file: 测试文件是否存在 -f file:测试文件是否为普通文件 -d file: 测试文件是否为目录 -r -w :测试当前用户对指定文件是否有rxw 权限 -x ------------------------------------------------------- #!/bin/bash # # # file=/etc/indfssfsfsdf if [ -e $file ] ; then echo "$file is exists " else mkdir -p /test_file1 fi ---------------------------------------------------------- #!/bin/bash # # # file=/etc/indfssfsfsdf if [ ! -e $file ] ; then //存在即为真,不存在为假,! 取反, //用户不存在为假,取反为真。执行then echo "$file is exists " exit 8 fi -------------------------------------------------------- 圆整: echo $HISTSIZE echo $HISTFILESIZE history |tail -1 |cut -d ' ' -f 2 //剪裁cut 的使用 多分支的if 语句: if 判断条件1;then statement1 elif 判断条件2 ;then statement2 elif 判断条件3 ;then statement4 else fi 测试脚本是否有语法错误,脚本 bash -n bash -x 将脚本每一步执行都进行输出 echo $? //查询上一条命令执行结果 0 or 1-255 bash 变量类型: 本地变量 {当前shell 进程 ,局部变量} 环境变量 { 当前和子 shell 进程 } 位置变量 $1 $2 shift ,按顺序剔除变量,轮替 shift n : 剔除 n 指定的多个变量 特殊变量 $? 上一条命令的退出状态码 $# 显示参数的个数 $* 参数列表 $@ 参数列表 —————————————————————————————————————————————————————————————— #!/bin/bash # # # if [ -e /etc/$1 ] ;then echo "OK file is $1" elif [ -e /etc/$2 ] ;then echo “OK file is $2” else echo "no such file " fi [root@centos /]# ./test111.sh inittab rc.d #将执行脚本后面跟的inittab #作为变量赋值给$1 和 $2 OK file is inittab [root@centos /]# ./test111.sh inittabggg rc.d “OK file is rc.d” # shell 脚本 # 号表示注释, shebang有两个目的: 说明直接执行时以哪个解释器来执行; 明确该脚本应该以哪个解释器来执行; #!/bin/bash # # # if [ $# -lt 1 ] ;then # $# 的使用,判断在执行时必须给定变量,否则error echo "error" #test123 elif [ -e /etc/$2 ] ;then echo “OK file is $2” else echo "no such file " fi ———————————————————————————————————————————————————————————————————— #!/bin/bash # # # echo "$1" "$2" HE=$[ $1 + $2 ] echo "$HE" JI=$[ $1 * $2 ] echo "$JI" ———————————————————————————————————— #!/bin/bash # # # if [ $# -lt 2 ] ; then echo "you value is <2 " exit 2 # 不符合退出 else echo "$1" "$2" HE=$[ $1 + $2 ] echo "$HE" JI=$[ $1 * $2 ] echo "$JI" fi [root@centos /]# ./test222.sh 123 456 # 将输出的123 和456 作为变量导入脚本,相加和相乘的结果输出 ———————————————————————————————————————————————————————————— 工具: grep , sed , awk sed :流编辑器 ,模式空间 默认不编辑源文件,只对模式空间数据进行处理 sed 'addressCommand' file ... 命令格式 sed [options] 'command' file(s) sed [options] -f scriptfile file(s) d :删除符合条件的行 p : 显示符合条件的行 -n :只显示符合条件的行,和p 配合使用 -n或--quiet或——silent:仅显示script处理后的结果 s :查找并且替换 sed '1,2d' /etc/fstab |wc -l # 删除指定文件fstab 中的1.2两行,将模式空间打印在屏幕上 sed '/oot/d' /etc/fstab |wc -l # 删除包含 oot 的行 选定行的范围 '/字符串/' sed ' /^\//d' /etc/fstab |wc -l #删除以 / 开头的行 ,需要用 \ 进行转义 sed -n ' /^\//p' /etc/fstab #只显示匹配的行,显示处理后的结果 \n 换行符 sed -n ' /^\//a\##################################' /etc/fstab #a\string 在当前行下面插入文本。为在以\ 开头的行下卖弄插入一行##.... sed -n ' /^\//i\##################################' /etc/fstab i\string 在当前行上面插入文本。 sed ' /^\//i\##################################\n$$$$$$$$$$$$$$$$$$$$$$$' /etc/fstab r :file 从file中读行。将指定文件内容添加到符合条件的行处 w :将指定范围内的内容另存至指定文件中 sed '/oot/w out_oot.txt' /etc/fstab #在fstab 文件中过滤包含oot 的行,w 能够将滤出来的行保存至指定文件夹。 sed 's/oot/OOT/' /etc/fstab # s 替换每行中第一次被模式匹配到的字符串 修饰符: g: 全局替换 sed 's/oot/OOT/g' /etc/fstab i: 查找时忽略大小写 s 替换可以使用其他字符作为分隔符,如: s@@@ , s### & :引用模式匹配整个串 sed 's@l..e@&r@g' sed_test.txt #查找l..e 的字符串后面加r 字符 ".." 为模式匹配任意字符 sed 's@l\(..e\)@L\1@g' sed_test.txt 反向引用替换某个单词中的某个字符 -i :-i 选项直接修改源文件 -e : 可以同时执行多个脚本 -f : 调用脚本文件处理 列如: sed /path/sed.script file sed '$d' file # 删除最后一行 sed -i '$d' /etc/fstab # 直接在源文件进行修改,删除最后一行 history |sed 's@^[[:space:]]@@g' |cut -d ' ' -f1 取出history 的序号,删除空格 sed 练习: 1. 删除 /etc/grub.conf 文件中行首的空白字符 sed -r 's@^[[:space:]]+@@g' /etc/grub.conf 2.替换 /etc/inittab 文件中的"id:3:initdefault" 中的数字为5 sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab sed -n 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g'\p /etc/inittab #-n 和p 参数组合使用,只显示修改的参数 #-n选项和p命令一起使用表示只打印那些发生替换的行 3.删除 /etc/inittab 中的空白行 sed '/^$/d' /etc/inittab 4.删除 /etc/inittab 文件中开头的#号 sed 's@^#@@g' /etc/inittab 5.删除文件中以# 号开头的及后面的空白字符,且必须含有空白字符才执行。 sed -r 's@^#[[:space:]]+@@g' /etc/inittab #### -r 参数表示在脚本中使用扩展正则表达式 6.删除空白字符及# 号开头的部分 sed -r 's@^[[:space:]]+#@@g' /etc/inittab 7,取出一个文件中的目录名称 echo "/etc/rc.d" |sed -r 's@^(/.*/)[^/]+/?@\1@g' 字符串测试: == : 使用方法: [ $a = $b ] #等号两边为空格 ,否则为赋值的意思 != :不等号,不等为真 > < -n :测试指定字符串是否为空,空则真,不空则假。 -s :指定字符串是否不空,不空为真,否则假 —————————————————————————————————————————————————————————————————————— #!/bin/bash # # # if ! id $1 &> /dev/null ; then echo "no such user" exit 10 #先判断用户是否存在不存在直接退出 fi if [ 'id -n -u $1' == 'id -n -u $1' ]; then echo "success" else echo "filed" fi ------------------------------------------------------------------------- shell 脚本循环: for 循环 while 循环 until 循环 格式: for value in 列表 ; do declare -i 声明类型格式 循环体 done 如何生成列表: 整数列表:{1..100} seq 100 seq 命令: seq 起始数 步进数 结束数 ---------------------------------------------------------------------- #!/bin/bash # # # declare -i SUM=0 for number in {1..100} ; do let SUM=$[$SUM + $number] done echo "the sum is :$SUM" #计算1加到100的和 #!/bin/bash # # # LINES=`wc -l /etc/passwd | cut -d' ' -f1` for I in `seq 1 $LINES` ; do echo "hello user:`head -n $I /etc/passwd |tail -1 |cut -d: -f1`" done #取出所有用户,并且使用hello user :输出 ------------------------------------------------------------------------- vim 文本编辑器:字处理器 编辑模式: 输入模式 末行模式 模式转换: 编辑到输入: i:在当前光标所在字符的前面插入 a:在当前光标所在字符的后面插入 o: 在当前光标所在行的下方插入一行 I: 定位在当前光标行首 A:当前光标行尾 O:在当前光标上方插入一行 编辑到末行: : 一:打开文件 vim +10 /etc/inittab # 打开文件光标直接处在第10 行 vim + /etc/inittab #快速处在最后一行 vim +/PATTERN :打开文件定位到第一次别pattern 匹配到的行 二:关闭文件 1.末行模式关闭文件 wq :保存并且退出 q :退出 q! : 强行退出 w : 保存 w! :强行保存 x :保存退出 2.编辑模式下退出 ZZ 按键: 保存退出 三。移动光标: 1.逐字符移动 h:左 j:下 k:上 l:右 n+光标键 ,能够快速移动{n 表示数字} 2.逐个单词移动 w :移至下一个单词的词首 e :移至当前或下一个单词词尾 b : 跳至当前或者前一个单词词首 ##都可以使用数字加跳转符号 3.行内跳转 0 :绝对行首 ^ :行首的第一个非空白字符 $ : 绝对行尾 4.行间跳转 G :#G 直接跳转到指定的行例如:50G 末行模式下跳转 :50 ## 直接给出行号即可 四:翻屏 Ctrl +f :向下翻译屏 Ctrl +b :向上翻一屏 Ctrl +d :向下翻半屏 Ctrl +u : 向上翻半屏 五 : 删除单个字符 x ;删除单个字符 #x :可以和数字配合,向后删除,共# 号个字符 六,删除命令:d d$:从光标删除到行尾 d0:从光标删除到行首 dw:逐个删除单个单词 #dw :删除#号个单词 dd :删除当前光标所在行, #dd :删除当前光标往后的行,包含当前行 末行模式: stataddr,endaddrd :删除指定行范围,末行模式 . :表示当前行 $ :最后一行 +# :向下的#行 七。粘贴命令:p p: 如果删除的,或复制的为整行内容分,则粘贴至光标所在行的下方,否则粘贴到光标所在后面 P:如果复制为整行则粘贴到上方,否则粘贴到光标前面 八,复制命令 用法和d 命令相同 九.修改:c ,先修改再进入输入模式 用法同d 命令 十.替换 r r: 单个字符替换 R:进入替换模式,替换多个字符,非常好的功能 十一. 撤销编辑操作 u :撤销前一次编辑操作 连续u命名可撤销之前的操作,最多5次 #u 直接撤销最近的操作,# 号代表数字 撤销最近一次撤销操作: Ctrl + r 十二: 重复前一次编辑操作 "." 符号 十三. 可视化模式 v: 按照字符选取 V:按照块删除 十四:查找 /PARRERN :向下 ?PATTERN :向上 n :向下 N : 向上 十五,替换 s/value1/value2/g g:全局替换 i:忽略大小写 :%s/echo/yue/g #将全文中的echo 替换为yue "%" 符号和1,$ 相同 。表示全文,指定全文查找并替换 ".",$:表示从当前行到行尾 %s@"ftp://wwww"@www.com@g ##最后分隔符不用转义 十六: vim 编辑多个文件 vim 可以跨文件使用 vim file1 file2 file3 末行模式下 :next 切换到下一个文件 :prev 切换到前一个文件 :last 切换到最后一个文件 :first 切换到第一个文件 :qa 退出所有文件 十七:分屏显示 Ctrl +w ,s 水平分屏显示 Ctrl +w ,v :垂直拆分窗口 在窗口之间切换 Ctrl +w ,方向键 :qa 关闭所有窗口 十八,分窗口多个文件 vim -o file1 file2 vim -O file1 file2 十九,将当前文件中部分内容保存到另外一个文件 末行模式下使用w 命令 :w :w /etc/file #指定目录文件 :addr.addew /etc/file #将某一部分保存 二十.将另外一个文件内容填充到当前文件中 :r /etc/abc.txt #命令为r 二十一,跟shell 交互 :! command 二十二,高级功能 1.显示行号 set number 简写set null 2.取消显示 set nonu 3.忽略大小写 :set ic :set ignorecase :set noic 4.缩进 :set autoindent :set ai :set noai 5.搜索高亮 :set hlsearch :set nohlsearch 6.语法高亮 :syntax on 开 :syntax off 关 二十三,配置文件 /etc/vimrc 全局配置 家目录 .vimrc 单个用户影藏配置文件 --------------------------------------------------------------------- #!/bin/bash # # for I in {1..10}; do if id user$I &>/dev/null ;then echo "user$I is exists." userdel -r user$I #else # useradd user$I # echo user$I |passwd --stdin user$I &>/dev/null fi done #添加用户删除用户练习 -------------------------------------------------------------------- #!/bin/bash # echo "$#" # "$#" 检查输入变量个数 if [ $# -lt 1 ] ;then #判断是否小于1 echo "you enter is null" exit 1 #退出 ,失败编码1 fi if [ $1 == "add" ];then #if 判断 for I in {1..10} ;do #for 循环 if id user$I &>/dev/null ;then echo "user:user$I is exists." else useradd user$I echo user$I |passwd --stdin user$I &>/dev/null echo "user$I is add" fi done elif [ $1 == "del" ];then for I in {1..10} ;do if id user$I &>/dev/null ;then userdel -r user$I echo "user$I is delete" else useradd user$I echo "user:user$I is add" fi done else echo "unknown enter" exit 8 fi ------------------------------------------------------------------------------------------------- for 循环 for I in {1.2.3.4} ;do done if 判断 if id $I &>/dev/null ; then command if --------------------------------------------------------------- #!/bin/bash # # echo $1 for I in `echo $1 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done ###添加列表用户 ./adminuser2.sh user1,user100,user200 ### `` 反引号,引用命令执行结果 ———————————————————————————————————————————————————————————————————————————— #!/bin/bash # # echo $1 $2 if [ $1 == "--add" ];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [ $1 == '--del' ]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done else echo "you write is error" exit 1 fi ### 添加和删除用户的测试脚本 ###输入内容如下 #[root@centos test]#./adminuser2.sh --del tom1,tom2,tom3 #[root@centos test]#./adminuser2.sh --add tom1,tom2,tom3 -------------------------------------------------------------------- #!/bin/bash # # echo $1 $2 if [[ $1 == "--add" ]];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [[ $1 == '--del' ]]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done else echo "you write is error" exit 1 fi ###和上面脚本的区别,命令比较和关键字比较 #[ EXPIESS ] 命令比较如 :[ $1 -lt 2 ] #[[ express ]] 关键字比较 : [[ $1 == '--del' ]] ---------------------------------------------------------------------------------------------- usage :用法的意思,列入下面的使用 #!/bin/bash # # echo $1 $2 if [[ $1 == "--add" ]];then for I in `echo $2 |sed 's/,/ /g'`; do if id $I &> /dev/null ;then echo "$I exists." else useradd $I echo $I |passwd --stdin $I &> /dev/null echo "add $I finished." fi done elif [[ $1 == '--del' ]]; then for aaa in `echo $2 |sed 's/,/ /g'` ;do if id $aaa &> /dev/null ;then echo "$aaa del exists." userdel $aaa else echo "del user is not exists." fi done elif [[ $1 == '--help' ]];then echo "usage:adminuser2.sh -add or -del USERNAME1,USERNAME2" else echo "you write is error" exit 1 fi ------------------------------------------------------------------- 组合条件测试: 整数测试 le lt ge gt eq ne 字符测试 文件测试 组合测试: -a:与关系 -o:或关系 ! :非关系 大于1 小于3 if [ $# -gt 1 -a $# -le 3 ] if [ $# -gt 1 ] && [ $# -le 3 ] 两种写法 ---------------------------------------------------- #!/bin/bash # # # if [ $1 == 'q' -o $1 == 'Q' -o $1 == 'Quit' ]; then echo "quiting......start" exit 0 else echo "you write $1 is error" exit 1 fi #或参数的使用 -o -------------------------------------------------------- #!/bin/bash # # # if [ ! \($1 == 'q' -o $1 == 'Q' -o $1 == 'Quit'\) ]; then echo "quiting......start" exit 0 else echo "you write $1 is error" exit 1 fi ###取反和反斜线转义的使用 ------------------------------------------------------------ 摩根定律 :非A 或 非B 表示 交集 let I=$[$1+1] let SUM+=$I 变量I 本身加 let I+=1 -= 相当于I-- += 相当于I++ /= %= --------------------------------- declare -i M # 声明整型变量M ------------------------------------- #!/bin/bash # # declare -i ji_sum=0 declare -i ou_sum=0 for number in {1..100} ; do if [ $[$number%2] -eq 0 ];then let ou_sum+=$number else let ji_sum+=$number fi done echo "ji_sum:$ji_sum" echo "ou_sum:$ou_sum" #脚本取出奇数的和和偶数的和 #declare -i 定义整数变量 # let ou_sum+=$number # 在ou_sum 定义0 的基础上,循环加上$I 定义的偶数 #奇数同理 ------------------------------------------- 文件查找:is not 文本查找 locate :全系统查找文件,非实时的,根据文件数据库查找的 locate命令和slocate命令都用来查找文件或目录。 locate命令其实是find -name的另一种写法,但是要比后者快得多, 原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb, 这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库, 并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。 为了避免这种情况,可以在使用locate之前,先使用updatedb命令, 手动更新数据库。 updatedb :手动更新文件数据库 find : 实时 精确 支持众多查找标准 遍历指定目录中所有文件,速度慢 usage : find 查找路劲 查找标准 查找后的处理动作 查找路径:默认为当前路径 查找标准: 默认为指定路径下的所有文件 处理动作; 默认为显示 匹配标准: -name 'filename' :对文件名做精确匹配 文件名通配: * find -name '*passwd*' :表示出现在任意位置 ? [] -iname : 表示查找文件名时不区分大小写 -regex pattern :基于正则表达式的文件名匹配 -user USRENAME : 根据属主查找,查找指定用户的文件 -group GROUPNAME ;根据属组查找 -uid UID :根据UID 查找 用户删除后 ,属主就是uid -gid GID :根据GID 查找 -nouser :没有属主的文件 -nogroup :没有属组的文件 -type: f:普通文件 d:目录 c b l p s find /etc/tmp -type s -size k M G 组合条件: -a 与 -o 或 -not 非 find /tmp/ -not \( -user user1 -o -user user2 \) #查找属主既不是user1 的也不是user2 的文件 UNIX/Linux文件系统每个文件都有三种时间戳: 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。 + 大于5天 - 小于5天 ,啥没有表示正好5天 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。 -perm MODE #精确匹配 perm<权限数值>:查找符合指定的权限数值的文件或目录 / 斜杠任意一位满足 - 减号精确匹配 动作:action -print :显示 -ls :类似 ls -l 的形式显示每个文件的详细情况 -ok COMMAND {} \; find .-type f -user root -exec chown tom {} \; #找出当前目录下所有root的文件,并把所有权更改为用户tom -ok 和-exec 的区别就是-ok 的每一步执行都需要确认 stat 显示文件状态 xargs : xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具 -------------------------------------------------------------------------------- 特殊权限 SUID :运行程序时,进程的属主是程序自身的属主而不是启动着 chmod u+s FILE chmod u-s FILE 如果文件本身有执行权限,则SUID 为s ,否则S 大写 -rwsr-xr-x 1 root root 25248 Mar 21 2012 /bin/cat 执行时使用root 用户执行,而不是执行命名的普通用户 ------------------------------------------------------------------- SGID :运行程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组 chmod g+s chmod g-s --------------------------------------------------------------------- sticky :在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件 chmod o+t chmod o-t chmod 1755 /backup/test 表示添加sticky 权限 ************************************************* 文件系统访问列表: FACL :filesystem access control list 利用文件扩展保存额外的访问控制权限 setfacl 设置 -m :设定 -x :取消设定 -d :为目录设置扩展属性 ,里面的都继承 u :设定用户 g: 设定组 列入:setfacl -m user:john:rw- ./test.txt #设定权限 setfacl -x user:zy inittab #取消设定,不需要指定用户权限 setfacl -d -m user:john:rw ./dir #目录下的文件都被john 访问 -------------------------------------------------------- [root@centos test1]# getfacl inittab # file: inittab # owner: root # group: root user::rw- user:zy:rw- group::r-- mask::rw- //mask 不强制会随着用户的改变而变化 other::r-- ----------------------------------------------------- getfacl 获取 查看某个文件acl ******************************* who: 显示目前登录用户的信息 whoami :显示当前有效用户名称 和 id -un 作用相同 w :显示登录用户和正在做什么 last :显示用户登录及登录时间信息 显示 /var/log/wtmp 文件信息 lastb : /var/log/btmp 显示错误的登录信息 lastlog :显示系统中所有用户最近一次登录信息 /var/log/lastlog mail : 命令行电子邮件发送接收工具 basename :打印文件或目录的基本名称 $0 命令本身,执行脚本时的路劲和名称 -------------------------------- [root@centos log]# cat test123.sh #!/bin/bash echo " 'basename $0' " [root@centos log]# [root@centos log]# [root@centos log]# ./test123.sh 'basename ./test123.sh' ----------------------------- *************************************************** 重定向发送邮件 echo "hello,this is the content of mail.welcome to www.linuxde.net" | mail -s "Hello from linuxde.net by pipe" admin@linuxde.net echo 为邮件正文内容 mail -s "Hello from linuxde.net by file" admin@linuxde.net < mail.txt #使用上面的命令后,我们就可以把mail.txt文件的内容作为邮件的内容发送给admin@linuxde.net了。 ********************************************************************************** 随机数 RANDOM :0-32768 随机数生成器: /dev/random /dev/urandom echo -n :参数表示不输出尾随的换行符 ************************************* ***************************************************** #!/bin/bash # max=0 #min=0 for nub in {1..10}; do myrandom=$RANDOM [ $nub -eq 1 ] && min=$myrandom if [ $nub -le 9 ];then echo -n "$myrandom," else echo "$myrandom" fi [ $myrandom -gt $max ] && max=$myrandom [ $myrandom -lt $min ] && min=$myrandom done echo "$max,$min ###取出10 个随机数找出最大和最小 ************************************************************************ bash -n :检测语法错误 bash -x :显示详细执行过程 多分支if 语句 ***************************************** 常用格式 case 字符串 in 模式) 语句 ;; 模式2 | 模式3) 语句 ;; *) 默认执行的 语句 ;; esac 提示:esac就是case反过来写。 ****************************************************** case 语句,选择结构,结构明晰 case SWITCH in value1) statement ... ;; value2) statement ... ;; *) statement ... ;; esac -------------------------------- 列子:case 是bash 的多多分支判断语句的一种 #!/bin/bash # case $1 in [0-9]) echo "$1 IS number" ;; [A-Z]) echo "$1 is character" ;; *) echo "$1 is error character" ;; esac ----------------------------------------------------- **************************************** 只接受start ,stop ,restart ,status #!/bin/bash # case $1 in 'start') echo "start server ..." ;; 'stop') echo "stop server ..." ;; 'restart') echo "restart server ..." ;; 'status') echo "running ..." ;; *) echo "`basename $0` {start|stop|restart|status}" ;; esac ##注意多分支判断每个判断结束都要在后面加上;; **************************************************** #!/bin/bash # case $1 in -v|-verbose) echo "hello" ;; *) echo "unknown options" exit 7 ;; esac ##case 多分支判断以上就是Linux 命令行手记的详细内容,更多关于Linux 命令行手记的资料请关注九品源码其它相关文章!