zoukankan      html  css  js  c++  java
  • shell 第一篇

    1、 查看当前linux 支持的shell 类型

    [root@nfs01 ~]# cat /etc/shells

    /bin/sh

    /bin/bash

    /sbin/nologin

    /bin/dash

    /bin/tcsh

    /bin/csh

    上面的前三个是常用的,bash比sh要更强,有些如果执行不起来,那么就用bash增强

    shell脚本优势在于处理操作系统底层的业务,php是网页程序,是一款更注重于web网页开发的脚本语言

    考试题一Centoslinux系统默认的shell是()

    bash

    查看方法1、

    [root@nfs01 ~]# echo $SHELL

    /bin/bash

    查看方法2、

    [root@nfs01 ~]# grep root /etc/passwd

    root:x:0:0:root:/root:/bin/bash

    更改默认的shell

    [root@nfs01 ~]# cat /etc/default/useradd

    # useradd defaults file

    GROUP=100

    HOME=/home

    INACTIVE=-1

    EXPIRE=

    SHELL=/bin/bash

    SKEL=/etc/skel

    CREATE_MAIL_SPOOL=yes

    2、书写脚本方法如下:

    脚本开头(第一行)指明解释器

    #!/bin/bash

    #!/bin/sh <==255个字符以内

    注意bash的漏洞(破壳漏洞,注意升级)

    下面是linux中常用脚本语言开头的编码写法:

    #!/bin/sh

    #!/bin/bash

    #!/usr/bin/awk

    #!/bin/sed

    #!/usr/bin/tcl

    #!/usr/bin/expect(sshpass,pssh)

    #!/usr/bin/perl

    #!/usr/bin/env python

    如果脚本里面没有上面的解释器那么就用 类似 python test.txt等来执行

    3、shell的执行方式

    注意点,设置crond任务的时候,最好把系统环境变量在定时任务脚本重新定义,否则,一些系统环境变量将不被加载,这个问题要注意

    shell脚本的执行通常采取下面几种方式

    1)  bash script-name或者sh script-name (推荐使用)

    2)  path /script-name或者./scripts-name  #-->注意“.”点号   《===需要脚本有执行权限

    3)  source script-name 或者. script-name   #-->注意“.”点号

    4)  sh <script-name 或者 cat script-name|sh(同样适合bash)

    题:

    1、  已知如下命令及返回结果,请问echo $user的返回结果为()

    [root@nfs01 pyrene]# cat test.sh

    user=`whoami`

    [root@nfs01 pyrene]# sh test.sh

    [root@nfs01 pyrene]# echo $user

    本题答案为空。解释:

    由于每个脚本的父shell是bash所以这里再用sh执行这里的执行之后就属于sh子shell了,然后bash这个父shell里面就没有,echo 子shell里面的东西,当然执行不了就为空

    1)儿子shell会直接继承父亲shell的变量函数等,反之不可以

    2)如果希望反过来继承,用source或者点号执行脚本

    4、脚本书写习惯

    1)脚本书写脚本解释器

    2)脚本开头增加版权等信息

    #date

    #auther

    #mail

    #versipn

    #founction

    3)脚本不用中文

    4)脚本以.sh为扩展名命名

    5、shell变量

    变量分为两类:环境变量(全局变量)和普通变量(局部变量)

    环境变量又可以分为自定义环境变量和bash内置的环境变量

    普通变量也可称为局部变量,只能在创建它们的shell函数或者shell脚本中使用,普通变量一般是由开发者用户创建的

    2)su – 这里的-会把环境变量带过来

    3)环境变量在命令行中创建,推出命令行的时候这些变量就会丢失,如果希望永久保存环境变量可以在家目录中设置.bash_profile或者.bashrc文件中

    如果希望全局生效(所有用户都生效)/etc/bashrc 或者/etc/profile

    4)传统上,所有环境变量名字格式都应该大写,自己定义的环境变量用exprot命令定义,如:export OLDGIRL=1

    6、自定义环境变量

    格式

    1) export 变量名=value

    2) 变量名= value,export 变量名

    3) declare -x 变量名 =value

    [root@backup-41 ~]# export NAME=oldboy

    [root@backup-41 ~]# env|grep NAME    

    HOSTNAME=backup-41

    NAME=oldboy

    LOGNAME=root

    G_BROKEN_FILENAMES=1

    当然上面的是不是永久生效的,如果想永久生效需要放入.bash_profile 或者.bashrc中,如果想要全局生效需要放入/etc/profile中

    自定义环境变量生产环境java环境配置实例:tomcat,resin,csvn,hadoop

    export JAVA_HOME=/application/jdk

    export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

    export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

    export RESIN_HOME=/application/resin

    常放在/etc/profile

    如果写一个JAVA脚本,好要把上述的java环境配置放入脚本内重新定义,特别是执行定时任务的时候

    7、环境变量的显示与取消

    1)通过echo或者printf命令输出变量

    $HOME 用户登录时进入的目录

    $UID   当前用户的UID(用户标识)

    $PWD  当前工作目录的绝对路径名

    $SHELL  当前shell

    $USER  当前用户

    2)可以用env来显示环境变量

    3)unset取消本地环境变量

    环境变量小节:

    1)  变量名通常大些

    2)  可以在自身的shell以及子shell中使用

    3)  通过export来定义环境变量

    4)  输出用$变量名,取消用unset变量名

    5)  书写定时任务要注意环境变量,最好在脚本中重新定义

    6)  如果希望永久生效放在用户环境变量文件或者全局环境变量文件里

    8、普通变量的定义

    1)普通变量定义

    变量名=value

    变量名=‘value’

    变量名=“value”

    2)变量名一般由字母,数字,下划线组成,可以字母或者下划线开头

    3)把一个命令的结果作为变量的定义方法

    变量名= `ls`  这里是反引号

    变量名=$(ls)

    [root@backup-41 ~]# CMD=$(pwd)

    [root@backup-41 ~]# echo $CMD

    /root

    如按天打包文件

    tar -zcvf etc_$(date +%F).tar.gz /etc/

    普通变量定义小节:

    1)  连续的数字或者字符串可以不加引号

    2)  变量内容很多,还虚妄解析变量,加双引号

    3)  希望原样输出就用单引号

    4)  希望变量内容是命令结果的定义:反引号 如a=`ls`或者$()如a=$(ls)

    变量的输出

    1)  在变量名前面加上$可以取得此变量的值,使用echo或者printf命令可以显示变量的值,$A和${A}的写法不同但是功能是一样的

    2)  echo输出的时候也有单引号双引号、反引号的形式,用法和前面的总结一致

    3)  ${WEEK}day如果变量后面有其他字符连接的时候,必须给变量加上大括号{}

    4)  要养成将所有字符串变量用双引号括起来的习惯,将会减少很多编程时遇到的问题

    习题:下面的会输出什么样的记过

    [root@backup-41 ~]# a=192.168

    [root@backup-41 ~]# b="192.168"

    [root@backup-41 ~]# b="192.168"

    [root@backup-41 ~]# c="192.168"

    [root@backup-41 ~]# echo "a=$a"

    a=192.168

    [root@backup-41 ~]# echo "b=$b"

    b=192.168

    [root@backup-41 ~]# echo "c=$c"

    c=192.168

    1)$变量名表示输出变量,可以用$c和${c}两种用法

    环境变量小结

    1)  一个等号是赋值,两个等号是比较

    2)  打印变量,变量名前接上$符号,变量名后面接着字符的时候要用大括号将变量单独括起来

    3)  打印输出或者变量时,一般用双引号或者不加引号,如果是字符串变量最好加上双引号,如果原样输出,用单引号

    4)  希望变量的内容是执行命令,要用反引号或者$()把变量括起来

    9、shll 的特殊重要变量

    1)位置参数

    $0获取当前执行脚的shell脚本文件名,如果执行脚本带路径那么就包括脚本路径

    $n 获取当前执行的shell脚本的第n个参数值,如果n=1..9,但n为0的时候表示脚本的文件名,如果n大于9,用大括号括起来${10},参数以空格隔开

    $#获取当前执行的shell 脚本后面接的参数的总个数

    dirname  直接取脚本路径 

    basename  直接取脚本名字

    案例2、/etc/init.d/rpcbind start

    上述脚本中的start参数会传给脚本里的$1进行判断

    case “$1” in

      start>

          start

    案例三

    在n.sh中写入echo $0然后执行下面的

    [root@nfs01 scripts]# sh n.sh oldboy

    n.sh

    案例四

    在t.sh中写入判断

    #!/bin/sh

    if [ $# -ne 2 ]

      then

        echo "USAGE $0 arg1 arg2"

        exit 1

    fi

    echo $1 $2

    [root@backup-41 scripts]# sh t.sh aa

    USAGE t.sh arg1 arg2

    [root@backup-41 scripts]# sh t.sh aa bb

    aa bb

     

    2)进程状态变量

    $$ 获取当前shell 脚本的进程号(PID)

    $! 执行上一次指令的PID

    $? 获取执行上一个指令的返回值(0为成功,非零为失败)  #这个变量很常用

  • 相关阅读:
    C#
    C#
    C#
    C#
    C#
    C#
    系统工具
    远程登录
    文件传输服务
    软件安装
  • 原文地址:https://www.cnblogs.com/pyrene/p/6431727.html
Copyright © 2011-2022 走看看