shell编程入门

来源:互联网 发布:网络信贷 编辑:程序博客网 时间:2024/06/13 00:15

Shell 简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。


Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。


Shell 环境

Shell 编程跟 Java、PHP 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • ……

本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

#!/bin/bash必须写在脚本文件第一句

运行 Shell 脚本

作为可执行程序

将代码保存为 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 告诉系统说,就在当前目录找。


基本命令

echo        "ASDSDF"                 打印"ASDSDF"
echo    -e      "..............."             -e选项,能识别字符串中的特殊符号,如:    \b(删除一个字符),\n(换行符),\t(tab键)
echo    $PATH                           查看环境变量中定义的目录,部分命令就在目录中,只要命令在其中,就可以在写命令时不必写全,直接按tab键补全命令
cat    文件名                              查看文件内容
pwd                                            查看当前路径

touch    xxx                                新建一个名为"xxx"的文件夹

tar    -zcvf          xx.tar.gz           /xxx           打包命令

rm -rf   xxxxx                             -r 就是向下递归,不管有多少级目录,一并删除            -f 就是直接强行删除,不作任何提示的意思


别名与快捷键

alias              #查看系统中所有的命令别名
比如有以下输出:
alias  rm='rm -i'                -i 选项表示在执行rm命令时会弹出提示,询问你是否确定执行?
alias  ll='ls -l --color=auto'             -l 表示长格式显示           --color=auto表示彩色输出,以区分各文件类型


alias    别名='命令别名'           #设定命令别名    
不过这方法只是暂时生效,想要永久生效,需要把他们写在  /root/.bashrc(root用户) 或 ~/.bashrc(普通用户)  文件里。
再执行 source .bashrc    让文件的修改立即生效。


unalias      别名                  #临时删除,想永久删除需删除上述文件里定义的别名


命令生效顺序:

第一顺位执行用绝对路径或相对路径执行的命令。
第二顺位执行别名。
第三顺位执行Bash的内部命令。
第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。



常用快捷键:

ctrl+c 强制终止当前命令
ctrl+l 清屏
ctrl+a 光标移动到命令行首
ctrl+e 光标移动到命令行尾
ctrl+u 从光标所在处删到行首



输出重定向


标准输入输出

键盘              设备文件名:/dev/stdin               文件描述符:0                标准输入
显示器          设备文件名:/dev/stdout             文件描述符:1                标准输出
显示器          设备文件名:/dev/stderr              文件描述符:2                标准错误输出


正常的输出都是输出到显示器上,重定向则是输出到你指定的文件里

标准输出重定向

命令>文件                     以覆盖的方式将命令的正确输出输出到指定文件或设备中
命令>>文件                   以追加的方式将命令的正确输出输出到指定文件或设备中

标准错误输出重定向

错误命令 2>文件           以覆盖的方式将命令的错误输出输出到指定文件或设备中         (注意'2'和'>'以及'>'和'文件'之间是没有空格的)
错误命令 2>>文件         以追加的方式将命令的错误输出输出到指定文件或设备中          格式和上面一样,没有空格


正确输出、错误输出同时保存

命令&>文件                   以覆盖的方式,将正确输出和错误输出都保存到指定文件中
命令&>>文件        以追加的方式,将正确输出和错误输出都保存到指定文件中
命令>>文件1   2>>文件2                      把正确输出追加到文件1,把错误输出追加到文件2

Tip:ls   &>/dev/null                  /dev/null相当于一个黑洞,垃圾站,将ls的输出结果丢入其中,没有任何输出






输入重定向

在介绍输入重定向之前,先介绍一个命令    wc
wc用法:输入wc,回车,再通过键盘输入一堆任意字符,再ctrl+d,就会打印出你输入内容的字符数、单词数以及行数。
格式: wc   [选项]  [文件名]
          选项      -c   统计字符数
                       -w   统计单词数
-l    统计行数


命令<把文件作为命令的输入           wc<test.log
命令<<标识符





管道符 '|'


格式:命令1  |   命令2                     #命令1的正确输出作为命令2的操作对象
如:netstat    -an   |   grep(查询匹配的行)    ESTABLISHED  |   wc -l                   #查看正连接着linux服务器的客户端,并统计行数

多命令顺序执行

多命令执行符                       格式                                                    作用
          ;                             命令1;命令2                                  多命令顺序执行,之间没有任何逻辑关系   
          &&                         命令1&&命令2                              命令1正确执行,命令2才执行。命令1不正确执行,命令2也不执行
          ||                            命令1||命令2                                 命令1正确执行,命令2不执行。命令1不正确执行,命令2执行
Tip:注意逻辑或和逻辑与的顺序!



通配符

          ?                          匹配一个任意字符(这和正则表达式里的?可不一样)
  *                           匹配任意内容
[ ]   [-]  [^]                       [adff],匹配中括号中任意一个字符。[a-z]  [^q]   (和正则表达式里的一样)  


特殊符号

       单引号  ''                       在单引号中所有的特殊符号都无效
       双引号 ""                       除"$"和"\"以外,其他特殊符号无效
$()                                 用来调用系统命令
$                                    用于调用变量的值,如 $name即可得到变量name的值
\                                    转义符