秒杀包邮! julius 极度帅气日历 流行 人气 男表 男士 手表 9801 | ||
129.0元 |
声明:这是本人订阅的一个国内牛人的博客,每天翻阅该博客,收获甚丰,但不敢专享,因此希望通过小弟的翻译,能够众乐乐。E文好点就不用再看本人的烂翻译了,可以猛击这里 进行订阅,或直接忽视下面的。谢谢,另外欢迎拍砖。
这次先从bash脚本编程这个系列开始,希望能做到跟上大牛的步伐,每天一篇。哈哈。
原文地址在这里:http://www.thegeekstuff.com/2010/03/introduction-to-bash-scripting/
和我们正在进行的 Unix Sed 和 Unix Awk 这个两个系列相同,我们决定发表一些关于 Bash 脚本编程( Bash Scripting )的文章,在这些文章中,我们打算通过举例这种形式覆盖 Bash 脚本编程的全部技巧。
Shell 是一个程序,它能解释用户的命令。这些命令或者是直接由用户输入,或者是在调用 shell 脚本时从一个文件中读入的。
这样 shell 就有了两种分类,当它能接受用户的直接输入时,我们称它为交互式的 shell ( interactive shell )。当它接受来自文件的命令并能执行这些命令时,我们称它为非交互式的 shell ( non-interactive shell )。这种情况下,就像用户直接输入命令一样, shell 从上到下地读取输入文件中的每一行,并执行它们。
打印 shell 的内建变量 $- ,我们可以知道当前 shell 是不是交互式的( interactive or non-interactive ) .
bash-3.00# echo $- himBH |
注:如果当前 shell 是交互式时,那么返回的结果应该包含一个字母“ i ”。
Unix 系统里有许多不同的 shell : Bourne Shell(sh), Bourne again Shell(bash), C Shell(csh), Korn Shell(ksh), Tenex C Shell(tcsh). 使用 Unix 命令 which 和 whereis ,你可以知道上述 shell 的位置,如下所示。
# which bash /bin/bash # whereis bash bash: /bin/bash /usr/share/man/man1/bash.1.gz |
因此,你可以通过输入不同 shell 的名字,切换到新的 shell 。比如,输入 csh 并回车,你就进入了 C Shell.
编写并执行 Shell 脚本 (Shell Script)
例 1. Hello World Bash Script
1. 使用你最熟悉的编辑器( editor )编写下面的两行代码,并保存到一个文件中。
$ cat helloworld.sh #!/bin/bash echo Hello World |
2. 为这个文件选择一个名字,但是该名字不能和 Unix 内建的命令相同 。
3. 脚本总是以“ #! ”这两个字符开始的,你可以读作“ she-bang ”,这表明当前文件是一个脚本,并且应该使用 /bin/bash 进行解释
4. 执行该脚本,如下所示。如果你不会执行脚本,那么可以参考 脚本执行教程
$bashhelloworld.sh Hello World |
5. 当你执行命令“ bash helloworld.sh” 时,非交互式 shell 被启动,文件名被作为一个参数传递给了当前 shell。
6. 文件中第一行用来告诉操作系统哪个 shell 应该用来执行该 脚本。
7. 在上面的例子中, bash 从上到下地解释脚本文件,并且执行文件中的命令。
8. 你甚至不需要“ bash ”就能执行上述 脚本.
9. echo 是一个能够输出我们传递给它的参数的程序,也能用于打印变量的值。
Bash 启动时用到的文件
在早先的文章“ .bash_profile 和相关文件的执行序列 ”中,我们曾讨论过,当一个交互式 shell 启动时,它首先会读取并执行来自 /etc/profile 的命令。如果 /etc/profile 文件不存在,那么 shell 会按照给定的顺序读取并执行来自 ~/.bash_profile , ~/.bash_login 以及 ~/.profile 的命令。选项 -noprofile 会在 shell 启动时限制这种行为。
通常 bash_profile 会执行 ~/.bashrc 。如果你喜欢,你可以显示一条欢迎消息。只有你第一次登录时 shell 才会这样执行。你可以定义你需要的变量,也可以定义那些你将要用到的别名 (aliase) 。从已登录的 shell 退出时, Bash 会读取并执行那些来自 ~/.bash_logout 的命令。
例 2 .在登录时打印欢迎信息
在你的 bash_profile 文件中添加如下内容。如果该文件不存在,那么创建该文件并添加以下内容。
$ cat ~/.bash_profile |
hname=`hostname` |
echo "Welcome on $hname." |
当你登录到一个交互式 shell 时,就能看到如下所示的欢迎信息了。
Login as: root root@dev-db's password: Welcome on dev-db |
例 3. 打印系统相关信息
在这个例子中,当你登录到一个交互式 shell 时,能看到安装在服务器内的内核的名称, bash 的版本,开机时间以及服务器上的时间。
$cat ~/.bash_profile |
hname=`hostname` |
echo "Welcome on $hname." |
|
echo -e "Kernel Details: " `uname -smr` |
echo -e "`bash --version`" |
echo -ne "Uptime: "; uptime |
echo -ne "Server time : "; date |
登录交互式 shell ,它会打印如下信息。
login as: root |
root@dev-db's password: |
Welcome on dev-db |
|
Kernel Information: Linux 2.6.18-128 x86_64 |
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) |
Copyright (C) 2005 Free Software Foundation, Inc. |
Uptime: 11:24:01 up 21 days, 13:15 , 3 users, load average: 0.08, 0.18, 0.11 |
Server time : Tue Feb 22 11 :24:01 CET 2010 |
例 4. 打印最后登录信息
如果多个用户使用相同的账号登录同一台机器时,那么例如最后一次是从哪台机器登录的,登录的时间等细节可能会是最有用的信息。这个例子会在 shell 启动时打印最后登录的信息。
$ cat ~/.bash_profile |
hname=`hostname` |
echo "Welcome on $hname." |
echo -e "Kernel Details: " `uname -smr` |
echo -e "`bash --version`" |
echo -ne "Uptime: "; uptime |
echo -ne "Server time : "; date |
|
lastlog | grep "root" | awk {'print "Last login from : "$3 |
|
print "Last Login Date & Time: ",$4,$5,$6,$7,$8,$9;}' |
在登录过程中,你能看到如下信息:
login as: root |
root@dev-db's password: |
Welcome on dev-db |
Kernel Information: Linux 2.6.18-128 x86_64 |
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) |
Copyright (C) 2005 Free Software Foundation, Inc. |
Uptime: 11:24:01 up 21 days, 13:15 , 3 users, load average: 0.08, 0.18, 0.11 |
Server time : Tue Feb 22 11 :24:01 CET 2010 |
|
Last login from : sasikala-laptop |
Last Login Date & Time: Tue Feb 22 11 :24:01 +0100 2010 |
例 5. 在 shell 启动时定义变量和别名
在你的 .bashrc 和 .bash_profile 中最常用的命令就是 export 和 alias 。
别名也就是用一段文本内容替代其它内容。当你使用别名时, shell 就会把你输入的内容用别名的内容替代。举个例子,如果你需要对 ls 建立一个别名 , 以便于有颜色地列出文件或者是目录,那么照下面的做吧:
alias ls 'ls color=tty' |
如果你把这行命令加入任何一个启动文件,当你执行 ls 命令, shell 就会用‘ ls –color=tty’ 替代 ls 。
Export 命令用来定义环境变量。各种不同的环境变量被系统和其他应用程序使用。这是一种能被任何应用程序和脚本读取的定义变量的方法。如果在定义一个变量时,不使用 export ,那么这个变量只存在于那个专门的进程。
在下面的例子中, HISTSIZE 环境变量将会被定义。以 # 开头的行是一个注释行。
$ cat /etc/profile |
alias ls 'ls --color=tty' |
|
# Setup some environment variables. |
export HISTSIZE=1000 |
|
PATH=$PATH:$HOME/bin:/usr/bin:/bin/usr:/sbin/etc |
|
export PATH |
|
export SVN_SH=${SVN_ RSH -ssh} |
秒杀包邮! julius 极度帅气日历 流行 人气 男表 男士 手表 9801 | ||
129.0元 |