linux笔记

来源:互联网 发布:winXP关闭防火墙端口 编辑:程序博客网 时间:2024/06/08 12:28

linux笔记-x

  • linux笔记-x
    • 1常用命令
      • 1文件及目录
        • 11文件及目录命令
        • 12显示文件
        • 13文件权限
      • 2用户和组的管理
      • 3tomcat命令
      • 4mysql命令
      • 5其他命令
    • 2Shell编程
      • 1shell概述及优势
      • 2shell创建执行
      • 3shell 变量引号数组传递参数
      • 4shell 运算符
        • 41算术运算符
        • 42关系运算符
        • 43布尔运算符
        • 44字符串运算符
        • 45文件测试运算符
      • 5shell 常用命令
        • 51shell echo命令
        • 52shell printf命令
        • 53shell test命令
      • 6shell 流程控制
        • 61if
        • 62for
        • 63while
        • 64until
        • 65case
        • 66break和continue
      • 7shell 函数
      • 8shell 输入输出重定向
      • 9shell 文件包含
    • 3vi命令详解
    • 4其他
      • 1修改linux时间
      • 2星期月份英语

2017年8月22日-至今

标签(空格分隔): linux xyq

此linux笔记是本人常用的linux的命令及学习笔记,是markdown文件,可在有道云、作业部落等软件查看,也可用txt文本查看,此处可下载http://download.csdn.net/download/xu180/9984967

1、常用命令

1.1、文件及目录

1.1.1、文件及目录命令

==============================================================进入目录         cd dir1创建目录         mkdir dir1   创建多级目录     mkdir -p  d1/d2/d3   查看当前目录     pwd复制文件            cp srcname  targetname修改名称(移动文件)  mv readme.txt readme.docrm a.txt  删除普通文件a.txtrm -r a/  删除目录arm -rf  a/  强制删除目录a-f  表示强制查看磁盘空间     df-h查看文件大小     du -h filepath 查看文件夹中的文件大小  ls -lh压缩tar:tar -zcvf /home/love.tar.gz /home/yx/love解压tar: tar -zxvf /home/love.tar.gz压缩zip:  zip  test.zip  test解压zip:  unzip test.zip模糊查找当前目录文件   find *txt从根目录查找文件       find / -name mysqld 查找文件               find /home -name 'mysqld.log' -type f -print查找目录               find / -name 'tech' -type d -print查找当前目录及子目录文件(maxdepth指层数)  find . -name "*root*" -maxdepth 1显示当前目录所有文件   ls显示当前目录所有文件及文件大小 ls -hl模糊查找文件 ls /etc/rc.d/init.d/my*      ls name*file test            显示文件或目录类型which test           查询程序的位置wc testfile           # testfile文件的统计信息  3 92 598 testfile     # testfile文件的行数为3、单词数92、字节数598 ls -lt  从新到旧       ls -hlt  从新到旧并显示大小ls -lrt 从旧到新ls -hSlr 按大小升序ls -hSl  按大小降序按时间降序 ll -t按时间升序 ll -t | tacvi 操作:  : wq (输入「wq」,存盘并退出vi): q! (输入q!, 不存盘强制退出vi)查找  /关键字按「G」:移动到文章的最后。按「g」:移动到文章的开头。dd  : 删除当前行x   : 删除光标位置字符[root @root /root]#cat /etc/passwd | more该命令使用了管道“|”,命令cat /etc/passwd的输出是管道的输入,经过管道后,成为了命令more的输入。使用命令“ls –l”可以显示文件的类别,每个输出行中的第一个字符表示的就是文件的类别,例如,“b”代表块设备,“p”代表管道文件,“c”代表字符设备,“d”代表目录文件。==============================================================

1.1.2、显示文件

==============================================================cat  test.txt        显示文件开头tac  test.txt        显示文件结尾more test.txt        逐页显示文件 less test.txt        逐页显示文件(优化more)head -n 20 test.txt  显示文件前20行tail -n 20 test.txt  显示文件后20行如果文件太长,用cat命令只能看到文件的最后一页,而用more命令时可以一页一页地显示。执行more命令后,进入more状态,用【Enter】键可以向后移动一行;用【Space】键可以向后移动一页;用“q”键可以退出。在more状态下还有许多功能,可用man more命令获得。less实际上是more的改进版,其命令的直接含义是more的反义。less的功能比more更灵活。例如:用【Pgup】键可以向前移动一页,用【Pgdn】键可以向后移动一页,用向上光标键可以向前移动一行,用向下光标键可以向后移动一行。“q”键、【Enter】键、【Space】键的功能和more类似。用【G】键可以移动文件到结尾,用【g】键可以移动到文件开头。==============================================================

1.1.3、文件权限

