bash编程学习-基础(2)
8月 23, 2008 – 11:21 下午1.注意:
当运行脚本文件时,系统会建立一个子shell来运行文件中命令。函数和别名等只有子shell使用。当那个shell退出,父shell重新得到控制的时候,所有的东西都被清空,脚本对shell状态所作的改变耶全部清除。如果不想建在子shell中运行脚本可以直接:这里脚本不需要可执行权限。命令在当前shell力执行,所以任何对环境的改变,将在脚本结束时同样起作用
source script_name.sh
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 ,或者在执行时候指定.bash -xv scripte_name.sh-xv
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把词分开作为扩展。 |
如果这个变量设成一个文件名并且 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同步更加合理.
