脚本语言通常是解释型的,这类程序的运行。是由解释器读入程序代码,并将其转换成内部的形式,
再执行,解释器本身是一般的编译型程序。
第一行的开头处使用#!这两个字符,当内核扫描到改行的其余部分,看是否存在可以用来执行程序的
解释器的完整路径。
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表示没有错误,其他任何值表明有错误 |
$* 与 $@ 区别:
Shell数组
array_name=(value1 ... valuen)
${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 运行的通常二者设置大致相同,所以通常前者会调用后者。
原文:https://www.cnblogs.com/coder-zyc/p/9541321.html