From 17d0bb6fd7ef0270855f99570a7f2febb0b2cc5d Mon Sep 17 00:00:00 2001 From: scott <1021151991@qq.com> Date: Fri, 22 Sep 2017 13:40:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?Update=20linux=E7=AC=94=E8=AE=B0-x.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit branch test --- "linux\347\254\224\350\256\260-x.md" | 82 ++++++++++++++-------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git "a/linux\347\254\224\350\256\260-x.md" "b/linux\347\254\224\350\256\260-x.md" index 328a271..069e52e 100644 --- "a/linux\347\254\224\350\256\260-x.md" +++ "b/linux\347\254\224\350\256\260-x.md" @@ -30,7 +30,7 @@ #### 1.1.1、文件及目录命令 ```java -============================================================== +============================================================================================================================ 进入目录 cd dir1 创建目录 mkdir dir1 创建多级目录 mkdir -p d1/d2/d3 @@ -91,12 +91,12 @@ x : 删除光标位置字符 该命令使用了管道“|”,命令cat /etc/passwd的输出是管道的输入,经过管道后,成为了命令more的输入。 使用命令“ls –l”可以显示文件的类别,每个输出行中的第一个字符表示的就是文件的类别,例如,“b”代表块设备,“p”代表管道文件,“c”代表字符设备,“d”代表目录文件。 -============================================================== +============================================================================================================================ ``` #### 1.1.2、显示文件 ```java -============================================================== +============================================================================================================================ cat test.txt 显示文件开头 tac test.txt 显示文件结尾 more test.txt 逐页显示文件 @@ -110,12 +110,12 @@ tail -n 20 test.txt 显示文件后20行 less实际上是more的改进版,其命令的直接含义是more的反义。less的功能比more更灵活。例如:用【Pgup】键可以向前移动一页,用【Pgdn】键可以向后移动一页,用向上光标键可以向前移动一行,用向下光标键可以向后移动一行。“q”键、【Enter】键、【Space】键的功能和more类似。 用【G】键可以移动文件到结尾,用【g】键可以移动到文件开头。 -============================================================== +============================================================================================================================ ``` #### 1.1.3、文件权限 ```java -============================================================== +============================================================================================================================ 改变文件属性(二进制) chmod #chmod 664 chap1.txt 110110010 改变文件属性(字母) chmod u=rw,g=rw,o=r chap1.txt r w x 改变文件所属用户 chown user1 chap1.txt @@ -168,13 +168,13 @@ chgrp组 文件或目录——改变文件或目录的所属组 [root @redflag /root]#chgrp root chap1.txt 文件chap1.txt的所属组设为root组。 -============================================================== +============================================================================================================================ ``` ### 1.2、用户和组的管理

```java -============================================================== +============================================================================================================================ su 切换root su user1 切换用户 @@ -206,12 +206,12 @@ usermod -a -G groupA user -a 代表 append, 也就是 将自己添加到 用户组groupA 中,而不必离开 其他用户组 -============================================================== +============================================================================================================================ ``` ### 1.3、tomcat命令

```java -============================================================== +============================================================================================================================ Linux下Tomcat的启动、关闭、杀死进程 (进入tomcat的bin目录 启动 sh startup.sh) 打开终端 进入tomcat目录 @@ -239,13 +239,13 @@ Linux下Tomcat的启动、关闭、杀死进程 (进入tomcat的bin目录 kill -9 pid //pid 为相应的进程号 启动tomcat /opt/tech/appStore/apache-tomcat-6.0.35/bin/startup.sh -============================================================== +============================================================================================================================ ``` ### 1.4、mysql命令

```java -============================================================== +============================================================================================================================ 指令 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 @@ -271,12 +271,12 @@ usr/lib/mysql 是指:mysql的安装路径 mysql -u root -p12344 linux 的mysql配置文件 /etc/my.cnf -============================================================== +============================================================================================================================ ``` ### 1.5、其他命令

```java -============================================================== +============================================================================================================================ 查看系统空间容量 df -h 树状结构展示目录 tree yum install tree 安装tree命令 @@ -337,14 +337,14 @@ linux虚拟机上传下载文件 打开虚拟机linux,使用命令 ifconfig [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概述及优势

```java -============================================================== +============================================================================================================================ Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序调用。 当普通用户成功登录后,系统将执行一个称为Shell的程序。正是Shell进程提供了命令行提示符。作为默认值,对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。 @@ -386,12 +386,12 @@ linux虚拟机上传下载文件 打开虚拟机linux,使用命令 ifconfig /bin/bash -============================================================== +============================================================================================================================ ``` ### 2.2、shell创建、执行

```java -============================================================== +============================================================================================================================ Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本。 一、创建 Shell 脚本 @@ -425,13 +425,13 @@ linux虚拟机上传下载文件 打开虚拟机linux,使用命令 ifconfig ``` 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。 -============================================================== +============================================================================================================================ ``` ### 2.3、shell 变量、引号、数组、传递参数

```java -============================================================== +============================================================================================================================ http://www.runoob.com/linux/linux-shell-variable.html 转自菜鸟教程 test="测试引号" @@ -522,12 +522,12 @@ $ ./test.sh 1 2 3 2 3 -============================================================== +============================================================================================================================ ``` ### 2.4、shell 运算符

```java -============================================================== +============================================================================================================================ 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 @@ -892,13 +892,13 @@ fi 文件存在 -============================================================== +============================================================================================================================ ``` ### 2.5、shell 常用命令

#### 2.5.1、shell echo命令 ```java -============================================================== +============================================================================================================================ Shell echo命令 Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式: echo string @@ -953,11 +953,11 @@ echo `date` 注意: 这里使用的是反引号 `, 而不是单引号 '。 结果将显示当前日期 -============================================================== +============================================================================================================================ ``` #### 2.5.2、shell printf命令 ```java -============================================================== +============================================================================================================================ printf 命令模仿 C 程序库(library)里的 printf() 程序。 标准所定义,因此使用printf的脚本比使用echo移植性好。 printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。 @@ -1056,12 +1056,12 @@ f: Float 浮点 -- 对应位置参数必须是数字型,否则报错! 如:其中最后一个参数是 "def",%c 自动截取字符串的第一个字符作为结果输出。 $ printf "%d %s %c\n" 1 "abc" "def" 1 abc d -============================================================== +============================================================================================================================ ``` #### 2.5.3、shell test命令 ```java -============================================================== +============================================================================================================================ Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。 数值测试 参数 说明 @@ -1142,13 +1142,13 @@ else fi 输出结果: 有一个文件存在! -============================================================== +============================================================================================================================ ``` ### 2.6、shell 流程控制

#### 2.6.1、if ```java -============================================================== +============================================================================================================================ if elif else fi if else @@ -1406,12 +1406,12 @@ done 运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "Game is over!" 永远不会被执行。 esac case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。 -============================================================== +============================================================================================================================ ``` ### 2.7、shell 函数

```java -============================================================== +============================================================================================================================ linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。 shell中函数的定义格式如下: [ function ] funname [()] @@ -1507,12 +1507,12 @@ $! 后台运行的最后一个进程的ID号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 -============================================================== +============================================================================================================================ ``` ### 2.8、shell 输入、输出重定向

```java -============================================================== +============================================================================================================================ http://www.runoob.com/linux/linux-shell-io-redirections.html Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。 @@ -1661,12 +1661,12 @@ xxx > list 2>&1 第二种 xxx 2>&1 > list 先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响 -============================================================== +============================================================================================================================ ``` ### 2.9、shell 文件包含

```java -============================================================== +============================================================================================================================ 和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。 Shell 文件包含的语法格式如下: . filename # 注意点号(.)和文件名中间有一空格 @@ -1699,12 +1699,12 @@ $ chmod +x test2.sh $ ./test2.sh 菜鸟教程官网地址:http://www.runoob.com 注:被包含的文件 test1.sh 不需要可执行权限。 -============================================================== +============================================================================================================================ ``` ## 3、vi命令详解

```java -============================================================== +============================================================================================================================ linux vi命令详解 刚开始学着用linux,对vi命令不是很熟,在网上转接了一篇。 @@ -1943,7 +1943,7 @@ n ## 4、其他

### 4.1、修改linux时间

```java -============================================================== +============================================================================================================================ http://blog.chinaunix.net/uid-20672257-id-3013282.html 调整linux系统时间和时区与Internet时间同步 一、修改时区: @@ -1968,12 +1968,12 @@ Tue 06 May 2008 03:49:37 PM CST -0.039646 seconds 同步BIOS时钟,强制把系统时间写入CMOS: # clock -w -============================================================== +============================================================================================================================ ``` ### 4.2、星期月份英语

```java -============================================================== +============================================================================================================================ 星期一: Mon.=Monday Monday 星期二: Tues.=Tuesday Tuesday 星期三:Wed.=Wednesday Wednesday @@ -1997,7 +1997,7 @@ Tue 06 May 2008 03:49:37 PM CST -0.039646 seconds 东西南北 West East South North === w e s n -============================================================== +============================================================================================================================ ``` From e68829d3714ba6ac26528227de0fd4bf7544d247 Mon Sep 17 00:00:00 2001 From: scott180 <1021151991@qq.com> Date: Sat, 11 May 2019 18:17:06 +0800 Subject: [PATCH 2/2] =?UTF-8?q?linux=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- branchTest.txt | 0 "linux\347\254\224\350\256\260-x.md" | 4650 +++++++++++++++----------- 2 files changed, 2644 insertions(+), 2006 deletions(-) create mode 100644 branchTest.txt diff --git a/branchTest.txt b/branchTest.txt new file mode 100644 index 0000000..e69de29 diff --git "a/linux\347\254\224\350\256\260-x.md" "b/linux\347\254\224\350\256\260-x.md" index 069e52e..b59afb3 100644 --- "a/linux\347\254\224\350\256\260-x.md" +++ "b/linux\347\254\224\350\256\260-x.md" @@ -1,2006 +1,2644 @@ -# linux笔记-x - -* [1、常用命令](#commonCommand) - * [1.1、文件及目录](#fileAndDir) - * [1.2、用户和组的管理](#userAndGroup) - * [1.3、tomcat命令](#tomcatCommand) - * [1.4、mysql命令](#mysqlCommand) - * [1.5、其他命令](#otherCommand) -* [2、shell编程](#shell) - * [2.1、shell概述及优势](#shellIntroduce) - * [2.2、shell创建、执行](#shellExecute) - * [2.3、shell 变量、引号、数组、传递参数](#shellParams) - * [2.4、shell 运算符](#shellOperator) - * [2.5、shell 常用命令](#shellCommonCommand) - * [2.6、shell 流程控制](#shellFlow) - * [2.7、shell 函数](#shellFunction) - * [2.8、shell 输入、输出重定向](#shellIO) - * [2.9、shell 文件包含](#shellFileContain) -* [3、vi命令详解](#viCommand) -* [4、其他](#endOther) - * [4.1、修改linux时间](#updateLinuxTime) - * [4.2、星期月份英语](#EnglishTranlator) - -*2017年8月22日-至今* - -标签(空格分隔): linux xyq [toc] - -## 1、常用命令

