自学内容网 自学内容网

第一章 Shell 概述

shell起源

  • 1964年,美国AT&T公司的贝尔实验室、麻省理工学院及美国通用电气公司共同参与开始研发一套可以安装在大型主机上的多用户、多任务的操作系统,该操作系统的名称为Multics。

  • 1970年,丹尼斯•里奇和汤普逊启动了另外一个新的多用户、多任务的操作系统的项目,他们把这个项目称之为UNICS。

  • 1973年,使用C语言重写编写了Unix。通过这次编写,使得Unix得以移植到其他的小型机上面。

  • 1979年,第一个重要的标准UNIX Shell在Unix的第7版中推出,并以作者史蒂夫•伯恩(StephenBourne)的名字命名,叫做Bourne Shell,简称为sh。

  • 20世纪70年代末,C Shell作为2BSD UNIX的一部分发布,简称csh。之后又出现了许多其他的Shell程序,主要包括Tenex C Shell(tcsh)、Korn Shell(ksh)以及GNU Bourne-Again shell(bash)。

shell脚本的基本元素

  • 第1行的“#!/bin/bash”

  • 注释:说明某些代码的功能

  • 可执行语句:实现程序的功能

脚本自动增加注释版权信息

[root@server ~]# vim  ~/.vimrc  # 新建配置文件
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
    if expand("%:e") == 'sh'
        call setline(1,"#!/bin/bash")
        call setline(2,"##############################################################")
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: Andy_Sun")
        call setline(6, "# Email: Andy_Sun@163.com")
        call setline(7, "# Organization: http://www.cnblogs.com/Andy_Sun/")
        call setline(8, "# Created Time : ".strftime("%F %T"))
        call setline(9, "# Description:")
        call setline(10,"##############################################################")
        call setline(11, "")
    endif
endfunc

 shell脚本的执行方式:

方法1
  • 使用sh或bash命令执行脚本,不需要执行权限(建议使用),脚本中可以不指定解释器

[root@server ~]# vim  test.sh
#!/bin/bash
echo  "china"
​
[root@server ~]# bash  test.sh
china
[root@server ~]# sh  test.sh
china
  • 可以使用bash -n 脚本名 ,进行语法检测,且不执行脚本

  • 可以使用bash -x 脚本名 ,进行脚本执行跟踪,逐条语句的跟踪执行

方法2
  • 切换到脚本所在目录使用./执行脚本,需要执行权限

[root@server ~]# ./test.sh
-bash: ./test.sh: 权限不够
[root@server ~]# chmod  +x test.sh
[root@server ~]# ./test.sh
方法3
  • 绝对路径执行脚本,需要执行权限

[root@server ~]# vim  /t1.sh
#!/bin/bash
echo  "china"
​
[root@server ~]# /t1.sh
-bash: /t1.sh: 权限不够
​
[root@server ~]# chmod  +x  /t1.sh
[root@server ~]# /t1.sh
china
方法4
  • 使用点(.)或者source 执行脚本,不需要执行权限

[root@server ~]# source  /t1.sh
china
[root@server ~]# .   test.sh
china
注意:
  • 法1、2、3都是启动一个子shell,在子shell中执行此脚本,脚本中设置的变量在脚本执行完毕后不会保存

  • 法4 都是在当前shell进程中执行此脚本,而不是重新启动一个shell 在子shell进程中执行此脚本,并且脚本中设置的变量在脚本执行完毕后会保存下来。

echo打印命令

  • 格式:echo -参数 内容

  • 参数

    • -n :取消输出后行末的换行符号

    • -e :启用转义字符

  • 可以输出带颜色的字体:

    • 格式:echo -e "\e[字体控制;字体颜色或背景色 字符串内容 \e[0m"

    • \e[表示控制开始,\e[0m表示控制结束

    • 字体控制选项:1表示高亮,4表示下划线,5颜色闪烁

    • 颜色如下:字颜色:30-37 , 背景色:40-47

printf 命令

  • printf 命令模仿 C 程序库(library)里的 printf() 程序, 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好,printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n

  • 格式
    printf   格式控制字符串   参数列表

  • # %s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
    # %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

history历史命令
  • 格式:

history [参数] [历史命令保存文件]
  • 参数

    • -c :清空历史命令记录

    • -w:把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文件,则放入默认历史命令保存文件~/.bash_history 中

  • 修改默认记录历史命令条数:

[root@server ~]# vim  /etc/profile
HISTSIZE=1000
  • 面试题:显示hostory历史命令次数最高的top10

[root@server ~]# history |  tr  -s  " " | cut  -d " " -f3 | sort | uniq -c | sort -nr | head -10
# 浏览历史命令记录 | 压缩为1个空格 | 截取以空格作为分割的第3部分 | 排序 | 统计并去重 | 降序 | 显示前10

命令与文件名补全:tab
命令别名
  • 格式:alias 别名=原命令

  • 例:

[root@server ~]# alias  hi=history
[root@server ~]# hi
  • 注意:别名的优先级比命令高,命令执行时的顺序如下:

第一顺位:执行用绝对路径或相对路径执行的命令。
第二顺位:执行别名。
第三顺位:执行 Bash 的内部命令。
第四顺位:执行按照 $PATH 环境变量定义的目录查找顺序找到的第一个命令。
  • 为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”。

[root@server ~]# cat   ~/.bashrc  # 在最下面增加
命令执行顺序:

以相对或者绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;

由 alias 找到该命令来运行;

由 bash 内建的 (builtin) 命令来运行;

透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行;

exit退出程序
  • 作用:终止Shell程序的执行

  • 格式:exit 状态码

  • 状态码:该参数是一个整数值,其取值范围为0~255

  • 注意:Shell程序的退出状态码储存在系统变量$?中,因此,用户可以通过该变量取得Shell程序返回给父进程的退出状态码

  • 常见状态码:

    0----------------命令运行成功
    1----------------通知未知错误
    2----------------误用shell命令
    126-------------命令不可执行
    127-------------没有找到命令
    128-------------无效退出参数
    128+x-----------linux信号x的严重错误
    130--------------命令通过Ctrl+C终止
    255--------------退出状态码越界


原文地址:https://blog.csdn.net/weixin_74344274/article/details/144325200

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!