shell脚本学习笔记 (一)

来源:互联网 发布:php 按行读取文件 编辑:程序博客网 时间:2024/04/30 08:04

 一、位于第一行的#!

当一个文件中开头是#!时,内核会扫描改行的剩余部分,看是否存在可用来执行程序的解释器的完整路径,此外内核还会扫描是否有一个选项要传给解释器,内核会以指定的选项来引用解释器,在搭配命令行的其他部分。

例如:

有一个csh脚本,名为/usr/ucb/whizprog

它的第一行为#!/bin/csh -f,且/usr/ucb位于PATH中,

于是当用户输入whizprog -q /dev/tty01时,内核解释#!命令行后就会以如下方式引用csh:

/bin/csh -f /usr/ucb/whizprog -q /dev/tty01

在实际编写脚本时,脚本是否具有可移植性取决于是否有完整的路径名称。

在书写脚本时不使用任何选项,也可以在脚本后面添加" -" ,基于安全性的考虑,这可以避免某种程度上得欺骗是攻击。

例:

#! /bin/sh -

二、shell的基本元素

'-' 以及'--'表示选项

“;”用来分隔同一行里的多条命令

“&”使shell在后台执行其前面的命令。

shell识别的三种基本命令:内建命令、shell函数、外部命令。在这里重点描述一下shell的外部命令:

shell的外部命令就是指shell的副本所执行的命令,其基本过程如下:

a)建立一个新的进程,此进程为shell的一个副本;

b)在新进程中,在PATH指定的目录中,查找指定的命令。(如果命令名称里有"/"则忽略路径查找的步骤)

c)在新程序中,用查找到的命令替换原有的shell程序并执行

d)程序执行完以后,原有的shell继续执行读取下一行命令,执行上诉步骤。

 

变量:shell中变量的赋值方式为 变量名紧跟着“=”,然后是值,其中不能出现任何空格。当在shell想取变量值时,需要在前面加上$符号。

当需要将多个变量连接在一起的时候需要使用引号: fullname="$first $second $third"

 

echo和printf都可用于输出,printf的用法大体与C语言中类似除了一点:如果shell中调用printf时,参数比格式化声明多,则多出来的参数会循环依次的与格式化声明匹配,直到处理完所有的参数。

三、重定向和管道

< 输入重定向

> 输出重定向

>>附加到文件

| 管道

四、 tr命令 

tr [option] source replac 将标准输入输出中德source字符 替换成replac ,其中source 和replac中的字符是逐个对应的,多出的字符不进行替换。

option:

-c, -C 替换的内容为不在source内的字符

-d 删除 source中字符

-s 若标准输入中 重复出现source中的某个字符,则将重复出现的字符替换为一个

五、特殊文件

/dev/null:位桶,所有写入的内容都会被丢弃,而读取它则会立刻返回文件结束描述符EOF

/dev/tty:程序会自动将它定位到一个终端,然后在与程序结合

stty 命令用于控制终端的各种设置

-echo 关闭自动打印输入字符的回显功能

+echo 打开自动打印输入字符的回显功能

六、位置参数

所谓位置参数即是指shell脚本的命令行参数。从1开始,当它超过9时应该用大括号把数字括起来。

例: $1  ${10}

七、简单的执行跟踪

将执行跟踪功能打开后,shell会显示每个执行的命令,并在前面加上“+”。

可以通过给PS4变量赋值改变shell的打印方式

执行时可以用:“sh -x  shell脚本名称”的方式打开执行跟踪功能

也可以在shell脚本中 用“set -x” 打开执行跟踪功能 然后再用"set +x"关闭执行跟踪功能

八、LANG, LC_ALL

LANG变量用来设置locale的默认值

LC_ALL用来覆盖掉所有其他的LC_xxx变量

 

可以通过 locale -a 查看当前系统支持的所有locale

原创粉丝点击