-### 1.1、文件及目录

-#### 1.1.1、文件及目录命令 - -```java -============================================================================================================================ -进入目录 cd dir1 -创建目录 mkdir dir1 -创建多级目录 mkdir -p d1/d2/d3 -查看当前目录 pwd - -复制文件 cp srcname targetname -修改名称(移动文件) mv readme.txt readme.doc - -rm a.txt 删除普通文件a.txt -rm -r a/ 删除目录a -rm -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 | tac - -vi 操作: -: 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、显示文件 -```java -============================================================================================================================ -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、文件权限 -```java -============================================================================================================================ -改变文件属性(二进制) 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.txt - - -Linux系统是个多用户系统,应该能做到不同的用户能同时访问不同的文件,因此一定要有文件权限控制机制。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。这里我们特别关心的是输出行前面的第1~10个字符。第1个字符代表文件类别,第2~4个字符“rw-”是文件拥有者的权限,第5~7个字符“rw-”是文件所属组的权限,第8~10个字符“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.txt -chap1.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.txt - - -chown 用户名 文件或目录名——改变文件(或目录)的拥有者或所属组 - 例如: - [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、用户和组的管理

- -```java -============================================================================================================================ -su 切换root -su 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命令

-```java -============================================================================================================================ -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/appStore/apache-tomcat-6.0.35/bin/startup.sh -============================================================================================================================ -``` - - -### 1.4、mysql命令

-```java -============================================================================================================================ -指令 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 -p1234 webpro > /opt/tech/20170814.sql - -登录mysql /opt/tech/mysql/bin/mysql -uroot -p1234 - /opt/tech/mysql/bin/mysql -uroot -padmin - -创建、使用数据库 create database test; use test; -导入sql数据 source /root/20151010.sql - -/opt/tech/apache-tomcat-6.0.45/webapps/add20170814.sql - -修改max_allowed_packet vi /etc/my.cnf - -58.246.98.94 -mysql -u root -p12344 - -linux 的mysql配置文件 /etc/my.cnf -============================================================================================================================ -``` - -### 1.5、其他命令

-```java -============================================================================================================================ -查看系统空间容量 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 -清楚屏幕 clear - -help -man 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——显示所有分区的信息 - -touch -创建空白的新文件. -更新已有文件的时间戳. -用法是一样的, touch 文件名 - -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概述及优势

-```java -============================================================================================================================ - Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序调用。 - 当普通用户成功登录后,系统将执行一个称为Shell的程序。正是Shell进程提供了命令行提示符。作为默认值,对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。 - - Linux中的Shell有多种类型,其中最常见的是Bourne Shell (sh)、C Shell (csh)和Korn Shell (ksh)。三种Shell各有优缺点。Bourne Shell是Unix最初始的Shell,并且在每种Unix上都可以使用。Bourne Shell在Shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种Shell。Bash(Bourne Again Shell)是Bourne Shell的扩展,与Bourne Shell完全向下兼容,并且增加了许多特性。它还包含了很多C Shell和Korn Shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。 - C Shell是一种比Bourne Shell更适于编程的Shell,它的语法与C语言很相似。Linux为喜欢使用C Shell的人员提供了Tcsh。Tcsh是C Shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写矫正、历史命令替换、作业控制和类似C语言的语法,它提供比Bourne Shell更多的提示符参数。 - Korn Shell集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。 - - - Bash是大多数Linux系统(包括红旗Linux系统)的默认Shell。Bash有以下的优点: - (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]#wcdir.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创建、执行

-```java -============================================================================================================================ - 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 变量、引号、数组、传递参数

-```java -============================================================================================================================ -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_name -echo ${your_name} -变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界 - -`单引号:` -#单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; -单引号字串中不能出现单引号(对单引号使用转义符后也不行) - -`双引号:` - your_name='qinjx' - str="Hello, I know your are \"$your_name\"! \n" -双引号的优点: -#双引号里可以有变量 -双引号里可以出现转义字符 - -`数组:` -#!/bin/sh -arr=(12 '单引号' “双引号” 22) -echo "第二个值:" ${arr[1]} -echo “所有元素:” ${arr[@]} -echo "数组长度: ${#arr[@]}" - -数组赋值 my_array[0]=A - -`注释` -以"#"开头的行就是注释,会被解释器忽略。 - -'传递参数:' -参数处理 说明 -$# 传递到脚本的参数个数 -$* 以一个单字符串显示所有向脚本传递的参数。 -如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 -$$ 脚本运行的当前进程ID号 -$! 后台运行的最后一个进程的ID号 -$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 -如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 -$- 显示Shell使用的当前选项,与set命令功能相同。 -$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 -``` -|参数处理 | 说明 | -| ------ | ----- | -| `$#` | `传递到脚本的参数个数` | -| `$*` | `以一个单字符串显示所有向脚本传递的参数` | -| `$@` | `与$*相同,但是使用时加引号,并在引号中返回每个参数` | -``` -$* 与 $@ 区别: -相同点:都是引用所有参数。 -不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。 -#!/bin/bash -# author:菜鸟教程 -# url:www.runoob.com - -echo "传递参数个数 \$# $#" -echo "-- \$* 演示 ---" -for i in "$*"; do - echo $i -done - -echo "-- \$@ 演示 ---" -for i in "$@"; do - echo $i -done - -执行脚本,输出结果如下所示: -$ chmod +x test.sh -$ ./test.sh 1 2 3 -#或/bin/sh test.sh 1 2 3 --- $* 演示 --- -1 2 3 --- $@ 演示 --- -1 -2 -3 - -============================================================================================================================ -``` - -### 2.4、shell 运算符

-```java -============================================================================================================================ - -原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。 -expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 -例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '): - -#!/bin/bash -val=`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.com - -a=10 -b=20 - -val=`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" -fi -if [ $a != $b ] -then - echo "a 不等于 b" -fi -执行脚本,输出结果如下所示: -a + b : 30 -a - b : -10 -a * b : 200 -b / a : 2 -b % a : 0 -a 不等于 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.com - -a=10 -b=20 - -if [ $a -eq $b ] -then - echo "$a -eq $b : a 等于 b" -else - echo "$a -eq $b: a 不等于 b" -fi -if [ $a -ne $b ] -then - echo "$a -ne $b: a 不等于 b" -else - echo "$a -ne $b : a 等于 b" -fi -if [ $a -gt $b ] -then - echo "$a -gt $b: a 大于 b" -else - echo "$a -gt $b: a 不大于 b" -fi -if [ $a -lt $b ] -then - echo "$a -lt $b: a 小于 b" -else - echo "$a -lt $b: a 不小于 b" -fi -if [ $a -ge $b ] -then - echo "$a -ge $b: a 大于或等于 b" -else - echo "$a -ge $b: a 小于 b" -fi -if [ $a -le $b ] -then - echo "$a -le $b: a 小于或等于 b" -else - echo "$a -le $b: a 大于 b" -fi -执行脚本,输出结果如下所示: -10 -eq 20: a 不等于 b -10 -ne 20: a 不等于 b -10 -gt 20: a 不大于 b -10 -lt 20: a 小于 b -10 -ge 20: a 小于 b -10 -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.com - -a=10 -b=20 - -if [ $a != $b ] -then - echo "$a != $b : a 不等于 b" -else - echo "$a != $b: a 等于 b" -fi -if [ $a -lt 100 -a $b -gt 15 ] -then - echo "$a 小于 100 且 $b 大于 15 : 返回 true" -else - echo "$a 小于 100 且 $b 大于 15 : 返回 false" -fi -if [ $a -lt 100 -o $b -gt 100 ] -then - echo "$a 小于 100 或 $b 大于 100 : 返回 true" -else - echo "$a 小于 100 或 $b 大于 100 : 返回 false" -fi -if [ $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 不等于 b -10 小于 100 且 20 大于 15 : 返回 true -10 小于 100 或 20 大于 100 : 返回 true -10 小于 5 或 20 大于 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.com - -a=10 -b=20 - -if [[ $a -lt 100 && $b -gt 100 ]] -then - echo "返回 true" -else - echo "返回 false" -fi - -if [[ $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.com - -a="abc" -b="efg" - -if [ $a = $b ] -then - echo "$a = $b : a 等于 b" -else - echo "$a = $b: a 不等于 b" -fi -if [ $a != $b ] -then - echo "$a != $b : a 不等于 b" -else - echo "$a != $b: a 等于 b" -fi -if [ -z $a ] -then - echo "-z $a : 字符串长度为 0" -else - echo "-z $a : 字符串长度不为 0" -fi -if [ -n $a ] -then - echo "-n $a : 字符串长度不为 0" -else - echo "-n $a : 字符串长度为 0" -fi -if [ $a ] -then - echo "$a : 字符串不为空" -else - echo "$a : 字符串为空" -fi -执行脚本,输出结果如下所示: -abc = efg: a 不等于 b -abc != efg : a 不等于 b --z abc : 字符串长度不为 0 --n abc : 字符串长度不为 0 -abc : 字符串不为空 -``` - -#### 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.com - -file="/var/www/runoob/test.sh" -if [ -r $file ] -then - echo "文件可读" -else - echo "文件不可读" -fi -if [ -w $file ] -then - echo "文件可写" -else - echo "文件不可写" -fi -if [ -x $file ] -then - echo "文件可执行" -else - echo "文件不可执行" -fi -if [ -f $file ] -then - echo "文件为普通文件" -else - echo "文件为特殊文件" -fi -if [ -d $file ] -then - echo "文件是个目录" -else - echo "文件不是个目录" -fi -if [ -s $file ] -then - echo "文件不为空" -else - echo "文件为空" -fi -if [ -e $file ] -then - echo "文件存在" -else - echo "文件不存在" -fi -执行脚本,输出结果如下所示: -文件可读 -文件可写 -文件可执行 -文件为普通文件 -文件不是个目录 -文件不为空 -文件存在 - - -============================================================================================================================ -``` - -### 2.5、shell 常用命令

