• linux基础6-bash shell编程


    1. type [-ta] name

    ![](https://i.imgur.com/ABAWYiG.png) 一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法。 1.1.判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是:
            type ls 的输出是 ls 是 `ls --color=auto' 的别名
    
            type if 的输出是 if 是 shell 关键字
    
            type type 的输出是 type 是 shell 内嵌
    
            type gedit 的输出是 gedit 是 /usr/bin/gedit
    
            type frydsh 的输出是 bash: type: frydsh: 未找到
    

    1.2.判断一个名字当前是否是alias、keyword、function、builtin、file或者什么都不是的另一种方法(适用于脚本编程):

            type -t ls 的输出是 alias
    
            type -t if 的输出是 keyword
    
            type -t type 的输出是 builtin
    
            type -t gedit 的输出是 file
    
            type -t frydsh 没有输出
    

    1.3.显示一个名字的所有可能:

            type -a kill 的输出是 kill 是 shell 内嵌 和 kill 是 /bin/kill
    
            type -at kill 的输出是 builtin 和 file
    

    1.4.查看一个命令的执行路径(如果它是外部命令的话):

            type -p gedit 的输出是 /usr/bin/gedit
    
            type -p kill 没有输出(因为kill是内置命令)
    

    1.5.强制搜索外部命令:

            type -P kill 的输出是 /bin/kill
    

    2. 环境变量和自定义变量的显示命令

    ![](https://i.imgur.com/kfCyDke.png)

    2.1 env命令的显示:

    [root@www.linuxidc.com ~]# env HOSTNAME=web -主机名称 TERM=linux -终端 SHELL=/bin/bash -shell HISTSIZE=1000 -历史存储命令书 SSH_CLIENT=58.222.185.248 1113 22 -登录ip 端口 ssh登录端口 SSH_TTY=/dev/pts/6 -远程登录pts ANT_HOME=/opt/apache/apache-ant-1.8.1 USER=root -用户 LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: -颜色的设置信息 SSH_AUTH_SOCK=/tmp/ssh-amfuW25778/agent.25778 MAIL=/var/spool/mail/root -mail PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/ java/jdk1.6.0_20/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin -路径 INPUTRC=/etc/inputrc -键盘 PWD=/root -当前工作路径 JAVA_HOME=/usr/java/jdk1.6.0_20 LANG=zh_CN.GB18030 -语言 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SHLVL=1 HOME=/root LOGNAME=root CVS_RSH=ssh SSH_CONNECTION=58.222.185.248 1113 218.23.142.44 22 LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env

    2.2 set命令的显示

    [root@www.linuxidc.com ~]# set | more ANT_HOME=/opt/apache/apache-ant-1.8.1 BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_COMPLETION=/etc/bash_completion BASH_COMPLETION_DIR=/etc/bash_completion.d BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-RedHat-linux-gnu") BASH_VERSION='3.2.25(1)-release' COLORS=/etc/DIR_COLORS COLUMNS=132 -显示的列数 CVS_RSH=ssh DIRSTACK=() EUID=0 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/root/.bash_history -history文件保存的地址 HISTFILESIZE=1000 HISTSIZE=1000 HOME=/root HOSTNAME=web HOSTTYPE=i686 IFS=$' ' INPUTRC=/etc/inputrc JAVA_HOME=/usr/java/jdk1.6.0_20 LANG=zh_CN.GB18030 LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=41 LOGNAME=root LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;3 2:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31 :*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp =01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:' MACHTYPE=i686-RedHat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 -每过60s检查一次邮箱 OPTERR=1 OPTIND=1 OSTYPE=linux-gnu --More--

    后面还有PS1:命令提示符等

    2.3 export命令的显示:

    将用户自定义的变量编程环境变量用export export 功能说明:设置或显示环境变量。 语  法:export [-fnp][变量名称]=[变量设置值] 补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。 参  数:  -f  代表[变量名称]中为函数名称。  -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。  -p  列出所有的shell赋予程序的环境变量。

    [root@www.linuxidc.com ~]# export
    declare -x ANT_HOME="/opt/apache/apache-ant-1.8.1"
    declare -x CVS_RSH="ssh"
    declare -x G_BROKEN_FILENAMES="1"
    declare -x HISTSIZE="1000"
    declare -x HOME="/root"
    declare -x HOSTNAME="web"
    declare -x INPUTRC="/etc/inputrc"
    declare -x JAVA_HOME="/usr/java/jdk1.6.0_20"
    declare -x LANG="zh_CN.GB18030"
    declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
    declare -x LOGNAME="root"
    declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;32:.exe=01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp=01;35:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35:"
    declare -x MAIL="/var/spool/mail/root"
    declare -x OLDPWD
    declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/java/jdk1.6.0_20/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_AUTH_SOCK="/tmp/ssh-amfuW25778/agent.25778"
    declare -x SSH_CLIENT="58.222.185.248 1113 22"
    declare -x SSH_CONNECTION="58.222.185.248 1113 218.23.142.44 22"
    declare -x SSH_TTY="/dev/pts/6"
    declare -x TERM="linux"
    declare -x USER="root"

    2.4 PS1命令提示符:

    d :代表日期,格式为weekday month date,例如:"Mon Aug 1"

      H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux

      h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略

       :显示时间为24小时格式,如:HH:MM:SS

      T :显示时间为12小时格式

      A :显示时间为24小时格式:HH:MM

      u :当前用户的账号名称

      v :BASH的版本信息

      w :完整的工作目录名称。家目录会以 ~代替

      W :利用basename取得工作目录名称,所以只会列出最后一个目录

      # :下达的第几个命令

      $ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

    如果想要设置终端提示符的样式只要把$PS1在~/.bahrc指定即可比,比如我的设置如下:
    设置一:
    PS1="[e[32m][u@h w]$[e[m]"
    export PS1
    效果:
    [LinuxSong@test ~]$

    设置二:

    if [ $TERM = 'linux' ]; then
    export PS1="[[e[36;1m]u@h [e[31;1m]w[e[32;1m]]> "
    zhcon --utf8
    clear
    elif [ $TERM = "xterm" ]; then
    export PS1="[[e[31;1m]we[0m]> "
    fi

    linux PS1 提示符定义

    2.5 bash下变量的设定的规则:


    重点有三点:4、5、6

    认识Bash这个Shell

    2.6 linux语系的问题:

    查找当前使用的语系:echo $LANG

    显示系统支持的所有语系:locale -a

    临时修改语系

    1 [linux@linux~]$ LANG=zh_CN.gb2312
    2 [linux@linux~]$ echo $LANG
    3 zh_CN.gb2312

    永久修改语系

    1 [linux@linux~]$ vi /etc/sysconfig/i18n
    2 LANG="en_US.UTF-8"
    3 SYSFONT="latarcyrheb-sun16"

    使修改立即生效

    1 [linux@linux~]$ source /etc/sysconfig/i18n

    注:如果在修改语系后,仍然有乱码,则需要修改编辑器的设置,设置方式如图所示,需要将character encoding修改为对应的语系

    2.7 键盘读取变量和声明变量:

    read -p "please input your name:" -t 30 name

    declare(转自:http://www.cnblogs.com/fhefh/archive/2011/04/22/2024857.html)

    declare或typeset内建命令(它们是完全相同的)可以用来限定变量的属性.这是在某些编程语言中使用的定义类型不严格的方式。命令declare是bash版本2之后才有的。命令typeset也可以在ksh脚本中运行。

    declare/typeset 选项

    -r 只读

       1 declare -r var1
    

    (declare -r var1与readonly var1作用相同)

    这大致和C的const限定词相同.一个试图改变只读变量值的操作将会引起错误信息而失败.

    -i 整数

    1 declare -i number
    2 # 脚本余下的部分会把"number"当作整数看待.		
    3 
    4 number=3
    5 echo "Number = $number" # Number = 3
    6 
    7 number=three
    8 echo "Number = $number" # Number = 0
    9 # 脚本尝试把字符串"three"作为整数来求值(译者注:当然会失败,所以出现值为0).
    

    某些算术计算允许在被声明为整数的变量中完成,而不需要特别使用expr或let来完成。

    1 n=6/3
    2 echo "n = $n"       # n = 6/3
    3 
    4 declare -i n
    5 n=6/3
    6 echo "n = $n"       # n = 2
    

    -a 数组

    1 declare -a indices
    

    变量indices会被当作数组.

    -f 函数

       1 declare -f
    

    在脚本中没有带任何参数的declare -f 会列出所有在此脚本前面已定义的函数出来。

       1 declare -f function_name
    

    而declare -f function_name则只会列出指定的函数.

    -x export

       1 declare -x var3
    

    这样将声明一个变量作为脚本的环境变量而被导出。

    -x var=$value
    1 declare -x var3=373

    declare命令允许在声明变量类型的时候同时给变量赋值。

    2.8 系统和个人设定值存储的文件:

    ![](https://i.imgur.com/4axE72T.png)

    执行顺序依次为

    /etc/profile

    .bash_profile

    .bashrc

    /etc/bashrc

    3. 命令别名与历史命令

    ![](https://i.imgur.com/aEnicDp.png)

    alias 别名='原命令'

      作用:设置别名

      别名设置存放在文件 ~/.bashrc 中 ,修改这个文件可永久生效 ~表示家目录
    eg:alias 显示所有的alias设置

    unalias 删除别名

    history [选项]

      作用:查看使用过的命令

      参数:

      -c 清空历史命令

      -w 把缓存中的命令保存到文件中 文件存放在~/.bash.history中 其中~代表家目录

      说明:历史命令默认保存1000条 当超过1000条时会删除开始的历史命令 记录下新的命令 ,默认设置在 /etc/profile 中

      echo $HISTSIZE 可以查看历史记录的当前设置的条数
    eg:history -w hisfile 把shell中的执行记录写入到hisfile中
    :history -r hisfile 把hisfile中的命令记录读取到shell中

    4. bash shell使用环境的终端的环境设置

    4.1 stty -a:

    stty -a 将当前所有的stty参数列出来

    4.2 修改delete向前删除为backspace向前删除:

    如上图所示删除为?(delete)如果需要改成H(bacespace)

    则需使用以下命令

     eg:stty erase ^H
    

    4.3 通用字符和特殊符号:

    4.4 组合按键:

    5. 数据重导向

    ![](https://i.imgur.com/CxHDBAW.png)

    5.1 数据重导向:

    ![](https://i.imgur.com/u44RV1L.png)

    5.2 tee-双向重导向:

    5.3 命令执行的判断依据:

    ![](https://i.imgur.com/7VzYIPq.png)

    6. 管道命令

    ![](https://i.imgur.com/LWAncG7.png)

    6.1 cut和grep的选取命令:

    ![](https://i.imgur.com/L61hoVf.png)

    6.2 sort、uniq、wc排序命令:

    ![](https://i.imgur.com/EMZ2U0n.png)

    6.3 tr、col、join、paste、expand字符转换命令:

    ![](https://i.imgur.com/1Ds5DkX.png)

    6.4 参数代换xargs:

  • 相关阅读:
    一、分组查询
    续、传参
    页面加载时loading效果
    2019-6 21
    一、Nuget管理
    三、项目分析
    七、OIDC
    【2019-10-19】习惯的力量
    【2019-10-18】好好珍惜自己的好奇心
    【2019-10-17】女人有钱,体面又可爱
  • 原文地址:https://www.cnblogs.com/agui125/p/9922602.html
Copyright © 2020-2023  润新知