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" 显示处于何种终端10,0(0表示屏幕号)
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