-#### 2.5.1、shell echo命令 -```java -============================================================================================================================ -Shell echo命令 -Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式: -echo string -您可以使用echo实现更复杂的输出格式控制。 - -1.显示普通字符串: -echo "It is a test" -这里的双引号完全可以省略,以下命令与上面实例效果一致: -echo It is a test - -2.显示转义字符 -echo "\"It is a test\"" -结果将是: -"It is a test" -同样,双引号也可以省略 - -3.显示变量 -read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 -#!/bin/sh -read name -echo "$name It is a test" -以上代码保存为 test.sh,name 接收标准输入的变量,结果将是: -[root@www ~]# sh test.sh -OK #标准输入 -OK It is a test #输出 - -4.显示换行 -echo -e "OK! \n" # -e 开启转义 -echo "It it a test" -输出结果: -OK! - -It it a test - -5.显示不换行 -#!/bin/sh -echo -e "OK! \c" # -e 开启转义 \c 不换行 -echo "It is a test" -输出结果: -OK! It is a test - -6.显示结果定向至文件 -echo "It is a test" > myfile - -7.原样输出字符串,不进行转义或取变量(用单引号) -echo '$name\"' -输出结果: -$name\" - -8.显示命令执行结果 -echo `date` -注意: 这里使用的是反引号 `, 而不是单引号 '。 -结果将显示当前日期 - -============================================================================================================================ -``` -#### 2.5.2、shell printf命令 -```java -============================================================================================================================ -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.com - -printf "%-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 def - -printf "%s\n" abc def - -printf "%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 abc -1 abc -abcdefabcdefabc -def -a b c -d e f -g h i -j - and 0 -printf的转义序列 -序列 说明 -\a 警告字符,通常为ASCII的BEL字符 -\b 后退 -\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 -\f 换页(formfeed) -\n 换行 -\r 回车(Carriage return) -\t 水平制表符 -\v 垂直制表符 -\\ 一个字面上的反斜杠字符 -\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效 -\0ddd 表示1到3位的八进制值字符 -实例 -$ printf "a string, no processing:<%s>\n" "A\nB" -a string, no processing: - -$ printf "a string, no processing:<%b>\n" "A\nB" -a string, no processing: - -$ 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命令 -```java -============================================================================================================================ -Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。 -数值测试 -参数 说明 --eq 等于则为真 --ne 不等于则为真 --gt 大于则为真 --ge 大于等于则为真 --lt 小于则为真 --le 小于等于则为真 -实例演示: -num1=100 -num2=100 -if test $[num1] -eq $[num2] -then - echo '两个数相等!' -else - echo '两个数不相等!' -fi -输出结果: -两个数相等! -代码中的 [] 执行基本的算数运算,如: -#!/bin/bash - -a=5 -b=6 - -result=$[a+b] # 注意等号两边不能有空格 -echo "result 为: $result" -结果为: -result 为: 11 - -`字符串测试` -参数 说明 -= 等于则为真 -!= 不相等则为真 --z 字符串 字符串的长度为零则为真 --n 字符串 字符串的长度不为零则为真 -实例演示: -num1="ru1noob" -num2="runoob" -if test $num1 = $num2 -then - echo '两个字符串相等!' -else - echo '两个字符串不相等!' -fi -输出结果: -两个字符串不相等! - -`文件测试` -参数 说明 --e 文件名 如果文件存在则为真 --r 文件名 如果文件存在且可读则为真 --w 文件名 如果文件存在且可写则为真 --x 文件名 如果文件存在且可执行则为真 --s 文件名 如果文件存在且至少有一个字符则为真 --d 文件名 如果文件存在且为目录则为真 --f 文件名 如果文件存在且为普通文件则为真 --c 文件名 如果文件存在且为字符型特殊文件则为真 --b 文件名 如果文件存在且为块特殊文件则为真 -实例演示: -cd /bin -if test -e ./bash -then - echo '文件已存在!' -else - echo '文件不存在!' -fi -输出结果: -文件已存在! -另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如: -cd /bin -if test -e ./notFile -o -e ./bash -then - echo '有一个文件存在!' -else - echo '两个文件都不存在' -fi -输出结果: -有一个文件存在! -============================================================================================================================ -``` - -### 2.6、shell 流程控制

-#### 2.6.1、if -```java -============================================================================================================================ -if elif else fi - -if else -if -if 语句语法格式: -if condition -then - command1 - command2 - ... - commandN -fi -写成一行(适用于终端命令提示符): -if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi -末尾的fi就是if倒过来拼写,后面还会遇到类似的。 -if else -if else 语法格式: -if condition -then - command1 - command2 - ... - commandN -else - command -fi -if else-if else -if else-if else 语法格式: -if condition1 -then - command1 -elif condition2 -then - command2 -else - commandN -fi -以下实例判断两个变量是否相等: -a=10 -b=20 -if [ $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 小于 b -if 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 ... itemN -do - command1 - command2 - ... - commandN -done -写成一行: -for var in item1 item2 ... itemN; do command1; command2… done; -当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。 -in列表是可选的,如果不用它,for循环使用命令行的位置参数。 -例如,顺序输出当前列表中的数字: -for loop in 1 2 3 4 5 -do - echo "The value is: $loop" -done -输出结果: -The value is: 1 -The value is: 2 -The value is: 3 -The value is: 4 -The value is: 5 -顺序输出字符串中的字符: -for str in 'This is a string' -do - echo $str -done -输出结果: -This is a string -``` - -#### 2.6.3、while -``` -while 语句 -while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为: -while condition -do - command -done -以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。 -#!/bin/sh -int=1 -while(( $int<=5 )) -do - echo $int - let "int++" -done -运行脚本,输出: -1 -2 -3 -4 -5 -使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令 -。 -while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。 - -echo '按下 退出' -echo -n '输入你最喜欢的网站名: ' -while read FILM -do - echo "是的!$FILM 是一个好网站" -done -运行脚本,输出类似下面: -按下 退出 -输入你最喜欢的网站名:菜鸟教程 -是的!菜鸟教程 是一个好网站 -无限循环 -无限循环语法格式: -while : -do - command -done -或者 -while true -do - command -done -或者 -for (( ; ; )) -``` - -#### 2.6.4、until -``` -until 循环 -until循环执行一系列命令直至条件为真时停止。 -until循环与while循环在处理方式上刚好相反。 -一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。 -until 语法格式: -until condition -do - command -done -条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。 -``` - -#### 2.6.5、case -``` -`case esac` -Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下: -case 值 in -模式1) - command1 - command2 - ... - commandN - ;; -模式2) - command1 - command2 - ... - commandN - ;; -esac -case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 -取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 -下面的脚本提示输入1到4,与每一种模式进行匹配: -echo '输入 1 到 4 之间的数字:' -echo '你输入的数字为:' -read aNum -case $aNum in - 1) echo '你选择了 1' - ;; - 2) echo '你选择了 2' - ;; - 3) echo '你选择了 3' - ;; - 4) echo '你选择了 4' - ;; - *) echo '你没有输入 1 到 4 之间的数字' - ;; -esac -输入不同的内容,会有不同的结果,例如: -输入 1 到 4 之间的数字: -你输入的数字为: -3 -你选择了 3 -``` - -#### 2.6.6、break和continue -``` - -跳出循环 -在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。 -break命令 -break命令允许跳出所有循环(终止执行后面的所有循环)。 -下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。 -#!/bin/bash -while : -do - echo -n "输入 1 到 5 之间的数字:" - read aNum - case $aNum in - 1|2|3|4|5) echo "你输入的数字为 $aNum!" - ;; - *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" - break - ;; - esac -done -执行以上代码,输出结果为: -输入 1 到 5 之间的数字:3 -你输入的数字为 3! -输入 1 到 5 之间的数字:7 -你输入的数字不是 1 到 5 之间的! 游戏结束 - -continue -continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 -对上面的例子进行修改: -#!/bin/bash -while : -do - echo -n "输入 1 到 5 之间的数字: " - read aNum - case $aNum in - 1|2|3|4|5) echo "你输入的数字为 $aNum!" - ;; - *) echo "你输入的数字不是 1 到 5 之间的!" - continue - echo "游戏结束" - ;; - esac -done -运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "Game is over!" 永远不会被执行。 -esac -case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。 -============================================================================================================================ -``` - -### 2.7、shell 函数

