yuanqiao 发表于 2018-8-22 06:01:28

shell编程详解

  shell ,process ,prompt 进程都是由其父进程fork自身而来
  #bash ,子shell
  本地变量:
  环境变量:
  变量:变量类型:
  整数;-128--127
  字符;123则占3bit
  浮点;3.333=3333*10^-3
  布尔型;true or false
  bash 一般不支持浮点型
  圆整:3/2= 1
  去掉小数点后面的数字,进而取整;
  shell:
  内部命令;
  外部命令;
  which +command查找命令的位置:
  # which ls
  alias ls='ls --color=tty'
  /bin/ls
  系统定义的环境变量:
  export
  printenv
  定义变量:
  VARIABLE_NAME_NAME
  export -x VARIABLE_NAME
  declare -x VARIABLE_NAME
  -i 整形integer
  -a数组array
  unuset 撤销一个变量;
  哪些文件可以为shell提供配置:
  全局配置文件:
  /etc/profile,
  /etc/profile.d/*
  /etc/bashrc
  个人配置文件:
  ~/.bash_profile
  ~/.bashrc
  ~/.bash_logout
  shell的类型:
  交互式登陆shell:
  /etc/profile/--->/etc/profile.d/* -->~/.profile -->~/.bashrc/
  非交互式登陆shell
  ~/.bashrc-->//etc/bashrc-->/etc/profile.d/*
  su -
  执行脚本的shell
  图形界面下的shell
  profile 文件定义:
  1.设定环境变量
  2.用户登陆之前执行一些命令
  bashrc类文件定义:
  1.本地变量
  2.命令别名
  path命令用于在shell中键入的命令对应的可执行文件的搜索路径
  export $PATH :/root
  export PATH=root:$PATH
  添加新shell执行:export PATH=$PATH :+路径
  locale -a显示当前系统上支持的所有字符集
  export LANG= 设置语言
  internationallization =i18n
  /etc/sysconfig/i18n 定义系统字符集
  source /etc/profile 读一下profile这个文件,来更新shell的环境变量
  . /etc/profile 读一下这个profile文件,来更新shell的环境变量
  当前的环境变量:
  # export
  declare -x CVS_RSH="ssh"
  declare -x DISPLAY="localhost:10.0"
  declare -x G_BROKEN_FILENAMES="1"
  declare -x HISTSIZE="1000"
  declare -x HOME="/root"
  declare -x HOSTNAME="localhost.localdomain"
  declare -x INPUTRC="/etc/inputrc"
  declare -x LANG="en_US.UTF-8"
  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="/root/Desktop/wangzhen/scripts"
  declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
  declare -x PWD="/root"
  declare -x SHELL="/bin/bash"
  declare -x SHLVL="1"
  declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
  declare -x SSH_CLIENT="192.168.0.209 49310 22"
  declare -x SSH_CONNECTION="192.168.0.209 49310 192.168.0.33 22"
  declare -x SSH_TTY="/dev/pts/1"
  declare -x TERM="xterm"
  declare -x USER="root"
  # set
  BASH=/bin/bash
  BASH_ARGC=()
  BASH_ARGV=()
  BASH_LINENO=()
  BASH_SOURCE=()
  BASH_VERSINFO=(="3" ="2" ="25" ="1" ="release" ="i686-redhat-linux-gnu")
  BASH_VERSION='3.2.25(1)-release'
  COLORS=/etc/DIR_COLORS.xterm
  COLUMNS=74
  CVS_RSH=ssh
  DIRSTACK=()
  DISPLAY=localhost:11.0
  EUID=0
  GROUPS=()
  G_BROKEN_FILENAMES=1
  HISTFILE=/root/.bash_history
  HISTFILESIZE=1000
  HISTSIZE=1000
  HOME=/root
  HOSTNAME=localhost.localdomain
  HOSTTYPE=i686
  IFS=$' \t\n'
  INPUTRC=/etc/inputrc
  LANG=en_US.UTF-8
  LESSOPEN='|/usr/bin/lesspipe.sh %s'
  LINES=22
  LOGNAME=root
  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:'
  MACHTYPE=i686-redhat-linux-gnu
  MAIL=/var/spool/mail/root
  MAILCHECK=60
  OPTERR=1
  OPTIND=1
  OSTYPE=linux-gnu
  PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  PIPESTATUS=(="0")
  PPID=15621
  PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\007"'
  PS1='[\u@\h \W]\$ '
  PS2='> '
  PS4='+ '
  PWD=/root
  SHELL=/bin/bash
  SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  SHLVL=1
  SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
  SSH_CLIENT='192.168.0.209 50585 22'
  SSH_CONNECTION='192.168.0.209 50585 192.168.0.33 22'
  SSH_TTY=/dev/pts/2
  TERM=xterm
  UID=0
  USER=root
  _='hello,welcome to my system!'
  consoletype=pty
  命令别名:
  alias name='command'
  给系统命令重命名:
  alias newcommand = command
  cut 使用方法,分割字段:
  -d 后面跟分割的字符
  -f 后面跟以某字符为分割的第几个字段
  例子:
  # cat /etc/passwd
  user1:x:521:521::/home/user1:/bin/bash
  redhat:x:522:522::/home/redhat:/bin/bash
  user2:x:523:523::/home/user2:/bin/bash
  user3:x:524:524::/home/user3:/bin/bash
  user4:x:525:525::/home/user4:/bin/bash
  user5:x:526:526::/home/user5:/bin/bash
  user6:x:527:527::/home/user6:/bin/bash
  user7:x:528:528::/home/user7:/bin/bash
  user8:x:529:529::/home/user8:/bin/bash
  user9:x:530:530::/home/user9:/bin/bash
  user10:x:531:531::/home/user10:/bin/bash
  # cat /etc/passwd | cut -d x -f1
  user1:
  redhat:
  user2:
  user3:
  user4:
  user5:
  user6:
  user7:
  user8:
  user9:
  user10:
  去除重名名:
  unalias newcommand
  例子:
  alias cls = clear
  unalis = cls
  测试shell:
  bash -n +shell文件
  -n可以测试shell的语法错误
  执行shell:
  bash shell文件
  shell脚本文件若引用最后需要unset撤销引用;
  其中需要错误重定向,不然错误会输出在屏幕上;
  &> /dev/null
  将错误信息输出在 /dev/null
  选择
  循环
  for:循环次数已知
  while:
  until
  循环必须有推出条件:
  for循环推出条件
  for VAR in LIST;
  do statement1;
  do statement2;
  done
  如何定义列表:
  1、简单列出
  2、{1..10}
  3、·seq 1 10·
  4、·cat /etc/passwd·
  bash -n first.sh 对脚本进行语法检查
  bash -v first.sh 对脚本的每个原始命令及其执行结果
  bash -x first.sh 对脚本以测试模式执行
  set -x :显示由shell执行的命令及其参数
  set -v :显示由shell读入的命令行
  set -n :读取命令但不执行他们,用于语法检查
  vim 文本编辑器:
  vi improved= vim
  编辑模式:(命令模式)
  输入模式:
  末行模式:
  vim + n file 打开文件后进入第几行
  vim +/字符(pattern)/ file
  编辑模式--》输入模式;
  i:insert,在当前光标之前输入字符;
  a:append(追加),在当前光标之后输入字符
  I:在当前光标所在行行首,进行操作
  A:在当前光标所在行行尾,进行操作
  o:光标所在行的下方打开一个新行,进行操作
  O:在光标所在行的上方打开一个新行,进行操作
  输入模式--》编辑模式:敲击ESC键
  编辑模式--》到末行模式:
  :冒号进入末行模式
  例子:
  :set nu 指在末行模式在 为文本设置行号
  :set nonu 取消行号
  末行模式-->编辑模式
  末行模式双按ESC键进入编辑模式
  退出文本:
  末行模式:1、保存退出   :wq   :wqall
  ZZ若文本么有改变,则不保存离开,若文件被改动,则还保存退出
  :q!文件改变,强制离开且不保存文件
  一般模式下的操作:
  光标移动:
  H键向左移动
  L键向右移动
  J键向下移动
  K键向上移动
  K
  H          L
  J
  G 跳到文件最后一行
  5G表示跳到文件第5行
  gg跳到文件首行,==1G
  N enter 5 ENTER即向下跳5行
  N space 5 space即光标向此行移动5个字符
  0键、HOME键移动 到行首
  $、END键移动到行尾
  翻屏
  ctrl + f 向下翻一屏
  ctrl + b 向上翻一屏
  ctrl + d 向下半屏
  ctrl + u 向上半屏
  删除字符:
  x 向后删除一个 字符
  X 向前删除一个字符
  5x向后删除5个字符
  dd 删除一整行
  d$ 删除光标到行尾的字符
  dG 删除光标到最后一行的数据
  R替换:
  replace
  r替换光标处的字符
  X 向前删除一个字符
  撤销:
  u(undo)撤销最近一次的操作
  5u 撤销最近5次的操作
  ctrl + r 撤销刚才的撤销操作
  点. 重复前一个操作
  复制:
  yy复制正行
  5yy向下复制5行
  y1G 复制光标所在行到第一行的数据
  yG复制光标所在行到最后一行的数据
  y0复制光标所在位置到行首的数据
  y$复制光标所在位置到行尾的数据
  粘贴:
  p将复制的数据 粘贴在所在光标的下一行
  P将复制的数据 粘贴在所在光标的上一行
  可视化模式:通过拖动鼠标进行操作
  v 键进入按字符选取
  V 键进入按行选取
  查找:
  less /?
  /keyword
  ?keyword
  n/N查找下一个
  替换:substitude
  flags:
  i:ignore 忽略大小写
  g:global全局
  % 代表全文
  @和#代表 /
  m,n 从m行到n行
  文件名+s/查找的内容/替换的内容/+flags(参数)
  一次打开多个文件切换:
  末行模式下 输入:next 显示下一篇
  输入:perv 显示上一个
  显示第一个:first
  显示最后一个:last
  比较文件时可以,分割窗口:
  水平分割:ctrl + w 再按 s
  垂直分割:ctrl + w 再按 w
  ctrl + w ,再按 wasd四个方向键切换窗口
  ctrl + w
  ctrl + w
  ctrl + w
  ctrl + w
  显示时,分割多个文件:
  -o :水平分割
  -O :垂直分割
  设定vim的工作属性:
  末行模式下:
  :set nu 显示行号
  :set nonu 取消行号
  : set ai(autoindent)自动缩进
  :set noai
  只对当前vim有效!!
  vim配置文件:
  全局配置文件: /etc/vimrc
  个人配置文件: ~/.vimrc
  语法高亮(sytax):
  显示颜色的不同
  sytax on | off
  搜索高亮:
  :fset hlsearch
  bash shell 算数运算:
  +
  -
  *
  %
  let A=2+3
  echo $A
  算数运算:
  1、let [算式]
  2、$[算式]
  3、$((算式))
  4、expr
  例子:
  let
  echo $A
  ....
  语句的逻辑运算:
  命令退出码:0 正确   1错误
  && 与
  A && B若结果为真则运算得0若结果为错误则运算得1
  有一为假则结果为假
  || 或
  有一为真则结果为真
  ! 非

页: [1]
查看完整版本: shell编程详解