==============================================================改变文件属性(二进制)      chmod #chmod 664 chap1.txt        110110010  改变文件属性(字母)        chmod u=rw,g=rw,o=r chap1.txt    r w x改变文件所属用户            chown user1 chap1.txt改变文件所属用户及所属组    chown user1:root chap1.txt改变文件所属组              chgrp root chap1.txtLinux系统是个多用户系统,应该能做到不同的用户能同时访问不同的文件,因此一定要有文件权限控制机制。Linux系统的权限控制机制和Windows的权限控制机制有着很大的差别。Linux的文件或目录都被一个用户拥有时,这个用户称为文件的拥有者(或所有者),同时文件还被指定的用户组所拥有,这个用户组称为文件所属组。 用户 u --所属组 g --其他用户 o -- 所有用户 a user - group - other - all要说明的是,一个用户可以是不同组的成员,这可以由管理员控制,我们将在用户管理这一章介绍如何控制的问题。文件的权限由权限标志来决定,权限标志决定了文件的拥有者、文件的所属组、其他用户对文件访问的能力。可以使用“ls –l”命令来显示权限标志。例如:[test @redflag test]$ls -l-rw-rw-r-- 1 longkey root 16 20A 24 22:23 chap1.txt本例中,文件chap1.txt的拥有者是longkey,所属组是root。这里我们特别关心的是输出行前面的第110个字符。第1个字符代表文件类别,第24个字符“rw-”是文件拥有者的权限,第57个字符“rw-”是文件所属组的权限,第810个字符“r--”是其他用户(即除了root用户和longkey用户组里的用户之外的用户)文件拥有者的权限。而权限均用三个字符表示,依次为读(r)、写(w)、执行(x),如果某一位为“-”,则表示没有相应的权限,例如:“rw-”表示有读、写的权限,没有执行的权限。在本例中,文件拥有者longkey用户对文件有读、写的权限,root组的所有用户对文件也有读、写的权限,而其他用户对文件只有读的权限。设定文件权限时,在模式中常用以下的字母代表用户或用户组:u——文件的拥有者;g——文件的所属组;o——其他用户;a——代表所有用户(即u+g+o)。权限用以下字符表示:r ——读权限;w——写权限;x——执行权限;最后要指明是增加(+)还是减少(-)权限,或是绝对权限(=)。 [root @redflag /root]chmod o+w chap1.txtchap1.txt的权限由原来的“rw-rw-r--”变为“rw-rw-rw-”,表示增加其他用户对文件的写权限。 [root @redflag /root]chmod u=rw,g=rw,o=r chap1.txt  chap1.txt的权限变为“rwxrw-r---”,不论原来的权限是什么,这表示拥有者对文件有读、写的权限,所属组的用户对文件也有读、写的权限,而其他用户只有读的权限。我们在以上设置权限时,用字符表示权限和用户,实际上我们也经常使用八进制来表示。读、写、执行依次各自对应一个二进制位“???”,如果某位为“0”,则表示无权限;如果某位为“1”,则表示有权限。例如:文件权限为r---w---x时,用二进制表示为100010001,用十进制可以表示为421。例如:         [root @redflag /root]#chmod 664 chap1.txt  等同于:  [root @redflag /root]#chmod u=rw,g=rw,o=r chap1.txtchown 用户名 文件或目录名——改变文件(或目录)的拥有者或所属组       例如:     [root @redflag /root]#chown longkey chap1.txt把文件chap1.txt的拥有者改为longkey用户。     [root @redflag /root]#chown longkey:root chap1.txt把文件的拥有者改为longkey用户,同时文件的所属组改为root组。chgrp组 文件或目录——改变文件或目录的所属组     chown可以同时改变文件拥有者和所属者,chgrp只具有改变所属组的功能。例如:    [root @redflag /root]#chgrp root chap1.txt        文件chap1.txt的所属组设为root组。==============================================================

1.2、用户和组的管理

==============================================================su         切换rootsu user1   切换用户groups         查看当前用户所在组groups  user1  查看user1用户所在的组whoami         查看当前登录用户名/etc/group  文件包含所有组及用户/etc/shadow和/etc/passwd系统存在的所有用户名创建用户      useradd  user1;设置用户密码  passwd user1;删除用户      userdel user1;删除用户(包括主目录文件 /home/user1)  userdel -r user1;groupadd testgroup  组的添加groupdel testgroup  组的删除只有root和组管理员能够改变组的成员:gpasswd –a user1 users    把 user1加入users组gpasswd –d user1 users    把 user1退出users组groupmod –n user users    修改组名user为users锁定用户  passwd -l user1解锁用户  passwd -u user1用户添加到组usermod -a -G groupA user-a 代表 append, 也就是 将自己添加到 用户组groupA 中,而不必离开 其他用户组==============================================================

1.3、tomcat命令

==============================================================Linux下Tomcat的启动、关闭、杀死进程   (进入tomcat的bin目录 启动 sh startup.sh)    打开终端    进入tomcat目录    cd /Java/tomcat    #执行    bin/startup.sh #启动tomcat    bin/shutdown.sh #停止tomcat    tail -f logs/catalina.out #看tomcat的控制台输出;    #看是否已经有tomcat在运行了    ps -ef |grep tomcat     #如果有,用kill;    kill -9 pid #pid 为相应的进程号    例如 ps -ef |grep tomcat 输出如下    sun 5144 1 0 10:21 pts/1 00:00:06 /java/jdk/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/java/tomcat/common/endorsed -classpath :/java/tomcat/bin/bootstrap.jar:/java/tomcat/bin/commons-logging-api.jar -Dcatalina.base=/java/tomcat -Dcatalina.home=/java/tomcat -Djava.io.tmpdir=/java/tomcat/temp org.apache.catalina.startup.Bootstrap start    则 5144 就为进程号 pid = 5144    kill -9 5144 就可以彻底杀死tomcat查看tomcat    ps -ef |grep tomcat 杀死tomcat     kill -9 pid        //pid 为相应的进程号启动tomcat    /opt/tech/appStoreServer/apache-tomcat-6.0.35/bin/startup.sh==============================================================

1.4、mysql命令

==============================================================指令 ps -ef|grep mysql 得出结果    root     17659     1  0  2011 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid       mysql    17719 17659  0  2011 ?        03:14:57 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/var/lib/mysql/mysql.sock  usr/bin/mysql 是指:mysql的运行路径var/lib/mysql 是指:mysql数据库文件的存放路径usr/lib/mysql 是指:mysql的安装路径 导出mysql数据 /opt/tech/mysql/bin/mysqldump -uroot -p2344 webplus > /opt/tech/20170814.sql登录mysql  /opt/tech/mysql/bin/mysql -uroot -p2344             /opt/tech/mysql/bin/mysql -uroot -padmin创建、使用数据库   create database test;  use test;导入sql数据     source /root/20151010.sql修改max_allowed_packet  vi /etc/my.cnflinux 的mysql配置文件  /etc/my.cnf==============================================================

1.5、其他命令