-```java -============================================================================================================================ -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.com - -demoFun(){ - echo "这是我的第一个 shell 函数!" -} -echo "-----函数开始执行-----" -demoFun -echo "-----函数执行完毕-----" -输出结果: ------函数开始执行----- -这是我的第一个 shell 函数! ------函数执行完毕----- - - -下面定义一个带有return语句的函数: -#!/bin/bash -# author:菜鸟教程 -# url:www.runoob.com - -funWithReturn(){ - echo "这个函数会对输入的两个数字进行相加运算..." - echo "输入第一个数字: " - read aNum - echo "输入第二个数字: " - read anotherNum - echo "两个数字分别为 $aNum 和 $anotherNum !" - return $(($aNum+$anotherNum)) -} -funWithReturn -echo "输入的两个数字之和为 $? !" -输出类似下面: -这个函数会对输入的两个数字进行相加运算... -输入第一个数字: -1 -输入第二个数字: -2 -两个数字分别为 1 和 2 ! -输入的两个数字之和为 3 ! -函数返回值在调用该函数后通过 $? 来获得。 -注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。 -函数参数 -在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... - - -带参数的函数示例: -#!/bin/bash -# author:菜鸟教程 -# url:www.runoob.com - -funWithParam(){ - 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 输入、输出重定向

-```java -============================================================================================================================ -http://www.runoob.com/linux/linux-shell-io-redirections.html -Shell 输入/输出重定向 -大多数 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 >> file -2 表示标准错误文件(stderr)。 -如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写: -$ command > file 2>&1 - -或者 - -$ command >> file 2>&1 -如果希望对 stdin 和 stdout 都重定向,可以这样写: -$ command < file1 >file2 -command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。 - -Here Document -Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。 -它的基本的形式如下: -command << delimiter - document -delimiter -它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。 -注意: -结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。 -开始的delimiter前后的空格会被忽略掉。 -实例 -在命令行中通过 wc -l 命令计算 Here Document 的行数: -$ wc -l << EOF - 欢迎来到 - 菜鸟教程 - www.runoob.com -EOF -3 # 输出结果为 3 行 -$ -我们也可以将 Here Document 用在脚本中,例如: -#!/bin/bash -# author:菜鸟教程 -# url:www.runoob.com - -cat << EOF -欢迎来到 -菜鸟教程 -www.runoob.com -EOF -执行以上脚本,输出结果: -欢迎来到 -菜鸟教程 -www.runoob.com - - -`/dev/null 文件` -如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null: -# command > /dev/null -/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。 -如果希望屏蔽 stdout 和 stderr,可以这样写: -$ command > /dev/null 2>&1 -注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。 - -`笔记列表` - -$ command > file 2>&1 -$ command >> file 2>&1 -这里的&没有固定的意思 -放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下 -1 => stdout -2 => stderr -0 => 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 文件包含

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

-```java -============================================================================================================================ - 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 -储存正在编辑的文件为filename - -wq filename -储存正在编辑的文件为filename,并退出vi - -q! -放弃所有修改,退出vi - -set nu -显示行号 - -/或? -查找,在/后输入要查找的内容 - -n -与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 - - -对于第一次用vi,有几点注意要提醒一下: -1、 用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 -2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。 -3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:) - -``` - -## 4、其他

-### 4.1、修改linux时间

-```java -============================================================================================================================ -http://blog.chinaunix.net/uid-20672257-id-3013282.html -调整linux系统时间和时区与Internet时间同步 -一、修改时区: -# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime -修改为中国的东八区 -# vi /etc/sysconfig/clock -ZONE="Asia/Shanghai" -UTC=false -ARC=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 才是重要的时间依据。 -# hwclock -Tue 06 May 2008 03:49:37 PM CST -0.039646 seconds -同步BIOS时钟,强制把系统时间写入CMOS: -# clock -w - -============================================================================================================================ -``` - -### 4.2、星期月份英语

-```java -============================================================================================================================ -星期一: 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 - -============================================================================================================================ -``` - - - - - +# linux笔记-xyq + +* [1、命令](#command) + * [1.1、常用命令](#commonCommand) + * [1.2、命令说明](#commonIntroduce) + * [1.3、软件操作及安装](#soft) + * [1.4、IP及防火墙](#IP) + * [1.5、知识点](#knowledge) +* [2、shell编程](#shell) + * [2.1、shell概述及优势](#shellIntroduce) + * [2.2、shell创建、执行](#shellExecute) + * [2.3、shell 变量、引号、数组、传递参数](#shellParams) + * [2.4、shell 运算符](#shellOperator) + * [2.5、shell 常用命令](#shellCommonCommand) + * [2.6、shell 流程控制](#shellFlow) + * [2.7、shell 函数](#shellFunction) + * [2.8、shell 输入、输出重定向](#shellIO) + * [2.9、shell 文件包含](#shellFileContain) +* [3、vi命令详解](#viCommand) +* [4、其他](#endOther) + * [4.1、修改linux时间](#updateLinuxTime) + * [4.2、星期月份英语](#EnglishTranlator) + +*2017年8月22日-至今* + +标签(空格分隔): linux xyq customeDirectoy [toc] + +> [作业部落]( https://www.zybuluo.com/mdeditor ) [linux]( https://github.com/scott180/MyNotes/blob/master/linux%E7%AC%94%E8%AE%B0-x.md ) [CSDN]( https://me.csdn.net/xu180 ) [马克飞象]( https://maxiang.io ) [markdown]( https://jbt.github.io/markdown-editor/ ) + +

+ +## 1、命令说明 +

+ +### 1.1 常用命令 + +说明 | 命令 +----------------- | ----------------------------------------------------------------- +进入目录 | cd dir1 +创建目录 | mkdir dir1 +创建多级目录 | mkdir -p d1/d2/d3 +查看当前目录 | pwd +复制文件 | cp srcname targetname +复制目录 | cp -r dir1/ dir2/ +修改名称(移动文件) | mv readme.txt readme.doc +跨服务器复制 | scp /data/ROOT.tar.gz root@192.168.239.35:/opt/sudytech/db_backup +删除普通文件a.txt | rm a.txt (-f:表示强制) +目录a删除 | rm -rf a (-f:表示强制; -r:表示目录) +建立新文件 | touch test.txt +清空文件 | cat /dev/null >json.log +`-----------------` | `-----------------------------------------------------------------` +查看磁盘空间 | df -h +查看文件大小 | du -h filepath +显示文件或目录类型 | file test +查询程序的位置 | which test +统计文件信息 | wc testfile +3 92 598 testfile | testfile文件的行数为3、单词数92、字节数598 +`-----------------` | `-----------------------------------------------------------------` +压缩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 test +查找文件 | find /home -name 'test.log' -type f -print +查找目录 | find / -name 'tech' -type d -print +查找当前目录及子目录文件 | find . -name "*root*" -maxdepth 1 (maxdepth指层数) +查找大文件 | find / -type f -size +400M | xargs ls -hlrt +`-----------------` | `-----------------------------------------------------------------` +从旧到新并显示大小 | ls -hlrt (ls -lrt 从旧到新) +从新到旧并显示大小 | ls -hlt (ls -lt 从新到旧 ) +按大小升序 | ls -hSlr +按大小降序 | ls -hSl +模糊查找文件 | ls name* (ls /etc/rc.d/init.d/my*) +显示当前目录文件 | ls +`-----------------` | `-----------------------------------------------------------------` +查看linux版本 | cat /proc/version lsb_release -a +查看linux内核版本 | uname -a +查看centos版本 | cat /etc/redhat-release +查看java版本 | java -version +查看进程 | ps +查看tomcat进程 | ps -ef | grep tomcat +`-----------------` | `-----------------------------------------------------------------` +上传 | sz filename (安装上传下载 yum install lrzsz) +下载 | sz +显示10行历史记录 | history 10 +查看ip | ifconfig +清楚屏幕 | clear +查看时间 | date +时间格式化 | date "+%Y-%m-%d %H:%M:%S" +查看指定年月日历 | cal 3 2013 +建立链接 | ln -fs /opt/tech/mysql/bin/mysql /usr/local/bin/mysql +删除链接 | rm -rf name +查看所有别名 | alias +添加别名 | alias test="tar -zcvf " +删除别名 | unalias test +显示所有分区的信息 | fdisk -l +帮助 | help +查看命令手册 | man ls +树状结构展示目录 | tree (安装tree命令 yum install tree) +输出重定向(保存文件)| ls > dir.txt +追加文件 | ls >> dir.txt +`-----------------` | `-----------------------------------------------------------------` +关机 | halt +重启 | reboot +关机重启 | shutdown -r +关机不重启 | shutdown -h +立刻关机 | shutdown now +******************************************************** + + +

