Shell 的历史:bsh  -àBourn Again Shell

             csh

             ksh

bsh的特性:

命令历史,别名,管道,重定向

1.       交互是的执行命令;

2.       编程环境 自动化的应用 

流程控制:顺序执行;选择执行;循环执行。

静态语言,编译型语言;

编译,链接,运行效率高

 

动态语言,解释型语言(解释器ksh,bsh,csh);脚本语言,解释器不需要编译,可以直接运行;运行效率低,便于维护和修改。

所以我们在进行脚本编写的时候,在第一行,必须指定使用哪一种解释器.

Linux上,开发大型的应用,需要借助Perl,Python.

Perl:

Python:完全面向对象,语法、段落缩进、代码结构清晰,易于维护,并且可以开发Web应用。

 

#!/bin/bash

变量:variable 变量是什么?    --命名内存空间

      如何引用变量的值?     $A

对于计算机来讲,数值和字符有严格区别。

变量类型直接决定占用多大内存空间,决定了存储的数据类型,在脚本中当作字符来存储。

bash:

本地变量(局部变量)  只对当前shell有效  可以使用set 来查看当前的本地变量,取消环境变量为unset

环境变量  shell,shell都有效,登出系统之后,则环境变量就会无效.

export= VARIABLE_NAME=Value  指定环境变量

位置变量      

特殊变量($?

 

怎么命名变量:变量的名称只能包含字母,数字,下划线,却只能以字母下划线进行命名。

注意:1.尽可能避开系统已用变量名

      2.编程风格要相同

变量替换:echo $NAME

“ ”,弱引用,变量替换会进行

‘’强引用,变量替换会禁止

` `  表示命令替换,把一个命令的执行结果直接传递给另外一个命令。

显示所有环境变量

#export 用于显示所有环境变量

#printenv 用于显示系统所有的环境变量

#set     用于查看环境变量与自定义变量

 

SHELL,process,prompt  进程都是有父进程fork自身而来。我们打开的每一个命令都属于shell

的子进程。

本地变量:

环境变量:

变量类型:整数,字符,浮点,布尔型

SHELL:(内部命令,外部命令)

 

系统定义的环境变量:为了shell的自身运行,而配置的参数。

#declare –x VARIABLE  声明一个环境变量

       -I  integer    定义个整型

       -a  array     定义数组

#unset VARIABLE_NAME    在使用完变量之后,应该显示撤销。变量的生命周期是shell.

全局配置文件:

/etc/profile, /etc/profile.d/*, /etc/bashrc  (全局配置文件,profile.d/*肢解成片段,全局配置文件)

个人配置文件:

~/.bash_profile, ~/.bashrc, ~/.bash_logout->用户退出时的配置文件,前两个是用户登录所启动的配置文件。

 

SHELL启动的类型:

交互式登录shell       用户通过控制台  su – 交互式

非交互式登录shell     su  ;执行脚本的shell;在图形终端下打开的模拟shell.

交互式登录:

/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非交互式登录:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*

 

profile 类文件中定义什么:

1、  设定环境变量        shell不管退出或者登录都有效的命令

2、  运行一些命令        shell登录过程中运行的命令

bashrc 类的文件定义:

1、  本地变量

2、  命令别名

[root@station30 ~]# export

declare -x CVS_RSH="ssh" 

declare -x DISPLAY="localhost:10.0"     显示处于何种终端1000表示屏幕号)

declare -x G_BROKEN_FILENAMES="1"

declare -x HISTSIZE="1000"            命令历史

declare -x HOME="/root"              当前用户的家目录

declare -x HOSTNAME="station30.example.com"      主机名称

declare -x INPUTRC="/etc/inputrc"                  输入设备的配置文件

declare -x LANG="en_US.UTF-8"                    语言和字符集 #local –a 显示当前系统上支持的字符集,可以通过编辑/etc/sysconfig/i18n定义字符集和我们使用的语言

declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"

declare -x LOGNAME="root"

declare -x LS_COLORS="no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:"

declare -x MAIL="/var/spool/mail/root"

declare -x OLDPWD

declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"  shell中键入的命令对应的可执行搜索路径

注:#export  PATH=$PATH:/root  #export PATH=$PATH:/usr/local/mysql/bin

#export  PATH=/root:/$PATH

我们亦可通过编辑环境变量来定义路径:

vim /etc/profile 编辑之后对于当前shell不会立即生效。让shell 重读一下该文件。可以使用#echo $PATH 或者#source /etc/profile   #.  /etc/profile

declare -x PWD="/root"

declare -x SHELL="/bin/bash"      当前正在执行的shell

declare -x SHLVL="1"

declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"

declare -x SSH_CLIENT="192.168.0.217 4678 22"

declare -x SSH_CONNECTION="192.168.0.217 4678 172.16.31.1 22"

declare -x SSH_TTY="/dev/pts/0"

declare -x TERM="xterm"

declare -x USER="root"

 

basename 基名,该命令可以去除一个路径的基名。

[root@station30 ~]# basename  /etc/sysconfig/i18n

i18n   i18n即为基名

 

命令别名:

alias name='command'

#alias grep=”grep –color=auto”

unalias name

 

bash 的登录与欢迎信息:

可以编辑当前目录下的./bash_profile 我们可以在该文件中添加一些登录欢迎语句。

 

登录界面的欢迎信息:            -----全局变量

#vi /etc/issue

 

在用户登录后所显示的信息        -----全局变量

#vi /etc/motd

 

脚本的执行方式:

1.#chmod +x

#./script_name

2.#bash ./script

 

#bash –n SHELL_FILE 分析shell 脚本是否有错误

#bash –x SHELL_FILE 执行shell 脚本的过程

 

命令一条条执行我们称之为顺序执行:

选择:

循环:

  for 遍历式循环

for VAR in LIST;do

  statement1

  statement2

  …

done

如何定义列表:

1、  简单列出

2、  {1,..10}

3、  `seq 1 10`

4、  `cat /etc/passwd`  可以查看一個文件中的所有行,如果有空格被识别为两行 `ls /var` 命令替换的方式获取列表

Practice 1:设置10个用户,并且设置的用户名是一样的。

Practice2: 写一个脚本:

1、设定变量FILE的值为/etc/passwd

2、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:  (提示:LINES=`wc -l /etc/passwd | cut -d" " -f1`)

         Hello, root, your shell: /bin/bash

3、统计一共有多少个用户

#!/bin/bash

#

FILE='/etc/passwd'

 

LINES=`wc -l $FILE | cut -d' ' -f1`

for LINE in `seq 1 $LINES`;do

  MYUSER=`head -$LINE $FILE |tail -1 |cut -d: -f1`

  MYSHELL=`head -$LINE $FILE |tail -1 |cut -d: -f7`

  echo "Hello,$MYUSER,Your shell:$MYSHELL"

done