==============================================================查看系统空间容量       df -h 树状结构展示目录       tree             yum  install tree  安装tree命令      man tree           查询tree命令查看linux版本      cat /proc/version      lsb_release -a查看linux内核版本  uname -a建立链接 ln -fs /opt/tech/mysql/bin/mysql /usr/local/bin/mysql删除链接 rm -rf name查看时间           date查看指定年月日历   cal 3 2013查看ip             ifconfig清楚屏幕           clearhelpman ls  查看命令手册输出重定向 ls>dir.txt查看所有别名   alias添加别名       alias test="tar -zcvf "删除别名       unalias test显示10行历史记录命令     history 10历史记录显示时间         在/etc/profile 中增加  export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "查看java版本         java -version查询所有安装软件     rpm -qa查看是否安装软件     rpm -qa | grep java关机/重启机器shutdown     -r             关机重启     -h             关机不重启     now          立刻关机halt               关机reboot          重启fdisk -l——显示所有分区的信息xshell5上传下载安装命令:yum install lrzsz(安装此命令linux需要能上网)从服务端发送文件到客户端(下载):sz filename从客户端上传文件到服务端(上传):rz centos7虚拟机不能上网    在存储linux目录的CentOS.vmx文件加入  ethernet0.virtualDev = "e1000"  再重启虚拟机linux虚拟机上传下载文件  打开虚拟机linux,使用命令 ifconfig 查看ip,再使用xshell连接。查看环境变量 echo $PATH[root@localhost bin]# echo $PATH/opt/jdk1.6.0_26/bin:/opt/jdk1.6.0_26/jre/bin:/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/bin==============================================================

2、Shell编程

2.1、shell概述及优势

==============================================================  Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序调用。  当普通用户成功登录后,系统将执行一个称为Shell的程序。正是Shell进程提供了命令行提示符。作为默认值,对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。  Linux中的Shell有多种类型,其中最常见的是Bourne Shell (sh)、C Shell (csh)和Korn Shell (ksh)。三种Shell各有优缺点。Bourne ShellUnix最初始的Shell,并且在每种Unix上都可以使用。Bourne ShellShell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种ShellBash(Bourne Again Shell)是Bourne Shell的扩展,与Bourne Shell完全向下兼容,并且增加了许多特性。它还包含了很多C ShellKorn Shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。  C Shell是一种比Bourne Shell更适于编程的Shell,它的语法与C语言很相似。Linux为喜欢使用C Shell的人员提供了TcshTcshC Shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写矫正、历史命令替换、作业控制和类似C语言的语法,它提供比Bourne Shell更多的提示符参数。  Korn Shell集合了C ShellBourne Shell的优点并且和Bourne Shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。    Bash是大多数Linux系统(包括红旗Linux系统)的默认ShellBash有以下的优点:    (1) 补全命令。当你在Bash命令提示符下输入命令或程序名时,你不必输全命令或程序名,按【Tab】键,Bash将自动补全命令或程序名。    (2) 通配符。在Bash下可以使用通配符“*”和“?”。“*”可以替代多个字符,而“?”则替代一个字符。    (3) 历史命令。Bash能自动跟踪用户每次输入的命令,并把输入的命令保存在历史列表缓冲区。缓冲区的大小由HISTSIZE变量控制。当用户每次登录后,home目录下的“.bash_history”文件将初始化历史列表缓冲区。也能通过history和fc命令执行、编辑历史命令。    (4) 别名。在Bash下,可用alias和unalias命令给命令或可执行程序起别名和清除别名,这样就可以用自己习惯的方式输入命令。    ```      查看所有别名   alias     添加别名       alias test="tar -zcvf "     删除别名       unalias test    ```     (5)输入/输出重定向。输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上。输入重定向的命令是“<”,输出重定向的命令是“>”    ```      ① 输入重定向:    [root@redflag /root]#wc</etc/passwd    20 23 726    ② 输出重定向:    [root@redflag /root]#ls>dir.out                            上面命令将ls命令的输出保存为文件dir.out。    [root@redflag /root]#ls>>dir1.out    “>>”表示要将一条命令的输出结果追加到文件dir1.out的后面,该文件的原有内容不被破坏,如果使用“>”,则文件原有内容被覆盖。    ```      (6) 管道。管道用于将一系列的命令连接起来,也就是把前面命令的输出作为后面命令的输入。管道的命令是“|”。    ```     root@redflag /root]# cat dir.out|grep "test "|wc –l    管道将cat命令(列出一个文件的内容)的输出送给grep命令,grep命令在输入里查找单词test,grep的输出则是所有包含单词test的行,这个输出又被送给wc命令,wc命令统计出输入中的行数。    ```     (7) 提示符。    (8) 作业控制。    最简单的方式是执行echo命令,查询系统环境变量的值:    [root@redflag /root]# echo $SHELL    /bin/bash==============================================================

2.2、shell创建、执行

==============================================================    Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本。一、创建 Shell 脚本    打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。    输入一些代码,一般是这样:    ```        #!/bin/bash        echo "Hello World !"    ```    #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。    ① 如果Shell脚本的第一个非空白字符不是“#”,则它会使用Bourne Shell。    ② 如果Shell脚本的第一个非空白字符是“#”,但不是以“#!”开头时,则它会使用C Shell。    ③ 如果Shell脚本以“#!”开头,则“#!”后面所跟的字符串就是所使用Shell的绝对路径名。Bourne Shell的路径名称为/bin/sh,而C Shell则为/bin/csh。    echo 命令用于向窗口输出文本。二、运行 Shell 脚本有两种方法:    1、作为可执行程序    将上面的代码保存为 test.sh,并 cd 到相应目录:    ```    chmod +x ./test.sh  #使脚本具有执行权限    ./test.sh  #执行脚本    ```    注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。    2、作为解释器参数    这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:    ```    /bin/sh test.sh    /bin/php test.php    ```    这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。==============================================================

2.3、shell 变量、引号、数组、传递参数