+ +### 1.2 命令说明 +#### 1.2.1 vi操作 +``` +:wq (输入「wq」,存盘并退出vi) +:q! (输入q!, 不存盘强制退出vi) +:set fileencoding 查看文件编码 +:set nu 显示行数 + +查找 /关键字 +按「G」:移动到文章的最后。 +按「g」:移动到文章的开头。 +dd : 删除当前行 +x : 删除光标位置字符 +u :后退 返回 上一步 + +/string 向前搜索指定字符串 +?string 向后搜索指定字符串 +n 搜索指定字符串的下一个出现位置 +N 搜索指定字符串的上一个出现位置 +:%s/old/new/g 全文替换指定字符串 +``` +******************************************************** + + +#### 1.2.2 环境变量export +``` +查看所有环境变量 export +查看环境变量 echo $PATH + export $hello + +设置临时环境变量 export PATH=$PATH:/usr/local/mysql/bin + export hello="hello world" + +设置系统环境变量 + vi /etc/profile + + export PATH=$PATH:/usr/local/mysql/bin # 在配置文件中加入此行配置 + export hello="hello world" # 在配置文件中加入此行配置 + + 需要注意的是:修改完这个文件必须要使用 以下命令在不用重启系统的情况下使修改的内容生效。 + + source /etc/profile + + 或者是用 ‘.’: + + . /etc/profile + + 查看: + echo $PATH + /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin + + echo $hello + hello world + + 配置已经生效 + +``` +******************************************************** + + +#### 1.2.3 head tail less more +``` +1. 如果你只想看文件的前100行,可以使用head命令,如 +head -100 filename +2. 如果你想查看文件的后100行,可以使用tail命令,如: +tail -100 filename 或 tail -n 100 filename +3. 查看文件中间一段,你可以使用sed命令,如: +sed -n '100,200p' filename +这样你就可以只查看文件的第100行到第200行。 + +截取的文件可以用重定向输入到新的文件中: +head -100 filename >a.txt + +tail -f cata.log 打印日志 + +cat test.txt 显示文件开头 +tac test.txt 显示文件结尾 +more test.txt 逐页显示文件 +less test.txt 逐页显示文件(优化more) +head -n 20 test.txt 显示文件前20行 head -100 filename +tail -n 20 test.txt 显示文件后20行 tail -100 filename + + +如果文件太长,用cat命令只能看到文件的最后一页,而用more命令时可以一页一页地显示。执行more命令后,进入more状态,用【Enter】键可以向后移动一行;用【Space】键可以向后移动一页;用“q”键可以退出。在more状态下还有许多功能,可用man more命令获得。 + +less实际上是more的改进版,其命令的直接含义是more的反义。less的功能比more更灵活。例如:用【Pgup】键可以向前移动一页,用【Pgdn】键可以向后移动一页,用向上光标键可以向前移动一行,用向下光标键可以向后移动一行。“q”键、【Enter】键、【Space】键的功能和more类似。 + +用【G】键可以移动文件到结尾,用【g】键可以移动到文件开头。 +``` +******************************************************************** + + +#### 1.2.4 cat详解 +``` +cat命令是linux下的一个文本输出命令,通常是用于观看某个文件的内容。 +cat主要有三大功能: + 1.一次显示整个文件。 + $ cat filename + + 2.从键盘创建一个文件。 + $ cat > filename + 只能创建新文件,不能编辑已有文件 + + 3.将几个文件合并为一个文件。 + $cat file1 file2 > file + + + cat具体命令格式为 : cat [-AbeEnstTuv] [--help] [--version] fileName + 说明:把档案串连接后传到基本输出(屏幕或加 > fileName 到另一个档案) + 参数: + -n 或 –number 由 1 开始对所有输出的行数编号 + -b 或 –number-nonblank 和 -n 相似,只不过对于空白行不编号 + -s 或 –squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行 + -v 或 –show-nonprinting + 范例: + cat -n linuxfile1 > linuxfile2 把 linuxfile1 的档案内容加上行号后输入 linuxfile2 这个档案里 + cat -b linuxfile1 linuxfile2 >> linuxfile3 把 linuxfile1 和 linuxfile2 的档案内容加上行号(空白行不加)之后将内容附加到linuxfile3 里。 + 范例: + 把 linuxfile1 的档案内容加上行号后输入 linuxfile2 这个档案里 + cat -n linuxfile1 > linuxfile2 + 把 linuxfile1 和 linuxfile2 的档案内容加上行号(空白行不加)之后将内容附加到 linuxfile3 里。 + cat -b linuxfile1 linuxfile2 >> linuxfile3 + + + cat /dev/null > /etc/test.txt 此为清空/etc/test.txt档案内容 + +---------------------------------------------------------- + +cat << EOF的语句说明 + EOF是“end of file”,表示文本结束符。EOF在这里没有特殊的含义,你可以使用FOE或OOO等(当然也不限制在三个字符或大写字符)。 + +简单描述一下常见的使用方式及其作用: + 1、cat<filename,创建文件,并把标准输入输出到filename文件中,以ctrl+d作为输入结束: + 注意:输入时是没有'>'的。 + 3、cat>filename< test.txt << EOF + > 说明cat及EOF + > 测试 + > EOF + + $ cat test.txt + 说明cat及EOF + 测试 + +其他写法: + cat >> test.txt << EOF 在test.txt里追加内容,不会覆盖原有文件。 + + $ cat >> test.txt << END //这里的“END”就代替了“EOF”的功能。结果是相同的。 + > 追加内容 + > END + + $ cat test.txt + 说明cat及EOF + 测试 + 追加内容 +``` +******************************************************************** + +#### 1.2.5 grep + + [grep命令]( http://www.cnblogs.com/end/archive/2012/02/21/2360965.html ) +``` +查询文件中内容并保存 + more linux.txt | grep mysql > test.txt // > 创建新文件 + cat linux.txt | grep 软件 >> test.txt // >> 是在文件中追加内容 + + grep mysql linux.txt > test.txt + +查询文件内容行数 + cat linux.txt | grep mysql | w -l + + +查询运行的进程 + ps -ef | grep mysql + ps -ef | grep java + -e 显示所有进程。 + -f 全格式。 + + +grep '^root' /etc/group 匹配正则表达式的开始行 +grep 'root$' /etc/group 匹配正则表达式的结束行 + +RE(正则表达式) +\ 忽略正则表达式中特殊字符的原有含义 +^ 匹配正则表达式的开始行 +$ 匹配正则表达式的结束行 +\< 从匹配正则表达式的行开始 +\> 到匹配正则表达式的行结束 +[ ] 单个字符;如[A] 即A符合要求 +[ - ] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求 +. 所有的单个字符 +* 所有字符,长度可以为0 +``` +******************************************************************** + + +

+ +### 1.3 软件操作及安装 + +#### 1.3.1 mysql +```java +指令 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的安装路径 + + +导出数据库 /opt/tech/mysql/bin/mysqldump -uroot -p1234 webpro > /opt/tech/20170814.sql + +导入数据 mysql -uroot -pSudy.web123 UCPPLUS < /opt/sql/ucpplus_v4_0_5.sql + +mysql导入时出现"ERROR at line : Unknown command '\''."的解决办法 + mysql -uroot -p12344 --default-character-set=utf8 IMP_V12_1 < E:\ids-1.1.2.sql + +导出查询语句 /opt/sudytech/mysql/bin/mysql -uroot -p12344 -e "use IDSPLUS;select id,loginName from T_USER where id=1\G;" >> /opt/test.txt + +导出表 /opt/tech/mysql/bin/mysqldump -uroot -p1234 webpro t_user > /opt/tech/t_user.sql + +创建数据库 +CREATE DATABASE UCPPLUS DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; +use UCPPLUS; + +登录mysql /opt/tech/mysql/bin/mysql -uroot -p1234 + /opt/tech/mysql/bin/mysql -uroot -padmin + +创建、使用数据库 create database test; use test; +导入sql数据 source /root/20151010.sql + + +复制表数据到新表 +CREATE TABLE T_MENU1 LIKE T_MENU; +INSERT INTO T_MENU1 SELECT * FROM T_MENU; + +/opt/tech/apache-tomcat-6.0.45/webapps/add20170814.sql + +修改max_allowed_packet vi /etc/my.cnf + +58.246.98.94 +mysql -u root -p12344 + + + +navicat连接mysql失败,授权: +GRANT ALL PRIVILEGES ON `db1`.* TO 'user1'@'192.171.1.18' identified by 'pwd1' WITH GRANT OPTION; +GRANT ALL PRIVILEGES ON `IDSPLUS`.* TO 'sudy'@'192.171.1.18' identified by 'shhg12344' WITH GRANT OPTION; + +grant all privileges on *.* to root@'%' identified by 'Sudy.web123' with grant option; + +-- flush privileges; + + +查询权限 +select * from mysql.user +select Host,User,password_last_changed from mysql.user + +取消权限 +revoke all on *.* from 'root'@'192.168.0.197' ; + +删除用户权限 +Delete from mysql.user where user = "user_name" and host = "host_name" ; + + + +linux 的mysql配置文件 /etc/my.cnf + +查看编码 +show variables like 'character%'; + +设置编码 +set character_set_server='utf8'; + +查看sql_mode +SELECT @@GLOBAL.sql_mode; + +识别大小写 +lower_case_table_names = 2 + +启动mysql + /opt/sudytech/mysql/support-files/mysql.server start + + /opt/sudytech/mysql/bin/mysqld_safe --user=mysql --basedir=/opt/sudytech/mysql --datadir=/opt/sudytech/mysql/data & + + cd /opt/sudytech/mysql/ + ./bin/mysqld_safe & + + + chmod -R 775 mysql + + + cd /data/sudytech/mysql/&&./bin/mysqld_safe & + cd /opt/sudytech/mysql/ && bin/mysqld_safe --user=root & + +``` +******************************************************************** + + +#### 1.3.2 mongo +[mongo笔记]( https://github.com/scott180/MyNotes/blob/master/mongo.md ) +``` +配置文件启动 +cd /opt/sudytech/mongodb +./bin/mongod --config /opt/mongodb/conf/mongo.conf + +自定义路径启动 + /opt/sudytech/mongodb/bin/mongod --dbpath=/opt/sudytech/mongodb/data --logpath=/opt/sudytech/mongodb/logs --logappend --port=27017 --fork + +登陆mongo +cd /opt/sudytech/mongodb/bin +mongo +``` +******************************************************************** + + +#### 1.3.3 redis +``` +windows下redis安装 +http://www.runoob.com/redis/redis-install.html +进入redis目录 +启动 redis-server.exe redis.windows.conf + +登录 redis-cli.exe -h 127.0.0.1 -p 6379 + redis-cli -a sudy12344 + + +Redis 设置密码登录 +修改redis.windows.conf +#requirepass foobared。设置密码的方法就是去掉注释的#,把foobared替换成自己的密码即可,例如将密码设置为123456 + + +服务自启动 +redis-server --service-install redis.windows.conf --loglevel verbose + + +问题 Invalid argument during startup: unknown conf file parameter : requirepass +redis 设置来密码,出现来这个错误, +把配置文件那一行的空格去掉 +# requirepass foobared +改成 +requirepass 123456 + + +启动redis +./redis/src/redis-server ./redis/redis.conf & + +关闭redis +./redis/src/redis-cli -h host -p port -a password shutdown +host值在./redis/redis.conf文件中搜索bind +port值在./redis/redis.conf文件中搜索port +password值在/redis/redis.conf文件中搜索requirepass + +进入redis命令行 +./redis/src/redis-cli -h host -p port -a password + + + +[root@localhost src]# cd /opt/sudytech/custom/redis-2.8.17/ +[root@localhost redis-2.8.17]# redis-server redis.conf //启动redis +[root@localhost ~]# redis-cli //进入redis客户端 +127.0.0.1:6379> keys * //取出所有的key +(empty list or set) +127.0.0.1:6379> quit //退出客户端 + +127.0.0.1:6379> set key1 value1 //set +OK +127.0.0.1:6379> get key1 //get +"value1" +127.0.0.1:6379> del k1 //删除一个key +(integer) 1 +127.0.0.1:6379> flushdb //清空所有数据 + + + +Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled。。。。 + +进入客户端设置模式: +redis-cli +config set protected-mode "no" + +``` +******************************************************** + + +#### 1.3.4 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/appStore/apache-tomcat-6.0.35/bin/startup.sh + +``` +******************************************************************** + + +#### 1.3.5 为每个tomcat配置单独的jdk +``` +一、安装jdk,如jdk-6u45-linux-x64.bin +1、添加执行权限 + chmod u+x jdk-6u45-linux-x64.bin +2、解压 + ./jdk-6u45-linux-x64.bin + +二、配置tomcat的 ../bin/setclasspath.sh 在文件的开头添加以下 +export JAVA_HOME=/opt/sudytech/jdk1.6.0_45 +export JRE_HOME=/opt/sudytech/jdk1.6.0_45/jre + +三、重启tomcat + + + +部署多个tomcat主要修改三个端口: + +1.HTTP端口,默认8080,如下改为8081 + + + +2.远程停服务端口,默认8005,如下改为8006 +...... + + +3.AJP端口,默认8009,如下改,8010 + + +``` +******************************************************************** + + +#### 1.3.6 yum rpm安装卸载软件 +``` +yum安装: + # yum install 包名 +yum卸载: + # yum -y remove 包名 + +查询所有安装软件 rpm -qa +查看是否安装软件 rpm -qa | grep java +卸载软件 rpm -e 如果提示有依赖,可以加上 --nodeps + +[root@localhost openldap]# rpm -qa | grep openldap +openldap-2.4.44-15.el7_5.x86_64 +openldap-servers-2.4.44-15.el7_5.x86_64 +compat-openldap-2.3.43-5.el7.x86_64 + +[root@localhost openldap]# rpm -e --nodeps openldap-2.4.44-15.el7_5.x86_64 +[root@localhost openldap]# rpm -e --nodeps openldap-servers-2.4.44-15.el7_5.x86_64 +[root@localhost openldap]# rpm -e --nodeps compat-openldap-2.3.43-5.el7.x86_64 +``` +******************************************************************** + + +#### 1.3.7 make安装卸载软件 +``` +用于linux源码安装软件,一般下载源码包得到文件:xxxx.tgz + +1、解包软件 +tar zxf xxxx.tgz + +2、配置 +cd xxxx +./configure .... + +3、编译 +make + +4、安装 +make install + +5、卸载 +make uninstall + +``` +******************************************************************** + + +

