rhces 发表于 2018-8-20 13:49:49

Shell编程初学

  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声明一个环境变量
  -Iinteger    定义个整型
  -aarray   定义数组
  #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、命令别名
  # 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中键入的命令对应的可执行搜索路径
  注:#exportPATH=$PATH:/root#export PATH=$PATH:/usr/local/mysql/bin
  #exportPATH=/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 基名,该命令可以去除一个路径的基名。
  # 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

页: [1]
查看完整版本: Shell编程初学