==============================================================http://www.runoob.com/linux/linux-shell-variable.html 转自菜鸟教程test="测试引号"echo "双引号 this is a ${test}"echo '单引号 this is a ${test}'echo "反引号 当前目录pwd `pwd` "`变量:`注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:首个字符必须为字母(a-z,A-Z)。中间不能有空格,可以使用下划线(_)。不能使用标点符号。不能使用bash里的关键字(可用help命令查看保留关键字)。#使用一个定义过的变量,只要在变量名前面加美元符号即可,如:your_name="qinjx"echo $your_nameecho ${your_name}变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界`单引号:`#单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单引号(对单引号使用转义符后也不行)`双引号:`    your_name='qinjx'    str="Hello, I know your are \"$your_name\"! \n"双引号的优点:#双引号里可以有变量双引号里可以出现转义字符`数组:`#!/bin/sharr=(12 '单引号' “双引号” 22)echo "第二个值:" ${arr[1]}echo “所有元素:” ${arr[@]}echo "数组长度: ${#arr[@]}"数组赋值 my_array[0]=A `注释`以"#"开头的行就是注释,会被解释器忽略。'传递参数:'参数处理    说明$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2$n"的形式输出所有参数。$$    脚本运行的当前进程ID号$! 后台运行的最后一个进程的ID号$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2""$n" 的形式输出所有参数。$- 显示Shell使用的当前选项,与set命令功能相同。$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
参数处理 说明 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
$* 与 $@ 区别:相同点:都是引用所有参数。不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 123,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。#!/bin/bash# author:菜鸟教程# url:www.runoob.comecho "传递参数个数 \$# $#"echo "-- \$* 演示 ---"for i in "$*"; do    echo $idoneecho "-- \$@ 演示 ---"for i in "$@"; do    echo $idone执行脚本,输出结果如下所示:$ chmod +x test.sh $ ./test.sh 1 2 3#或/bin/sh test.sh 1 2 3-- $* 演示 ---1 2 3-- $@ 演示 ---123==============================================================

2.4、shell 运算符

==============================================================原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):#!/bin/bashval=`expr 2 + 2`echo "两数之和为 : $val"两点注意:表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。EQ 就是 EQUAL等于NQ 就是 NOT EQUAL不等于 GT 就是 GREATER THAN大于  LT 就是 LESS THAN小于 GE 就是 GREATER THAN OR EQUAL 大于等于 LE 就是 LESS THAN OR EQUAL 小于等于

2.4.1、算术运算符

`算术运算符`下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:运算符 说明  举例+   加法  `expr $a + $b` 结果为 30。-   减法  `expr $a - $b` 结果为 -10。*   乘法  `expr $a \* $b` 结果为  200。/   除法  `expr $b / $a` 结果为 2。%   取余  `expr $b % $a` 结果为 0。=   赋值  a=$b 将把变量 b 的值赋给 a。==  相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。!=  不相等。用于比较两个数字,不相同则返回 true。   [ $a != $b ] 返回 true#注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。算术运算符实例如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.coma=10b=20val=`expr $a + $b`echo "a + b : $val"val=`expr $a - $b`echo "a - b : $val"val=`expr $a \* $b`echo "a * b : $val"val=`expr $b / $a`echo "b / a : $val"val=`expr $b % $a`echo "b % a : $val"if [ $a == $b ]then   echo "a 等于 b"fiif [ $a != $b ]then   echo "a 不等于 b"fi执行脚本,输出结果如下所示:a + b : 30a - b : -10a * b : 200b / a : 2b % a : 0a 不等于 b注意:乘号(*)前边必须加反斜杠(\)才能实现乘法运算;if...then...fi 是条件语句,后续将会讲解。在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。

2.4.2、关系运算符

`关系运算符`关系运算符只支持数字,不支持字符串,除非字符串的值是数字。下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:运算符 说明  举例-eq 检测两个数是否相等,相等返回 true。    [ $a -eq $b ] 返回 false-ne 检测两个数是否相等,不相等返回 true。   [ $a -ne $b ] 返回 true-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。   [ $a -ge $b ] 返回 false。-le 检测左边的数是否小于等于右边的,如果是,则返回 true。   [ $a -le $b ] 返回 true。关系运算符实例如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.coma=10b=20if [ $a -eq $b ]then   echo "$a -eq $b : a 等于 b"else   echo "$a -eq $b: a 不等于 b"fiif [ $a -ne $b ]then   echo "$a -ne $b: a 不等于 b"else   echo "$a -ne $b : a 等于 b"fiif [ $a -gt $b ]then   echo "$a -gt $b: a 大于 b"else   echo "$a -gt $b: a 不大于 b"fiif [ $a -lt $b ]then   echo "$a -lt $b: a 小于 b"else   echo "$a -lt $b: a 不小于 b"fiif [ $a -ge $b ]then   echo "$a -ge $b: a 大于或等于 b"else   echo "$a -ge $b: a 小于 b"fiif [ $a -le $b ]then   echo "$a -le $b: a 小于或等于 b"else   echo "$a -le $b: a 大于 b"fi执行脚本,输出结果如下所示:10 -eq 20: a 不等于 b10 -ne 20: a 不等于 b10 -gt 20: a 不大于 b10 -lt 20: a 小于 b10 -ge 20: a 小于 b10 -le 20: a 小于或等于 b

2.4.3、布尔运算符

`布尔运算符`下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:运算符 说明  举例!   非运算,表达式为 true 则返回 false,否则返回 true。  [ ! false ] 返回 true。-o  或运算,有一个表达式为 true 则返回 true。  [ $a -lt 20 -o $b -gt 100 ] 返回 true-a  与运算,两个表达式都为 true 才返回 true。  [ $a -lt 20 -a $b -gt 100 ] 返回 false。实例布尔运算符实例如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.coma=10b=20if [ $a != $b ]then   echo "$a != $b : a 不等于 b"else   echo "$a != $b: a 等于 b"fiif [ $a -lt 100 -a $b -gt 15 ]then   echo "$a 小于 100 且 $b 大于 15 : 返回 true"else   echo "$a 小于 100 且 $b 大于 15 : 返回 false"fiif [ $a -lt 100 -o $b -gt 100 ]then   echo "$a 小于 100 或 $b 大于 100 : 返回 true"else   echo "$a 小于 100 或 $b 大于 100 : 返回 false"fiif [ $a -lt 5 -o $b -gt 100 ]then   echo "$a 小于 5 或 $b 大于 100 : 返回 true"else   echo "$a 小于 5 或 $b 大于 100 : 返回 false"fi执行脚本,输出结果如下所示:10 != 20 : a 不等于 b10 小于 10020 大于 15 : 返回 true10 小于 10020 大于 100 : 返回 true10 小于 520 大于 100 : 返回 false逻辑运算符以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:运算符 说明  举例&&  逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false||  逻辑的 OR  [[ $a -lt 100 || $b -gt 100 ]] 返回 true实例逻辑运算符实例如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.coma=10b=20if [[ $a -lt 100 && $b -gt 100 ]]then   echo "返回 true"else   echo "返回 false"fiif [[ $a -lt 100 || $b -gt 100 ]]then   echo "返回 true"else   echo "返回 false"fi执行脚本,输出结果如下所示:返回 false返回 true

