Shell脚本学习指南笔记(一)

  脚本语言通常是解释型的,这类程序的运行。是由解释器读入程序代码,并将其转换成内部的形式,

再执行,解释器本身是一般的编译型程序。

  第一行的开头处使用#!这两个字符,当内核扫描到改行的其余部分,看是否存在可以用来执行程序的
解释器的完整路径。

  Shell命令与参数

    分号(;)可用来分隔同一行的多条命令,Shell会依次执行;

    使用&,则表示Shell将在后台执行其前面的命令,Shell不用等到该命令执行完,就可以继续下一条命令的执行;

  Shell变量

    1.名称开头是一个字母或下划线开头符号,后面可以接字母数字,或下划线符号;

    2.赋值方式的方式为:变量名=值(注意等号前后不能有任何空格,变量值之间有空格时,需要用引号括起来),单行多次赋值,之间用空格分隔

    3.使用变量:$变量名

first=isaac middle=bashevis last=singer #单行可以多次赋值
fullname="isaac bashevis singer"    #值中包含空格时使用引号
oldname=$fullname        #此处不需要引号

  访问Shell脚本的参数

    位置参数指的是Shell脚本的命令行参数;在Shell函数里,它们同时也可以是函数的参数,各个参数都由整数来命名,$n;当n>9,使用参数时要用大括号括起来,${n};

    补充:几个特殊字符用来处理参数

参数说明 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示Shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

  $* 与 $@ 区别:

  • 相同点:都是引用所有参数
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)    

  

  Shell数组

  • Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小
  • Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
    array_name=(value1 ... valuen)
  • Shell读取数组的格式:
    ${array_name[index]}  #单个元素
    ${array_name[*]}      #所有元素
    ${array_name[#]}      #所有元素

 

 Shell脚本执行跟踪

    在脚本里,用 set -x 命令将执行跟踪的功能打开,然后再用 set +x 命令关闭跟踪功能


  基本的I/O重定向

     以<改变标准输入
    program < file 可将program的标准输入修改为file;

tr -d '\r'  < file.txt 

  

  以>改变标准输入
    program > file 可将program的标准输出修改为file;> 重定向符在目的文件不存在时,会新建一个,然而,如果目的文件已存在,

    它就会被覆盖掉,原本的数据就会丢失;

tr -d '\r'  < file.txt > file.log 

  以>>附加到文件
    program >> file 可将program的标准输出附加到file的结尾处;>> 重定向符在目的文件不存在时,会新建一个,然而,如果目的文件已存在,

    它不会被覆盖掉,而是将程序所产生的数据附加到文件结尾处;

    

  以 | 建立管道
    program1 | program2 可将program1的标准输出修改为program2的标准输入;

  特殊文件:/dev/null与、/dev/tty

  /dev/null为空洞文件,传送到这的数据都会被系统丢掉,当数据写入到这个文件时,程序会认为它已成功完成写入操作,其实什么事情都没有发生过;相反的,如果读取这个文件则会立即返回EOF;

  /dev/tty被打开时,系统会自动将其重定向到一个终端;

  

  以下为网络摘抄

  profile,bashrc,bash_profile区别

  执行顺序为:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout

  关于各个文件的作用域,在网上找到了以下说明:

    (1)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。

    (2)/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。

    (3)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

    (4)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

    (5)~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc /profile中的变量,他们是”父子”关系。

    (6)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

猜你喜欢

转载自www.cnblogs.com/coder-zyc/p/9541321.html