+ +### 1.4 IP及防火墙 +#### 1.4.1 查看ip及端口是否可以访问、开放端口 +``` + wget http://127.0.0.1:8080 + + ping + ip: 查看某一个ip地址是否能够连通,如: ping 114.80.67.193 + + telnet ip port : 查看某一个机器上的某一个端口是否可以访问,如:telnet 114.80.67.193 8080 + + netstat -nal 查看网络通信情况 + + +查看端口占用 + netstat -ntlp //查看当前所有tcp端口· + netstat -ntulp |grep 80 //查看所有80端口使用情况· + netstat -an | grep 3306 //查看所有3306端口使用情况· + + +查看开放的端口 +firewall-cmd --list-all + +开放端口 +firewall-cmd --zone=public --add-port=4789/udp --permanent +firewall-cmd --zone=public --add-port=80/tcp --permanent +firewall-cmd --zone=public --add-port=80/udp –permanen +firewall-cmd --zone=public --add-port=8060/tcp --permanent + +刷新 +firewall-cmd --reload +``` +******************************************************************** + + +#### 1.4.2 关闭centos的防火墙 +``` +一、firewall方式 + + firewall-cmd --state 查看防火墙状态 + + systemctl stop firewalld.service 关闭防火墙,centos7下 + + systemctl disable firewalld.service 关闭开机启动 + + +二、service方式 + + 查看防火墙状态: + + [root@centos6 ~]# service iptables status + + iptables:未运行防火墙。 + + 开启防火墙: + + [root@centos6 ~]# service iptables start + + 关闭防火墙: + + [root@centos6 ~]# service iptables stop + + /etc/sysconfig/iptables + +三、iptables方式 + + 先进入init.d目录,命令如下: + + [root@centos6 ~]# cd /etc/init.d/ + + [root@centos6 init.d]# + + 然后 + + 查看防火墙状态: + + [root@centos6 init.d]# /etc/init.d/iptables status + + 暂时关闭防火墙: + + [root@centos6 init.d]# /etc/init.d/iptables stop + + 重启iptables: + + [root@centos6 init.d]# /etc/init.d/iptables restart + + +``` +******************************************************************** + + +

+ +### 1.5 知识点 +#### 1.5.1 查看内存 + +``` +top +free -m +cat /proc/meminfo 机器的内存使用信息 +cat /proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。 +cat /proc/pid/statm 进程所占用的内存 + +[root@localhost webapps]# free + total used free shared buffers cached +Mem: 4043716 3783532 260184 0 31424 340132 +-/+ buffers/cache: 3411976 631740 +Swap: 2096472 993204 1103268 + +输入:free + +total:总计物理内存的大小 + +used:已使用多大 + +free:可用有多少 + +Shared:多个进程共享的内存总额 + +Buffers/cached:磁盘缓存的大小 + +第三行(-/+ buffers/cached) + +used:已使用多大 + +free:可用有多少 + +第四行就不多解释了。 + +区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是260184KB,已用内存是3783532KB,第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。 + + 如上例:631740=260184+31424+340132 +``` +******************************************************************** + + +#### 1.5.2 linux标准输入输出2>&1 +``` +linux标准输入输出2>&1 + + /home/share/timerSearch/timerSearchDB.sh >> /home/share/timerSearch/record.txt 2>&1 + +linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2。 + STDIN是标准输入,默认从键盘读取信息;STDOUT是标准输出,默认将输出结果输出至终端;STDERR是标准错误,默认将输出结果输出至终端。 + 由于STDOUT与STDERR都会默认显示在终端上,为了区分二者的信息,就有了编号的0,1,2的定义,用1表示STDOUT,2表示STDERR。 + 2>&1,指将标准输出、标准错误指定为同一输出路径 + +eg1:cat >>filetest 2>&1 <find.out 2>find.err,会将STDOUT与STDERR分别存放至find.out和find.err中。该命令也可以写成下面三种形式 + find /etc -name passwd 1>find.out 2>find.err + find /etc -name passwd 2>find.err >find.out + find /etc -name passwd 2>find.err 1>find.out + 3、若要将所有标准输出及标准错误都输出至文件,可用&表示全部1和2的信息,eg: + find /etc -name passwd &>find.all 或 find /etc -name passwd >find.all 2>&1 + 4、2>&1 ---标准错误重新定向到标准输出 + 5、用法:find /etc -name passwd &2>&1 |less + 可分解成 + find /etc -name passwd & 表示前面的命令放到后台执行。 + 2>&1 |less 表示将标准错误重定向至标准输出,并用less进行分页显示 + +https://www.cnblogs.com/jacob-tian/p/6110606.html + +``` +******************************************************************** + + +#### 1.5.3 定时执行脚本[笔记](https://github.com/scott180/MyNotes/blob/master/bash/%E5%AE%9A%E6%97%B6%E6%89%A7%E8%A1%8C%E8%84%9A%E6%9C%AC/%E5%AE%9A%E6%97%B6%E6%89%A7%E8%A1%8C%E8%84%9A%E6%9C%AC.txt ) +``` +定时查询docker的mysql数据库并保存 +#!/bin/bash +#file=/home/share/timerSearch/record.txt +#crontab -uroot -e +#*/1 * * * * /bin/bash /home/share/timerSearch/timerSearchDB.sh >> /home/share/timerSearch/record.txt 2>&1 +echo "===============begin=========================" +echo "定时查询脚本启动了。。。" +date "+%Y-%m-%d %H:%M:%S" + +docker_name=mobile_ucp_db_1 +sql="use UCPPLUS;select id,loginName,name,password,idcard,field29 from T_USER where loginName='admin'\G;" +#docker exec -it ${docker_name} mysql -uroot -pSudy.web123 -e $sql >> $file +docker exec -i mobile_ucp_db_1 mysql -uroot -pSudy.web123 -e "select now();use UCPPLUS;select id,loginName,name,password,idcard,field29 from T_USER where loginName='admin'\G;" >> /home/share/timerSearch/recordDB.txt + +echo "" +echo "" + + + + +#crontab -uroot -e +0 3 * * 5 /data/sudytech/shell/copyCasSecret.sh + +说明: +分钟 小时 日 月 星期 命令 +* * * * * * + +第1列表示分钟1~59 每分钟用*或者 */1表示 +第2列表示小时1~23(0表示0点) +第3列表示日期1~31 +第4列 表示月份1~12 +第5列标识号星期0~6(0表示星期天) +第6列要运行的命令 + +``` +******************************************************************** + + +#### 1.5.4 文件权限 +``` +查看文件属性 ls -l test.sh +赋予执行权限 chmod +x test.sh +赋予全部权限 chmod 777 test.sh + +改变文件属性(二进制) chmod #chmod 664 chap1.txt 110110100 +改变文件属性(字母) chmod u=rw,g=rw,o=r chap1.txt r w x +改变文件所属用户 chown user1 chap1.txt +改变文件所属用户及所属组 chown user1:root chap1.txt +改变文件所属组 chgrp root chap1.txt + + +Linux系统是个多用户系统,应该能做到不同的用户能同时访问不同的文件,因此一定要有文件权限控制机制。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。这里我们特别关心的是输出行前面的第1~10个字符。第1个字符代表文件类别,第2~4个字符“rw-”是文件拥有者的权限,第5~7个字符“rw-”是文件所属组的权限,第8~10个字符“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.txt +chap1.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.txt + + +chown 用户名 文件或目录名——改变文件(或目录)的拥有者或所属组 + 例如: + [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.5.5 用户和组的管理 +``` +su 切换root +su 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.5.6 问题 +``` +查看句柄 + ulimit -n + +修改句柄 有三种办法: +https://blog.csdn.net/skieske/article/details/79261469 + +①:ulimit -n 65536 +这种是一次性的,当服务器重启或者重新登录服务器就会变成1024 + +②:vi /etc/security/limits.conf +修改linux系统参数。添加 + +*  soft  nofile  65536 +*  hard  nofile  65536 + +这种办法需要重启服务器 + +③:vim /etc/profile +添加/或者修改: +ulimit -SHn 65536 + +然后使修改生效: +source /etc/profile + +然后再ulimit -a + + +建议三种方法都要试一下 + +``` + +``` + history 历史记录显示时间 + 在/etc/profile 中增加 export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " + 写入环境变量 source /etc/profile +``` + +``` +centos7虚拟机不能上网 + 在存储linux目录的CentOS.vmx文件加入 ethernet0.virtualDev = "e1000" 再重启虚拟机 + +linux虚拟机上传下载文件 + 打开虚拟机linux,使用命令 ifconfig 查看ip,再使用xshell连接。 +``` + +``` +微信企业号连接超时: connect timed out + wget https://qyapi.weixin.qq.com/cgi-bin/gettoken + ping qyapi.weixin.qq.com + + 1、可能是防火墙打开了 + 2、/etc/hosts 策略配置错了 +``` +******************************************************************** + + +## 2、Shell编程