2.4.4、字符串运算符

`字符串运算符`下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":运算符 说明  举例=   检测两个字符串是否相等,相等返回 true。  [ $a = $b ] 返回 false。!=  检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。-z  检测字符串长度是否为0,为0返回 true。  [ -z $a ] 返回 false。-n  检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。str 检测字符串是否为空,不为空返回 true。   [ $a ] 返回 true。实例字符串运算符实例如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.coma="abc"b="efg"if [ $a = $b ]then   echo "$a = $b : a 等于 b"else   echo "$a = $b: a 不等于 b"fiif [ $a != $b ]then   echo "$a != $b : a 不等于 b"else   echo "$a != $b: a 等于 b"fiif [ -z $a ]then   echo "-z $a : 字符串长度为 0"else   echo "-z $a : 字符串长度不为 0"fiif [ -n $a ]then   echo "-n $a : 字符串长度不为 0"else   echo "-n $a : 字符串长度为 0"fiif [ $a ]then   echo "$a : 字符串不为空"else   echo "$a : 字符串为空"fi执行脚本,输出结果如下所示:abc = efg: a 不等于 babc != efg : a 不等于 b-z abc : 字符串长度不为 0-n abc : 字符串长度不为 0abc : 字符串不为空

2.4.5、文件测试运算符

`文件测试运算符`文件测试运算符用于检测 Unix 文件的各种属性。属性检测描述如下:操作符 说明  举例-b file 检测文件是否是块设备文件,如果是,则返回 true。  [ -b $file ] 返回 false。-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。    [ -f $file ] 返回 true。-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。  [ -g $file ] 返回 false。-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。  [ -k $file ] 返回 false。-p file 检测文件是否是有名管道,如果是,则返回 true。   [ -p $file ] 返回 false。-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。  [ -u $file ] 返回 false。-r file 检测文件是否可读,如果是,则返回 true。  [ -r $file ] 返回 true。-w file 检测文件是否可写,如果是,则返回 true。  [ -w $file ] 返回 true。-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true-e file 检测文件(包括目录)是否存在,如果是,则返回 true。    [ -e $file ] 返回 true。实例变量 file 表示文件"/var/www/runoob/test.sh",它的大小为100字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:#!/bin/bash# author:菜鸟教程# url:www.runoob.comfile="/var/www/runoob/test.sh"if [ -r $file ]then   echo "文件可读"else   echo "文件不可读"fiif [ -w $file ]then   echo "文件可写"else   echo "文件不可写"fiif [ -x $file ]then   echo "文件可执行"else   echo "文件不可执行"fiif [ -f $file ]then   echo "文件为普通文件"else   echo "文件为特殊文件"fiif [ -d $file ]then   echo "文件是个目录"else   echo "文件不是个目录"fiif [ -s $file ]then   echo "文件不为空"else   echo "文件为空"fiif [ -e $file ]then   echo "文件存在"else   echo "文件不存在"fi执行脚本,输出结果如下所示:文件可读文件可写文件可执行文件为普通文件文件不是个目录文件不为空文件存在==============================================================

2.5、shell 常用命令

2.5.1、shell echo命令

==============================================================Shell echo命令Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:echo string您可以使用echo实现更复杂的输出格式控制。1.显示普通字符串:echo "It is a test"这里的双引号完全可以省略,以下命令与上面实例效果一致:echo It is a test2.显示转义字符echo "\"It is a test\""结果将是:"It is a test"同样,双引号也可以省略3.显示变量read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量#!/bin/shread name echo "$name It is a test"以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:[root@www ~]# sh test.shOK                     #标准输入OK It is a test        #输出4.显示换行echo -e "OK! \n" # -e 开启转义echo "It it a test"输出结果:OK!It it a test5.显示不换行#!/bin/shecho -e "OK! \c" # -e 开启转义 \c 不换行echo "It is a test"输出结果:OK! It is a test6.显示结果定向至文件echo "It is a test" > myfile7.原样输出字符串,不进行转义或取变量(用单引号)echo '$name\"'输出结果:$name\"8.显示命令执行结果echo `date`注意: 这里使用的是反引号 `, 而不是单引号 '。结果将显示当前日期==============================================================

2.5.2、shell printf命令

==============================================================printf 命令模仿 C 程序库(library)里的 printf() 程序。标准所定义,因此使用printf的脚本比使用echo移植性好。printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。printf 命令的语法:printf  format-string  [arguments...]参数说明:format-string: 为格式控制字符串arguments: 为参数列表。实例如下:$ echo "Hello, Shell"Hello, Shell$ printf "Hello, Shell\n"Hello, Shell$接下来,我来用一个脚本来体现printf的强大功能:#!/bin/bash# author:菜鸟教程# url:www.runoob.comprintf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 执行脚本,输出结果如下所示:姓名     性别   体重kg郭靖     男      66.12杨过     男      48.65郭芙     女      47.99%s %c %d %f都是格式替代符%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f 指格式化为小数,其中.2指保留2位小数。更多实例:#!/bin/bash# author:菜鸟教程# url:www.runoob.com# format-string为双引号printf "%d %s\n" 1 "abc"# 单引号与双引号效果一样 printf '%d %s\n' 1 "abc" # 没有引号也可以输出printf %s abcdef# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用printf %s abc defprintf "%s\n" abc defprintf "%s %s %s\n" a b c d e f g h i j# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替printf "%s and %d \n" 执行脚本,输出结果如下所示:1 abc1 abcabcdefabcdefabcdefa b cd e fg h ij   and 0printf的转义序列序列  说明\a  警告字符,通常为ASCII的BEL字符\b  后退\c  抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略\f  换页(formfeed)\n  换行\r  回车(Carriage return)\t  水平制表符\v  垂直制表符\\  一个字面上的反斜杠字符\ddd    表示13位数八进制值的字符。仅在格式字符串中有效\0ddd   表示13位的八进制值字符实例$ printf "a string, no processing:<%s>\n" "A\nB"a string, no processing:<A\nB>$ printf "a string, no processing:<%b>\n" "A\nB"a string, no processing:<AB>$ printf "www.runoob.com \a"www.runoob.com $                  #不换行笔记列表%d %s %c %f 格式替代符详解:d: Decimal 十进制整数 -- 对应位置参数必须是十进制整数,否则报错!s: String 字符串 -- 对应位置参数必须是字符串或者字符型,否则报错!c: Char 字符 -- 对应位置参数必须是字符串或者字符型,否则报错!f: Float 浮点 -- 对应位置参数必须是数字型,否则报错!如:其中最后一个参数是 "def"%c 自动截取字符串的第一个字符作为结果输出。$  printf "%d %s %c\n" 1 "abc" "def"1 abc d==============================================================

