shell 第一篇

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

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

/bin/shpython

/bin/bashlinux

/sbin/nologinweb

/bin/dashshell

/bin/tcsh编程

/bin/cshtomcat

上面的前三个是经常使用的,bash比sh要更强,有些若是执行不起来,那么就用bash加强bash

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

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

bash

查看方法一、

[root@nfs01 ~]# echo $SHELL

/bin/bash

查看方法二、

[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)

题:

一、  已知以下命令及返回结果,请问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  直接取脚本名字

 

 

 

 

案例二、/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为成功,非零为失败)  #这个变量很经常使用

相关文章
相关标签/搜索