bash编程学习-基础(2)

8月 23, 2008 – 11:21 下午

1.注意:
当运行脚本文件时,系统会建立一个子shell来运行文件中命令。函数和别名等只有子shell使用。当那个shell退出,父shell重新得到控制的时候,所有的东西都被清空,脚本对shell状态所作的改变耶全部清除。如果不想建在子shell中运行脚本可以直接
source script_name.sh
这里脚本不需要可执行权限。命令在当前shell力执行,所以任何对环境的改变,将在脚本结束时同样起作用
2.脚本选择:
第一行决定了启动的shell,第一行的开始2个字符应该是#!,然后紧跟解释后面命令的shell的路径。空白行也被认为是一行,所以不要让你的脚本以空白行开始。

#!/bin/bash
3.注释:
以#开头
在一个良好的脚本中,第二行经常注明要完成的任务。然后为了明确每一大块命令将被加上注释。
4.脚本调试
调试参数:

短符号 长符号 结果
set -f set -o noglob 禁止特殊字符用于文件名扩展。
set -v set -o verbose 打印读入shell的输入行。
set -x set -o xtrace 执行命令之前打印命令。

可以在文件里面直接定义#!/bin/bash -xv,或者在执行时候指定.bash -xv scripte_name.sh

5.一些环境中的特殊脚本文件.

/etc/profile:当用–login选项或者以SH来调用交互模式时,bash读取/etc/profile的指令。通常是一些设置shell变量PATH,USER,MAIL,HOSTNAME,HISTSIZE

/etc/bashrc: 由于其它的shell也有可会读出/etc/profile,这样的话把bash的脚本直接放到bashrc上更安全点.
~/.bash_profile:个别的为用户配置环境。
~/.bash_login: 只有在你登录进系统才执行的特殊的设置
~/.profile: 没有~/.bash_profile和~/.bash_login文件的情况下被读取。
~/.bashrc:在使用一个非登陆shell,比如使用x终端登录进图行模式。些时bash会搜索~/.bashrc.

~/.bash_logout: 登出系统时候的特别指令.

6.查看环境变量指令 printenv
7.变量设置以及引用. MYVAR=”value” (指定变量MYVAR的值) echo $MYVAR(输出MYVAR这个变量的值)
8.一个变量定义后仅仅在当前shell内产生,属于本地变量,子shell进程不会意识到这个的存在。为了把变量传递给子shell,需要用export命令输出出来.不过在子shell的改变对父shell没有影响.

9.保留变量

变量名字 定义
CDPATH 一个由冒号分割的目录列表作为内建命令 cd 的搜索路径。
HOME 当前用户的home目录;默认为内建命令 cd 。这个变量的值同样被~扩展使用。
IFS 分割域的一个字符的列表;用于shell把词分开作为扩展。
MAIL 如果这个变量设成一个文件名并且 MAILPATH 变量没有设置,Bash在指定文件中通知用户邮件的到达。
MAILPATH 一个用冒号分隔的文件名列表,shell周期性地从这个文件里检测新邮件。
OPTARG getopts 内建命令处理的最后的选项参数的值。
OPTIND 最后一个由 getopts 内建命令处理的选项参数的索引号。
PATH 一个用冒号分隔的目录列表,shell从这些目录里寻找命令。
PS1 主要提示符。默认值是 “‘\s-\v\$ ‘”。
PS2 次要提示符。默认值是 “‘> ‘”。

10.一个数据备份例子:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive 

tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

 # First remove the old bzip2 file.  Redirect errors because this generates some if the archive

# does not exist.  Then create a new compressed file.

rm /var/tmp/home_franky.tar.bz2 2> /dev/null

bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.

scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.

date > /home/franky/log/home_backup.log

echo backup succeeded > /home/franky/log/home_backup.log

以上方法适用于小数据量的备份,如果处理的目录比较大使用rsync同步更加合理.


Post a Comment