初识Shell
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Shell相关的知识,希望对你有一定的参考价值。
1.什么是Shell?
shell处于kernel的外层,用来负责接收使用者输入的命令,然后将命令解释成kernel能了解的方式,然后由kernel去执行,再将结果传回默认的输出周边。shell是一种命令解释器,同时也是一个程序语言。shell有很多种,在众多的Linux发行版中,标准的shell是bash,也是我们学习的主要对象。
2.shell程序的基本组成结构
shell结构大体是由设定变量、内置命令、shell的语法结构、函数组成。
使用实例说明:test.sh
1. #!/bin/bash
2. #说明使用/bin/bash作为这个脚本的解释器
3.
4. #定义一个函数
5. function my_fun () {
6. echo "Hello, $1,today is $2"
7. }
8.
9. #定义连个变量
10. name=$1
11. today=`date`
12.
13. #函数调用
14. my_fun "$name" "$today"
上面的这个脚本要想运行还需要做一些操作,首先给予执行权限
chmod +x test.sh
然后执行
./test.sh willis
输出
Hello, willis,today is Tue Jun 1 14:51:46 CST 2010
3.父shell和子shell
在执行script之前,身处的环境就是父shell。执行script之时,父shell根据#!/bin/bash,fork出来一个新的shell环境,然后在子shell中执行,执行完毕后子shell结束,任然回到父shell中,这样不会影响到父shell的环境。
4.login shell 和non-login shell
这张图片是login shell的流程,当是non-login shell时,只执行方框中的标注的部分。由这张图我们可以知道,在如下几种情况下,执行的流程。
4.1登陆(login)
/etc/profile
~/.bash_profile
4.2注销(logout)
~/.bash_logout
5.Shell交互方式
5.1自动交互方法一
自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法"command << delimiter (分隔符) 从标准输入中读入,直至遇到delimiter分隔符。"
重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。
例:磁盘自动分区脚本
#!/bin/bash
fdisk $1 << EOF
n
P
1
(空格)
+1G
w
EOF
mkfs.xfs /dev/vdb1
自动修改用户密码脚本
#!/bin/bash
passwd $1 << EOF
willis
willis
EOF
5.2自动交互方法二
这时候联想到交互信息的另一个自动输入方法:管道,通过echo + |
例:自动修改用户密码脚本
#!/bin/bash
(echo "redhat"
sleep 1
echo "redhat" )|passwd
自动分区
#!/bin/bash
echo ‘
n
p
1
+1G
w ‘| fdisk $1
mkfs.xfs /dev/vdb1
5.3自动交互方法三
expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:
自动切换到root用户
#!/usr/bin/expect
spawn su root
expect "password: "
send "willis\r"
expect eof
exit
测试通过,运行这个脚本,直接从当前用户登录到root用户。
Shell交互式方法总结:
方法一(重定向)简单直观,也经常有实际应用,但是在自动交互领域功能有限。
方法二(管道)也很简单直观,有时甚至不用sleep配合就能展现强大的自动交互实力
方法三(expect)在功能上是最为强大的,expect本来就是为实现自动交互功能而生,但是缺点是需要安装expect包,在嵌入式等环境下难以安装。
三个方法各有优劣,应用的好,都可以完成Linux Shell自动交互
本文出自 “技术人生,简单不简单” 博客,请务必保留此出处http://willis.blog.51cto.com/11907152/1845287
以上是关于初识Shell的主要内容,如果未能解决你的问题,请参考以下文章