+ +### 2.1、shell概述及优势

+```java +============================================================== + Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序调用。 + 当普通用户成功登录后,系统将执行一个称为Shell的程序。正是Shell进程提供了命令行提示符。作为默认值,对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。 + + Linux中的Shell有多种类型,其中最常见的是Bourne Shell (sh)、C Shell (csh)和Korn Shell (ksh)。三种Shell各有优缺点。Bourne Shell是Unix最初始的Shell,并且在每种Unix上都可以使用。Bourne Shell在Shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种Shell。Bash(Bourne Again Shell)是Bourne Shell的扩展,与Bourne Shell完全向下兼容,并且增加了许多特性。它还包含了很多C Shell和Korn Shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。 + C Shell是一种比Bourne Shell更适于编程的Shell,它的语法与C语言很相似。Linux为喜欢使用C Shell的人员提供了Tcsh。Tcsh是C Shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写矫正、历史命令替换、作业控制和类似C语言的语法,它提供比Bourne Shell更多的提示符参数。 + Korn Shell集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。 + + + Bash是大多数Linux系统(包括红旗Linux系统)的默认Shell。Bash有以下的优点: + (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]#wcdir.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创建、执行

+```java +============================================================== + 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 变量、引号、数组、传递参数

+```java +============================================================== +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_name +echo ${your_name} +变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界 + +`单引号:` +#单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; +单引号字串中不能出现单引号(对单引号使用转义符后也不行) + +`双引号:` + your_name='qinjx' + str="Hello, I know your are \"$your_name\"! \n" +双引号的优点: +#双引号里可以有变量 +双引号里可以出现转义字符 + +`数组:` +#!/bin/sh +arr=(12 '单引号' “双引号” 22) +echo "第二个值:" ${arr[1]} +echo “所有元素:” ${arr[@]} +echo "数组长度: ${#arr[@]}" + +数组赋值 my_array[0]=A + +`注释` +以"#"开头的行就是注释,会被解释器忽略。 + +'传递参数:' +参数处理 说明 +$# 传递到脚本的参数个数 +$* 以一个单字符串显示所有向脚本传递的参数。 +如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 +$$ 脚本运行的当前进程ID号 +$! 后台运行的最后一个进程的ID号 +$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 +如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 +$- 显示Shell使用的当前选项,与set命令功能相同。 +$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 +``` +|参数处理 | 说明 | +| ------ | ----- | +| `$#` | `传递到脚本的参数个数` | +| `$*` | `以一个单字符串显示所有向脚本传递的参数` | +| `$@` | `与$*相同,但是使用时加引号,并在引号中返回每个参数` | +``` +$* 与 $@ 区别: +相同点:都是引用所有参数。 +不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。 +#!/bin/bash +# author:菜鸟教程 +# url:www.runoob.com + +echo "传递参数个数 \$# $#" +echo "-- \$* 演示 ---" +for i in "$*"; do + echo $i +done + +echo "-- \$@ 演示 ---" +for i in "$@"; do + echo $i +done + +执行脚本,输出结果如下所示: +$ chmod +x test.sh +$ ./test.sh 1 2 3 +#或/bin/sh test.sh 1 2 3 +-- $* 演示 --- +1 2 3 +-- $@ 演示 --- +1 +2 +3 + +============================================================== +``` + +### 2.4、shell 运算符

+```java +============================================================== + +原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。 +expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 +例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '): + +#!/bin/bash +val=`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.com + +a=10 +b=20 + +val=`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" +fi +if [ $a != $b ] +then + echo "a 不等于 b" +fi +执行脚本,输出结果如下所示: +a + b : 30 +a - b : -10 +a * b : 200 +b / a : 2 +b % a : 0 +a 不等于 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.com + +a=10 +b=20 + +if [ $a -eq $b ] +then + echo "$a -eq $b : a 等于 b" +else + echo "$a -eq $b: a 不等于 b" +fi +if [ $a -ne $b ] +then + echo "$a -ne $b: a 不等于 b" +else + echo "$a -ne $b : a 等于 b" +fi +if [ $a -gt $b ] +then + echo "$a -gt $b: a 大于 b" +else + echo "$a -gt $b: a 不大于 b" +fi +if [ $a -lt $b ] +then + echo "$a -lt $b: a 小于 b" +else + echo "$a -lt $b: a 不小于 b" +fi +if [ $a -ge $b ] +then + echo "$a -ge $b: a 大于或等于 b" +else + echo "$a -ge $b: a 小于 b" +fi +if [ $a -le $b ] +then + echo "$a -le $b: a 小于或等于 b" +else + echo "$a -le $b: a 大于 b" +fi +执行脚本,输出结果如下所示: +10 -eq 20: a 不等于 b +10 -ne 20: a 不等于 b +10 -gt 20: a 不大于 b +10 -lt 20: a 小于 b +10 -ge 20: a 小于 b +10 -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.com + +a=10 +b=20 + +if [ $a != $b ] +then + echo "$a != $b : a 不等于 b" +else + echo "$a != $b: a 等于 b" +fi +if [ $a -lt 100 -a $b -gt 15 ] +then + echo "$a 小于 100 且 $b 大于 15 : 返回 true" +else + echo "$a 小于 100 且 $b 大于 15 : 返回 false" +fi +if [ $a -lt 100 -o $b -gt 100 ] +then + echo "$a 小于 100 或 $b 大于 100 : 返回 true" +else + echo "$a 小于 100 或 $b 大于 100 : 返回 false" +fi +if [ $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 不等于 b +10 小于 100 且 20 大于 15 : 返回 true +10 小于 100 或 20 大于 100 : 返回 true +10 小于 5 或 20 大于 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.com + +a=10 +b=20 + +if [[ $a -lt 100 && $b -gt 100 ]] +then + echo "返回 true" +else + echo "返回 false" +fi + +if [[ $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.com + +a="abc" +b="efg" + +if [ $a = $b ] +then + echo "$a = $b : a 等于 b" +else + echo "$a = $b: a 不等于 b" +fi +if [ $a != $b ] +then + echo "$a != $b : a 不等于 b" +else + echo "$a != $b: a 等于 b" +fi +if [ -z $a ] +then + echo "-z $a : 字符串长度为 0" +else + echo "-z $a : 字符串长度不为 0" +fi +if [ -n $a ] +then + echo "-n $a : 字符串长度不为 0" +else + echo "-n $a : 字符串长度为 0" +fi +if [ $a ] +then + echo "$a : 字符串不为空" +else + echo "$a : 字符串为空" +fi +执行脚本,输出结果如下所示: +abc = efg: a 不等于 b +abc != efg : a 不等于 b +-z abc : 字符串长度不为 0 +-n abc : 字符串长度不为 0 +abc : 字符串不为空 +``` + +#### 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.com + +file="/var/www/runoob/test.sh" +if [ -r $file ] +then + echo "文件可读" +else + echo "文件不可读" +fi +if [ -w $file ] +then + echo "文件可写" +else + echo "文件不可写" +fi +if [ -x $file ] +then + echo "文件可执行" +else + echo "文件不可执行" +fi +if [ -f $file ] +then + echo "文件为普通文件" +else + echo "文件为特殊文件" +fi +if [ -d $file ] +then + echo "文件是个目录" +else + echo "文件不是个目录" +fi +if [ -s $file ] +then + echo "文件不为空" +else + echo "文件为空" +fi +if [ -e $file ] +then + echo "文件存在" +else + echo "文件不存在" +fi +执行脚本,输出结果如下所示: +文件可读 +文件可写 +文件可执行 +文件为普通文件 +文件不是个目录 +文件不为空 +文件存在 + + +============================================================== +``` + +### 2.5、shell 常用命令

+#### 2.5.1、shell echo命令 +```java +============================================================== +Shell echo命令 +Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式: +echo string +您可以使用echo实现更复杂的输出格式控制。 + +1.显示普通字符串: +echo "It is a test" +这里的双引号完全可以省略,以下命令与上面实例效果一致: +echo It is a test + +2.显示转义字符 +echo "\"It is a test\"" +结果将是: +"It is a test" +同样,双引号也可以省略 + +3.显示变量 +read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 +#!/bin/sh +read name +echo "$name It is a test" +以上代码保存为 test.sh,name 接收标准输入的变量,结果将是: +[root@www ~]# sh test.sh +OK #标准输入 +OK It is a test #输出 + +4.显示换行 +echo -e "OK! \n" # -e 开启转义 +echo "It it a test" +输出结果: +OK! + +It it a test + +5.显示不换行 +#!/bin/sh +echo -e "OK! \c" # -e 开启转义 \c 不换行 +echo "It is a test" +输出结果: +OK! It is a test + +6.显示结果定向至文件 +echo "It is a test" > myfile + +7.原样输出字符串,不进行转义或取变量(用单引号) +echo '$name\"' +输出结果: +$name\" + +8.显示命令执行结果 +echo `date` +注意: 这里使用的是反引号 `, 而不是单引号 '。 +结果将显示当前日期 + +============================================================== +``` +#### 2.5.2、shell printf命令 +```java +============================================================== +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.com + +printf "%-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 def + +printf "%s\n" abc def + +printf "%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 abc +1 abc +abcdefabcdefabc +def +a b c +d e f +g h i +j + and 0 +printf的转义序列 +序列 说明 +\a 警告字符,通常为ASCII的BEL字符 +\b 后退 +\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 +\f 换页(formfeed) +\n 换行 +\r 回车(Carriage return) +\t 水平制表符 +\v 垂直制表符 +\\ 一个字面上的反斜杠字符 +\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效 +\0ddd 表示1到3位的八进制值字符 +实例 +$ printf "a string, no processing:<%s>\n" "A\nB" +a string, no processing: + +$ printf "a string, no processing:<%b>\n" "A\nB" +a string, no processing:
+ +$ 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命令 +```java +============================================================== +Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。 +数值测试 +参数 说明 +-eq 等于则为真 +-ne 不等于则为真 +-gt 大于则为真 +-ge 大于等于则为真 +-lt 小于则为真 +-le 小于等于则为真 +实例演示: +num1=100 +num2=100 +if test $[num1] -eq $[num2] +then + echo '两个数相等!' +else + echo '两个数不相等!' +fi +输出结果: +两个数相等! +代码中的 [] 执行基本的算数运算,如: +#!/bin/bash + +a=5 +b=6 + +result=$[a+b] # 注意等号两边不能有空格 +echo "result 为: $result" +结果为: +result 为: 11 + +`字符串测试` +参数 说明 += 等于则为真 +!= 不相等则为真 +-z 字符串 字符串的长度为零则为真 +-n 字符串 字符串的长度不为零则为真 +实例演示: +num1="ru1noob" +num2="runoob" +if test $num1 = $num2 +then + echo '两个字符串相等!' +else + echo '两个字符串不相等!' +fi +输出结果: +两个字符串不相等! + +`文件测试` +参数 说明 +-e 文件名 如果文件存在则为真 +-r 文件名 如果文件存在且可读则为真 +-w 文件名 如果文件存在且可写则为真 +-x 文件名 如果文件存在且可执行则为真 +-s 文件名 如果文件存在且至少有一个字符则为真 +-d 文件名 如果文件存在且为目录则为真 +-f 文件名 如果文件存在且为普通文件则为真 +-c 文件名 如果文件存在且为字符型特殊文件则为真 +-b 文件名 如果文件存在且为块特殊文件则为真 +实例演示: +cd /bin +if test -e ./bash +then + echo '文件已存在!' +else + echo '文件不存在!' +fi +输出结果: +文件已存在! +另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如: +cd /bin +if test -e ./notFile -o -e ./bash +then + echo '有一个文件存在!' +else + echo '两个文件都不存在' +fi +输出结果: +有一个文件存在! +============================================================== +``` + +### 2.6、shell 流程控制