2.5.3、shell test命令

==============================================================Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。数值测试参数  说明-eq 等于则为真-ne 不等于则为真-gt 大于则为真-ge 大于等于则为真-lt 小于则为真-le 小于等于则为真实例演示:num1=100num2=100if test $[num1] -eq $[num2]then    echo '两个数相等!'else    echo '两个数不相等!'fi输出结果:两个数相等!代码中的 [] 执行基本的算数运算,如:#!/bin/basha=5b=6result=$[a+b] # 注意等号两边不能有空格echo "result 为: $result"结果为:result 为: 11`字符串测试`参数  说明=   等于则为真!=  不相等则为真-z 字符串  字符串的长度为零则为真-n 字符串  字符串的长度不为零则为真实例演示:num1="ru1noob"num2="runoob"if test $num1 = $num2then    echo '两个字符串相等!'else    echo '两个字符串不相等!'fi输出结果:两个字符串不相等!`文件测试`参数  说明-e 文件名  如果文件存在则为真-r 文件名  如果文件存在且可读则为真-w 文件名  如果文件存在且可写则为真-x 文件名  如果文件存在且可执行则为真-s 文件名  如果文件存在且至少有一个字符则为真-d 文件名  如果文件存在且为目录则为真-f 文件名  如果文件存在且为普通文件则为真-c 文件名  如果文件存在且为字符型特殊文件则为真-b 文件名  如果文件存在且为块特殊文件则为真实例演示:cd /binif test -e ./bashthen    echo '文件已存在!'else    echo '文件不存在!'fi输出结果:文件已存在!另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:cd /binif test -e ./notFile -o -e ./bashthen    echo '有一个文件存在!'else    echo '两个文件都不存在'fi输出结果:有一个文件存在!==============================================================

2.6、shell 流程控制

2.6.1、if

==============================================================if elif else fiif elseifif 语句语法格式:if conditionthen    command1     command2    ...    commandN fi写成一行(适用于终端命令提示符):if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi末尾的fi就是if倒过来拼写,后面还会遇到类似的。if elseif else 语法格式:if conditionthen    command1     command2    ...    commandNelse    commandfiif else-if elseif else-if else 语法格式:if condition1then    command1elif condition2 then     command2else    commandNfi以下实例判断两个变量是否相等:a=10b=20if [ $a == $b ]then   echo "a 等于 b"elif [ $a -gt $b ]then   echo "a 大于 b"elif [ $a -lt $b ]then   echo "a 小于 b"else   echo "没有符合的条件"fi输出结果:a 小于 bif else语句经常与test命令结合使用,如下所示:num1=$[2*3]num2=$[1+5]if test $[num1] -eq $[num2]then    echo '两个数字相等!'else    echo '两个数字不相等!'fi输出结果:两个数字相等!

2.6.2、for

for 循环与其他编程语言类似,Shell支持for循环。for循环一般格式为:for var in item1 item2 ... itemNdo    command1    command2    ...    commandNdone写成一行:for var in item1 item2 ... itemN; do command1; command2… done;当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。in列表是可选的,如果不用它,for循环使用命令行的位置参数。例如,顺序输出当前列表中的数字:for loop in 1 2 3 4 5do    echo "The value is: $loop"done输出结果:The value is: 1The value is: 2The value is: 3The value is: 4The value is: 5顺序输出字符串中的字符:for str in 'This is a string'do    echo $strdone输出结果:This is a string

2.6.3、while

while 语句while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:while conditiondo    commanddone以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字15,然后终止。#!/bin/shint=1while(( $int<=5 ))do    echo $int    let "int++"done运行脚本,输出:12345使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令。while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。echo '按下 <CTRL-D> 退出'echo -n '输入你最喜欢的网站名: 'while read FILMdo    echo "是的!$FILM 是一个好网站"done运行脚本,输出类似下面:按下 <CTRL-D> 退出输入你最喜欢的网站名:菜鸟教程是的!菜鸟教程 是一个好网站无限循环无限循环语法格式:while :do    commanddone或者while truedo    commanddone或者for (( ; ; ))

2.6.4、until

until 循环until循环执行一系列命令直至条件为真时停止。until循环与while循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。until 语法格式:until conditiondo    commanddone条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

2.6.5、case

`case  esac`Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:case 值 in模式1)    command1    command2    ...    commandN    ;;模式2)    command1    command2    ...    commandN    ;;esaccase工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。下面的脚本提示输入14,与每一种模式进行匹配:echo '输入 1 到 4 之间的数字:'echo '你输入的数字为:'read aNumcase $aNum in    1)  echo '你选择了 1'    ;;    2)  echo '你选择了 2'    ;;    3)  echo '你选择了 3'    ;;    4)  echo '你选择了 4'    ;;    *)  echo '你没有输入 1 到 4 之间的数字'    ;;esac输入不同的内容,会有不同的结果,例如:输入 14 之间的数字:你输入的数字为:3你选择了 3

2.6.6、break和continue

跳出循环在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:breakcontinuebreak命令break命令允许跳出所有循环(终止执行后面的所有循环)。下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。#!/bin/bashwhile :do    echo -n "输入 1 到 5 之间的数字:"    read aNum    case $aNum in        1|2|3|4|5) echo "你输入的数字为 $aNum!"        ;;        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"            break        ;;    esacdone执行以上代码,输出结果为:输入 15 之间的数字:3你输入的数字为 3!输入 15 之间的数字:7你输入的数字不是 15 之间的! 游戏结束continuecontinue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。对上面的例子进行修改:#!/bin/bashwhile :do    echo -n "输入 1 到 5 之间的数字: "    read aNum    case $aNum in        1|2|3|4|5) echo "你输入的数字为 $aNum!"        ;;        *) echo "你输入的数字不是 1 到 5 之间的!"            continue            echo "游戏结束"        ;;    esacdone运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "Game is over!" 永远不会被执行。esaccase的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。==============================================================

