zoukankan      html  css  js  c++  java
  • shell-基础

    shell编程特点

    shell是Unix/Linux最重要的软件之一,目前最流行的shell被陈伟Bash,几乎所有的Linux和绝大部分的Unix都可以使用Bash。
    shell是一个命令解释器,是介于操作系统内核与用户之间的一个绝缘层。准确地说,他也是一种强力的计算机语言,一个shell程序被称为一个脚本,
    是一种容易使用的工具,它可以通过将公共程序,工具,和编译过的二进制程序粘合在一起来建立应用,事实上,所有的Unix命令和工具再加上公共程序,
    对于test与循环结构,也会给脚本添加强力的支持和增加灵活性。shell脚本对于管理系统任务和其它的重复工作的历程来说,表现的非常好

    shell脚本遵循典型的Unix哲学,就是把大的复杂的工程分成小规模的子任务,并且把这些部件和工具组合起来。

    什么时候不使用shell脚本?

    1、资源密集型的任务,尤其在需要考虑效率时(排序,hash等)
    2、需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算
    3、有跨平台移植需求
    4、负责的应用,在必须使用结构化编程的时候
    5、对于安全有很高要求的任务,

    /etc/shells 查看系统中的shell

    [root@localhost ~]# cat /etc/shells 
    /bin/sh
    /bin/bash
    /sbin/nologin
    /usr/bin/sh
    /usr/bin/bash
    /usr/sbin/nologin
    /bin/tcsh
    /bin/csh
    [root@localhost ~]# 

    chsh -l改变用户的shell

    [root@localhost ~]# echo $SHELL       # 当前的shell
    /bin/bash
    [root@localhost ~]# 

    bash的特性

    TAB
    history
    !$
    alt+
    ~/.bash_history
    ~/.bash_logout在用户退出的时候调用

    alias别名 -- 命令过长复杂的时候可以用

    grep --color=tty

    alias gc='grep --color=tty'当前终端生效
    alias 查看别名
    [root@localhost ~]# alias
    alias cp='cp -i'
    alias egrep='egrep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias grep='grep --color=auto'
    alias l.='ls -d .* --color=auto'
    alias ll='ls -l --color=auto'
    alias ls='ls --color=auto'
    alias mv='mv -i'
    alias rm='rm -i'
    alias vi='vim'
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
    [root@localhost ~]# 
    [root@localhost ~]# which rm
    alias rm='rm -i'
        /usr/bin/rm
    [root@localhost ~]# 

    针对所有终端生效需要修改文件

    [root@localhost ~]# vim /etc/bashrc 
    [root@localhost ~]# 

    shell显示带颜色的字体

    33[字体背景色;字体颜色m ANSI控制码 33[0m 关闭所有属性

    字体颜色: 30 - 37

    [root@localhost ~]# echo -e "33[31m 红色字 33[0m"
     红色字 
    [root@localhost ~]# echo -e "33[32m 绿色字 33[0m"
     绿色字 
    [root@localhost ~]# 

    字体背景颜色: 40 - 47

    [root@localhost ~]# echo -e "33[42;37m 黑底红字 33[0m"
     黑底红字 
    [root@localhost ~]# 

     改变提示符文件颜色

    [root@localhost ~]# echo -e "33[40;32m"
    本来是黑底白字,现在变为黑底绿字

    报警声音

    [root@localhost ~]# echo -e "07 the bell ring"
     the bell ring

    掌握参数传递机制Xargs

    xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具,它擅长将标准输入数据转换成命令行参数,xargs能够
    处理管道或者stdin并将其转换成特定命令的命令参数。xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行,
    xargs的默认命令时echo,空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代
    [root@localhost test]# vim test.txt
    [root@localhost test]# cat test.txt 
    a b c d e f g
    h i j k l m n
    o p q 
    r s t 
    u v w x y z
    [root@localhost test]# cat test.txt | xargs
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    [root@localhost test]# 
    [root@localhost test]# cat test.txt | xargs -n 3
    a b c
    d e f
    g h i
    j k l
    m n o
    p q r
    s t u
    v w x
    y z
    [root@localhost test]# echo "nameXnameXnameXname" | xargs -dX
    name name name name
    [root@localhost test]# echo "nameXnameXnameXname" | xargs -dX -n2
    name name
    name name
    [root@localhost test]# 

    shell脚本规范

    创建脚本,脚本文件名以.sh 结尾,为了能够通过文件名进行分辨

    #!/bin/bash
    # 告诉系统下面的脚本用什么解释器解释
    # 以井号开头的注释,介绍脚本的用途
    查看磁盘使用情况
    [root@localhost test]# df -h
    文件系统                 容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root   17G  5.2G   12G   31% /
    devtmpfs                 897M     0  897M    0% /dev
    tmpfs                    912M     0  912M    0% /dev/shm
    tmpfs                    912M  1.1M  911M    1% /run
    tmpfs                    912M     0  912M    0% /sys/fs/cgroup
    /dev/sda1               1014M  179M  836M   18% /boot
    tmpfs                    183M  4.0K  183M    1% /run/user/42
    tmpfs                    183M   36K  183M    1% /run/user/1000
    tmpfs                    183M     0  183M    0% /run/user/0
    [root@localhost test]# 

    脚本从上到下依次解释,需要chmod +x赋予脚本可执行权限,root用户x权限,对于普通用户必须rx(读一行,执行一行)

    脚本中某一条命令出错了,不影响后边的执行,shell是解释性程序,shell从脚本中取出每一行然后用bash解释,交给内核,有一条出错后边的继续运行。

    变量的类型

    shell的变量

    Linux变量分为不同的种类,人为的分成了4种:

    1、环境变量,系统启动的时候指定的一系列变量,这些变量可以直接拿过来使用,比如查看当前的用户,当前的shell,当前的家目录等等
    [root@localhost test]# env
    XDG_SESSION_ID=124
    HOSTNAME=localhost.localdomain
    SELINUX_ROLE_REQUESTED=
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=10.0.0.1 50442 22
    SELINUX_USE_CURRENT_RANGE=
    SSH_TTY=/dev/pts/1
    USER=root

    echo可以显示某一个变量,shell认为变量所有的值都是字符,不区分字符类型

    [root@localhost test]# echo $USER
    root
    [root@localhost test]# echo $SHELL
    /bin/bash
    [root@localhost test]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@localhost test]# echo $HOME
    /root
    [root@localhost test]# 

    set查看所有变量环境变量与非环境变量,用户登录时为用户指定的

    [root@localhost test]# set

    -n 不换行

    [root@localhost test]# echo -n$UID
    -n0
    [root@localhost test]# echo -e "aaa
    bbb
    "
    aaa
    bbb
    
    [root@localhost test]# 
    [root@localhost test]# echo -e "aaa	bbb	"
    aaa    bbb    
    [root@localhost test]# 
    2、第二种称为预定义变量,这也是系统预定义好的,预定义变量和执行程序或者操作名对应的参数相关,比如一个shell脚本也可以像命令一样执行,
    shell也可以有对一个的一些参数,命令和对应的参数先关,这个也叫作预定义变量
    [root@localhost test]# cat z.sh 
    #!/bin/bash
    echo '$0'=$0      #表示当前的进程名
    echo '$*'=$*      #表示所有位置参数的内容
    echo '$#'=$#      #表示位置参数的数量
    echo '$$'=$$      #表示当前进程的进程好
    echo '$!'=$!      #表示后台运姓的最后一个进程好
    echo '$?'=$?      #表示命令执行后返回的状态
    [root@localhost test]# 
    [root@localhost ~]# ./z.sh z y g
    -bash: ./z.sh: 权限不够
    [root@localhost ~]# chmod 777 z.sh 
    [root@localhost ~]# ./z.sh z y g
    $0=./z.sh
    $*=z y g
    $#=3
    $$=18030
    $!=
    $?=0
    [root@localhost ~]# 
    $# 位置参数的数量,判断超出规定参数的数量,报警。
    $? 命令执行后的返回状态,0位执行正确,非0位执行错误,判断备份tar命令有没有执行成功
    $$ 确认进程是否运行

    变量的作用域

    当前终端设置a=123,再开启一个新的终端,新开的bash是不生效的
    当前进程的变量不会影响父进程的shell

    脚本的运行方式

    ./z.sh
    bash z.sh
    source z.sh
    .z.sh

    前两个是一样的,后面的两种不一样,source和.使用当前的shell执行,不会生成子shell

    source和.后面的命令如果没有外部命令就都当做内部命令来处理,如果是尾部命令就会产生子进程,改变子进程的状态,没有产生就在内部

    子进程到父进程,子进程中定义的变量,父进程得不到,如果需要这样去做也可以,可以让子进程产生一个临时文件,然后父进程访问这个文件。不过不好,效率低

    还可以通过配置文件,将产生的变量,给其他的shell使用,Linux给我们提供了几个文件

    /etc/bashrc
    /etc//profile
    ~/.bashrc
    ~/.bash_profile
    ~/.bash_logout

    /etc/下的会对所有的用户生效,家目录下只影响单一一个用户。

    bashrc打开新的bash就生效

    profile必须是用户登录,还有就是打开整个图形界面

    算式置换

    [root@localhost ~]# echo $((10+20))
    30
    [root@localhost ~]# echo $[10+20]
    30
    [root@localhost ~]# expr 10+20
    10+20
    [root@localhost ~]# let a = 10 + 20
    -bash: let: =: 语法错误: 期待操作数 (错误符号是 "=")
    [root@localhost ~]# let a=10+20
    [root@localhost ~]# echo $a
    30
    [root@localhost ~]# 

    命令置换

    [root@localhost ~]# date +%m%d
    0831
    [root@localhost ~]# a=`date+%m%d`
    bash: date+%m%d: 未找到命令...
    [root@localhost ~]# a=`date +%m%d`
    [root@localhost ~]# a=$(date +%m%d)
    [root@localhost ~]# `echo `echo ls``
    ls
    [root@localhost ~]# $(echo $(echo ls))
    anaconda-ks.cfg  initial-setup-ks.cfg  Python-3.5.3.tgz  z.sh
    Desktop         Python-3.5.3           test
    [root@localhost ~]# a=123
    [root@localhost ~]# b=$(echo $$(echo a))
    [root@localhost ~]# echo $b
    $a
    [root@localhost ~]# eval echo $b
    123
    [root@localhost ~]# 

    变量置换

    ………………具体请百度。

  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/52-qq/p/9560514.html
Copyright © 2011-2022 走看看