+#### 2.6.1、if +```java +============================================================== +if elif else fi + +if else +if +if 语句语法格式: +if condition +then + command1 + command2 + ... + commandN +fi +写成一行(适用于终端命令提示符): +if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi +末尾的fi就是if倒过来拼写,后面还会遇到类似的。 +if else +if else 语法格式: +if condition +then + command1 + command2 + ... + commandN +else + command +fi +if else-if else +if else-if else 语法格式: +if condition1 +then + command1 +elif condition2 +then + command2 +else + commandN +fi +以下实例判断两个变量是否相等: +a=10 +b=20 +if [ $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 小于 b +if 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 ... itemN +do + command1 + command2 + ... + commandN +done +写成一行: +for var in item1 item2 ... itemN; do command1; command2… done; +当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。 +in列表是可选的,如果不用它,for循环使用命令行的位置参数。 +例如,顺序输出当前列表中的数字: +for loop in 1 2 3 4 5 +do + echo "The value is: $loop" +done +输出结果: +The value is: 1 +The value is: 2 +The value is: 3 +The value is: 4 +The value is: 5 +顺序输出字符串中的字符: +for str in 'This is a string' +do + echo $str +done +输出结果: +This is a string +``` + +#### 2.6.3、while +``` +while 语句 +while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为: +while condition +do + command +done +以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。 +#!/bin/sh +int=1 +while(( $int<=5 )) +do + echo $int + let "int++" +done +运行脚本,输出: +1 +2 +3 +4 +5 +使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令 +。 +while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。 + +echo '按下 退出' +echo -n '输入你最喜欢的网站名: ' +while read FILM +do + echo "是的!$FILM 是一个好网站" +done +运行脚本,输出类似下面: +按下 退出 +输入你最喜欢的网站名:菜鸟教程 +是的!菜鸟教程 是一个好网站 +无限循环 +无限循环语法格式: +while : +do + command +done +或者 +while true +do + command +done +或者 +for (( ; ; )) +``` + +#### 2.6.4、until +``` +until 循环 +until循环执行一系列命令直至条件为真时停止。 +until循环与while循环在处理方式上刚好相反。 +一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。 +until 语法格式: +until condition +do + command +done +条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。 +``` + +#### 2.6.5、case +``` +`case esac` +Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下: +case 值 in +模式1) + command1 + command2 + ... + commandN + ;; +模式2) + command1 + command2 + ... + commandN + ;; +esac +case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 +取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 +下面的脚本提示输入1到4,与每一种模式进行匹配: +echo '输入 1 到 4 之间的数字:' +echo '你输入的数字为:' +read aNum +case $aNum in + 1) echo '你选择了 1' + ;; + 2) echo '你选择了 2' + ;; + 3) echo '你选择了 3' + ;; + 4) echo '你选择了 4' + ;; + *) echo '你没有输入 1 到 4 之间的数字' + ;; +esac +输入不同的内容,会有不同的结果,例如: +输入 1 到 4 之间的数字: +你输入的数字为: +3 +你选择了 3 +``` + +#### 2.6.6、break和continue +``` + +跳出循环 +在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。 +break命令 +break命令允许跳出所有循环(终止执行后面的所有循环)。 +下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。 +#!/bin/bash +while : +do + echo -n "输入 1 到 5 之间的数字:" + read aNum + case $aNum in + 1|2|3|4|5) echo "你输入的数字为 $aNum!" + ;; + *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" + break + ;; + esac +done +执行以上代码,输出结果为: +输入 1 到 5 之间的数字:3 +你输入的数字为 3! +输入 1 到 5 之间的数字:7 +你输入的数字不是 1 到 5 之间的! 游戏结束 + +continue +continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 +对上面的例子进行修改: +#!/bin/bash +while : +do + echo -n "输入 1 到 5 之间的数字: " + read aNum + case $aNum in + 1|2|3|4|5) echo "你输入的数字为 $aNum!" + ;; + *) echo "你输入的数字不是 1 到 5 之间的!" + continue + echo "游戏结束" + ;; + esac +done +运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "Game is over!" 永远不会被执行。 +esac +case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。 +============================================================== +``` + +### 2.7、shell 函数

+```java +============================================================== +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.com + +demoFun(){ + echo "这是我的第一个 shell 函数!" +} +echo "-----函数开始执行-----" +demoFun +echo "-----函数执行完毕-----" +输出结果: +-----函数开始执行----- +这是我的第一个 shell 函数! +-----函数执行完毕----- + + +下面定义一个带有return语句的函数: +#!/bin/bash +# author:菜鸟教程 +# url:www.runoob.com + +funWithReturn(){ + echo "这个函数会对输入的两个数字进行相加运算..." + echo "输入第一个数字: " + read aNum + echo "输入第二个数字: " + read anotherNum + echo "两个数字分别为 $aNum 和 $anotherNum !" + return $(($aNum+$anotherNum)) +} +funWithReturn +echo "输入的两个数字之和为 $? !" +输出类似下面: +这个函数会对输入的两个数字进行相加运算... +输入第一个数字: +1 +输入第二个数字: +2 +两个数字分别为 1 和 2 ! +输入的两个数字之和为 3 ! +函数返回值在调用该函数后通过 $? 来获得。 +注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。 +函数参数 +在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... + + +带参数的函数示例: +#!/bin/bash +# author:菜鸟教程 +# url:www.runoob.com + +funWithParam(){ + 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 输入、输出重定向

+```java +============================================================== +http://www.runoob.com/linux/linux-shell-io-redirections.html +Shell 输入/输出重定向 +大多数 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 >> file +2 表示标准错误文件(stderr)。 +如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写: +$ command > file 2>&1 + +或者 + +$ command >> file 2>&1 +如果希望对 stdin 和 stdout 都重定向,可以这样写: +$ command < file1 >file2 +command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。 + +Here Document +Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。 +它的基本的形式如下: +command << delimiter + document +delimiter +它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。 +注意: +结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。 +开始的delimiter前后的空格会被忽略掉。 +实例 +在命令行中通过 wc -l 命令计算 Here Document 的行数: +$ wc -l << EOF + 欢迎来到 + 菜鸟教程 + www.runoob.com +EOF +3 # 输出结果为 3 行 +$ +我们也可以将 Here Document 用在脚本中,例如: +#!/bin/bash +# author:菜鸟教程 +# url:www.runoob.com + +cat << EOF +欢迎来到 +菜鸟教程 +www.runoob.com +EOF +执行以上脚本,输出结果: +欢迎来到 +菜鸟教程 +www.runoob.com + + +`/dev/null 文件` +如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null: +# command > /dev/null +/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。 +如果希望屏蔽 stdout 和 stderr,可以这样写: +$ command > /dev/null 2>&1 +注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。 + +`笔记列表` + +$ command > file 2>&1 +$ command >> file 2>&1 +这里的&没有固定的意思 +放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下 +1 => stdout +2 => stderr +0 => 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 文件包含

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

+```java +============================================================== + 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 +储存正在编辑的文件为filename + +wq filename +储存正在编辑的文件为filename,并退出vi + +q! +放弃所有修改,退出vi + +set nu +显示行号 + +/或? +查找,在/后输入要查找的内容 + +n +与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 + + +对于第一次用vi,有几点注意要提醒一下: +1、 用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 +2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。 +3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:) + +``` + +## 4、其他

+### 4.1、修改linux时间

+```java +============================================================== +http://blog.chinaunix.net/uid-20672257-id-3013282.html +调整linux系统时间和时区与Internet时间同步 +一、修改时区: +# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime +修改为中国的东八区 +# vi /etc/sysconfig/clock +ZONE="Asia/Shanghai" +UTC=false +ARC=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 才是重要的时间依据。 +# hwclock +Tue 06 May 2008 03:49:37 PM CST -0.039646 seconds +同步BIOS时钟,强制把系统时间写入CMOS: +# clock -w + + +先使用 date -s 10/17/2008 修改日期 +然后 date -s 10:12:13 修改时间 +clock -w 写入bios + +============================================================== +``` + +### 4.2、星期月份英语

+```java +============================================================== +星期一: 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 + +东西南北 East West South North === e w s n + +============================================================== +``` \ No newline at end of file