2.7、shell 函数

==============================================================linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。shell中函数的定义格式如下:[ function ] funname [()]{    action;    [return int;]}说明:1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255下面的例子定义了一个函数并进行调用:#!/bin/bash# author:菜鸟教程# url:www.runoob.comdemoFun(){    echo "这是我的第一个 shell 函数!"}echo "-----函数开始执行-----"demoFunecho "-----函数执行完毕-----"输出结果:-----函数开始执行-----这是我的第一个 shell 函数!-----函数执行完毕-----下面定义一个带有return语句的函数:#!/bin/bash# author:菜鸟教程# url:www.runoob.comfunWithReturn(){    echo "这个函数会对输入的两个数字进行相加运算..."    echo "输入第一个数字: "    read aNum    echo "输入第二个数字: "    read anotherNum    echo "两个数字分别为 $aNum$anotherNum !"    return $(($aNum+$anotherNum))}funWithReturnecho "输入的两个数字之和为 $? !"输出类似下面:这个函数会对输入的两个数字进行相加运算...输入第一个数字: 1输入第二个数字: 2两个数字分别为 12 !输入的两个数字之和为 3 !函数返回值在调用该函数后通过 $? 来获得。注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。函数参数在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...带参数的函数示例:#!/bin/bash# author:菜鸟教程# url:www.runoob.comfunWithParam(){    echo "第一个参数为 $1 !"    echo "第二个参数为 $2 !"    echo "第十个参数为 $10 !"    echo "第十个参数为 ${10} !"    echo "第十一个参数为 ${11} !"    echo "参数总数有 $# 个!"    echo "作为一个字符串输出所有参数 $* !"}funWithParam 1 2 3 4 5 6 7 8 9 34 73输出结果:第一个参数为 1 !第二个参数为 2 !第十个参数为 10 !第十个参数为 34 !第十一个参数为 73 !参数总数有 11 个!作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。另外,还有几个特殊字符用来处理参数:参数处理    说明$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数$$    脚本运行的当前进程ID号$! 后台运行的最后一个进程的ID号$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。$- 显示Shell使用的当前选项,与set命令功能相同。$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。==============================================================

2.8、shell 输入、输出重定向

==============================================================http://www.runoob.com/linux/linux-shell-io-redirections.htmlShell 输入/输出重定向大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。`重定向命令列表如下:命令  说明command > file  将输出重定向到 file。command < file  将输入重定向到 file。command >> file 将输出以追加的方式重定向到 file。n > file    将文件描述符为 n 的文件重定向到 file。n >> file   将文件描述符为 n 的文件以追加的方式重定向到 file。n >& m  将输出文件 m 和 n 合并。n <& m  将输入文件 m 和 n 合并。<< tag  将开始标记 tag 和结束标记 tag 之间的内容作为输入。需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。``输出重定向`重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:#command1 > file1 这个命令执行command1然后将输出的内容存入file1。注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):$ who > users执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。你可以使用 cat 命令查看文件内容:$ cat users_mbsetupuser console  Oct 31 17:35 tianqixin    console  Oct 31 17:35 tianqixin    ttys000  Dec  1 11:33 输出重定向会覆盖文件内容,请看下面的例子:$ echo "菜鸟教程:www.runoob.com" > users$ cat users菜鸟教程:www.runoob.com如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:$ echo "菜鸟教程:www.runoob.com" >> users$ cat users菜鸟教程:www.runoob.com菜鸟教程:www.runoob.com`输入重定向`和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:# command1 < file1 这样,本来需要从键盘获取输入的命令会转移到文件读取内容。注意:输出重定向是大于号(>),输入重定向是小于号(<)。接着以上实例,我们需要统计 users 文件的行数,执行以下命令:$ wc -l users       2 users也可以将输入重定向到 users 文件:$  wc -l < users       2 注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。command1 < infile > outfile同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。`重定向深入讲解`一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。如果希望 stderr 重定向到 file,可以这样写:$ command 2 > file如果希望 stderr 追加到 file 文件末尾,可以这样写:$ command 2 >> file2 表示标准错误文件(stderr)。如果希望将 stdoutstderr 合并后重定向到 file,可以这样写:$ command > file 2>&1或者$ command >> file 2>&1如果希望对 stdinstdout 都重定向,可以这样写:$ command < file1 >file2command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。Here DocumentHere Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。它的基本的形式如下:command << delimiter    documentdelimiter它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。注意:结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。开始的delimiter前后的空格会被忽略掉。实例在命令行中通过 wc -l 命令计算 Here Document 的行数:$ wc -l << EOF    欢迎来到    菜鸟教程    www.runoob.comEOF3          # 输出结果为 3 行$我们也可以将 Here Document 用在脚本中,例如:#!/bin/bash# author:菜鸟教程# url:www.runoob.comcat << EOF欢迎来到菜鸟教程www.runoob.comEOF执行以上脚本,输出结果:欢迎来到菜鸟教程www.runoob.com`/dev/null 文件`如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null# command > /dev/null/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。如果希望屏蔽 stdoutstderr,可以这样写:$ command > /dev/null 2>&1注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。`笔记列表`$ command > file 2>&1$ command >> file 2>&1这里的&没有固定的意思放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下1 => stdout2 => stderr0 => stdin换言之 2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射而&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,都等价于>file 2>&1此处&>或者>&视作整体,分开没有单独的含义顺序问题:find /etc -name .bashrc > list 2>&1# 我想问为什么不能调下顺序,比如这样find /etc -name .bashrc 2>&1 > list这个是从左到右有顺序的第一种xxx > list 2>&1先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list第二种xxx 2>&1 > list先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响==============================================================

2.9、shell 文件包含

==============================================================和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。Shell 文件包含的语法格式如下:. filename   # 注意点号(.)和文件名中间有一空格source filename实例创建两个 shell 脚本文件。test1.sh 代码如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.comurl="http://www.runoob.com"test2.sh 代码如下:#!/bin/bash# author:菜鸟教程# url:www.runoob.com#使用 . 号来引用test1.sh 文件. ./test1.sh# 或者使用以下包含文件代码# source ./test1.shecho "菜鸟教程官网地址:$url"接下来,我们为 test2.sh 添加可执行权限并执行:$ chmod +x test2.sh $ ./test2.sh 菜鸟教程官网地址:http://www.runoob.com注:被包含的文件 test1.sh 不需要可执行权限。==============================================================

3、vi命令详解

============================================================== linux vi命令详解刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇。vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指 令。由于 对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编 辑器,学会它后,您将在Linux的世界里畅行无阻。1、vi的基本概念  基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:    1) 命令行模式command mode)  控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。    2) 插入模式(Insert mode)  只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。    3) 底行模式(last line mode)  将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号……等。    不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。2、vi的基本操作 a) 进入vi    在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面:   $ vi myfile不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到 「插入模式(Insert mode)」再说吧!b) 切换至插入模式(Insert mode)编辑文件  在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。c) Insert 的切换  您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。d) 退出vi及保存文件  在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如:: w filename (输入 「w filename」将文章以指定的文件名filename保存): wq (输入「wq」,存盘并退出vi): q! (输入q!, 不存盘强制退出vi)3、命令行模式(command mode)功能键1). 插入模式       按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件;  按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;  按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。2). 从插入模式切换为命令行模式      按「ESC」键。3). 移动光标  vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。  按「ctrl」+「b」:屏幕往"后"移动一页。  按「ctrl」+「f」:屏幕往"前"移动一页。  按「ctrl」+「u」:屏幕往"后"移动半页。  按「ctrl」+「d」:屏幕往"前"移动半页。  按数字「0」:移到文章的开头。  按「G」:移动到文章的最后。  按「$」:移动到光标所在行的"行尾"。  按「^」:移动到光标所在行的"行首"  按「w」:光标跳到下个字的开头  按「e」:光标跳到下个字的字尾  按「b」:光标回到上个字的开头  按「#l」:光标移到该行的第#个位置,如:5l,56l。4). 删除文字  「x」:每按一次,删除光标所在位置的"后面"一个字符。  「#x」:例如,「6x」表示删除光标所在位置的"后面"6个字符。  「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符。  「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符。  「dd」:删除光标所在行。  「#dd」:从光标所在行开始删除#行5). 复制  「yw」:将光标所在之处到字尾的字符复制到缓冲区中。  「#yw」:复制#个字到缓冲区  「yy」:复制光标所在行到缓冲区。  「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。  「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。6). 替换  「r」:替换光标所在处的字符。  「R」:替换光标所到之处的字符,直到按下「ESC」键为止。7). 回复上一次操作  「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回复。8). 更改  「cw」:更改光标所在处的字到字尾处  「c#w」:例如,「c3w」表示更改3个字9). 跳至指定的行  「ctrl」+「g」列出光标所在行的行号。  「#G」:例如,「15G」,表示移动光标至文章的第15行行首。4、Last line mode下命令简介在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。D) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。E) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。5、vi命令列表1、下表列出命令模式下的一些键的功能:h左移光标一个字符l右移光标一个字符k光标上移一行j光标下移一行^光标移动至行首0数字"0",光标移至文章的开头G光标移至文章的最后$光标移动至行尾Ctrl+f向前翻屏Ctrl+b向后翻屏Ctrl+d向前翻半屏Ctrl+u向后翻半屏i在光标位置前插入字符a在光标所在位置的后一个字符开始增加o插入新的一行,从行首开始输入ESC从输入状态退至命令状态x删除光标后面的字符#x删除光标后的#个字符X(大写X),删除光标前面的字符#X删除光标前面的#个字符dd删除光标所在的行#dd删除从光标所在行数的#行yw复制光标所在位置的一个字#yw复制光标所在位置的#个字yy复制光标所在位置的一行#yy复制从光标所在行数的#行p粘贴u取消操作cw更改光标所在位置的一个字#cw更改光标所在位置的#个字2、下表列出行命令模式下的一些指令w filename储存正在编辑的文件为filenamewq filename储存正在编辑的文件为filename,并退出viq!放弃所有修改,退出viset nu显示行号/或?查找,在/后输入要查找的内容n与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。对于第一次用vi,有几点注意要提醒一下:1、 用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:) 

4、其他

4.1、修改linux时间

==============================================================http://blog.chinaunix.net/uid-20672257-id-3013282.html调整linux系统时间和时区与Internet时间同步一、修改时区:# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime修改为中国的东八区# vi /etc/sysconfig/clockZONE="Asia/Shanghai"UTC=falseARC=false二、配置新的时间日期设定:# date -s 2008/05/06时间设定:# date -s 18:40:00查看硬件时间(BIOS的):    hwclock [-rw]     -r:查看现有BIOS时间,默认为-r参数    -w:将现在的linux系统时间写入BIOS中    当我们进行完 Linux 时间的校时后,还需要以 hwclock -w 来更新 BIOS 的时间,因为每次开机的时候,系统会重新由 BIOS 将时间读出来,所以, BIOS 才是重要的时间依据。# hwclockTue 06 May 2008 03:49:37 PM CST  -0.039646 seconds同步BIOS时钟,强制把系统时间写入CMOS:# clock -w==============================================================

4.2、星期月份英语

==============================================================星期一: Mon.=Monday        Monday星期二: Tues.=Tuesday      Tuesday 星期三:Wed.=Wednesday      Wednesday星期四: Thur.=Thursday     Thurday星期五: Fri.=Friday        Friday星期六: Sat.=Saturday      Saturday 星期天: Sun.=Sunday        Sunday一月份=JAN. Jan.=January   January二月份=FEB. Feb.=February  February三月份=MAR. Mar.=March     March四月份=APR. Apr.=April     April五月份=MAY May=May         May六月份=JUN. Jun.=June      June 七月份=JUL. Jul.=July      July八月份=AUG. Aug.=August    August九月份=SEP. Sept.=September  September十月份=OCT. Oct.=October   October十一月份=NOV. Nov.=November  November十二月份=DEC. Dec.=December  December东西南北  West East South North  ===  w e s n==============================================================
原创粉丝点击