一.shell基础

cat /etc/shells  当前操作系统可以使用的shell


什么是shell

实现某种功能的,有执行权限的文本文件


  命令行解释器


    内建命令 (系统内部提供的命令)

    外建命令 (安装对应的软件包才有的命令)

    type cd //查看cd是属于什么类型的命令



支持快捷键

支持tab健补全

历史命令history -c    //清除历史命令

-w    //马上保存刚执行的命令进.bash_history



别名

如何查看当有系统已有别名命令 alias

如何自定义别名命令 如何删除自定义的别名命令 alias grep='grep --color'  unalias grep

如何永久定义别名命令 /etc/bashrc   ~/bashrc

定义的别名命令所有用户都可以使用 /etc/bashrc

如何给某个用户设置别名命令  ~/.bashrc



历史命令

grep 1000 /etc/profile 保存一千条命令

source /etc/profile 马上生效

cat ~/.bash_history 存放的历史命令重启系统生效



管道 |


命令1 | 命令2 | 命令3


重定向

>            ping -c 3 loalhost > /dev/null

>>     ping -c 3 localhost >> /tmp/err.txt


<               mail -s "first mail' -u root < /etc/error.txt

<<


2>    重定向错误输出,覆盖       cd /etc/ 2> /tmp/err.txxt

2>>   追加


&> /dev/null 无论对还是错都重定向到空

&>>追加 


``   执行命令本身的功能   echo `date + %m`

;    顺序执行命令,前面的命令出错不影响后面的命令执行    cd;ls;cd /etc/

&&   前面的命令执行成功后面的命令才能执行  cd /asf &> /tmp/err.txt && ls

||   前面的命令失败才执行后面的命令 cd /asf &> /dev/null /|| echo "no file" 


 

检查主机在不在线

ping -c 2 127.0.0.1 &> /dev/null && echo "yes" || echo "no"



shell变量

变量 用一串固定字符变化的值

     写脚本时把变化的数据用变量来表示


shell变量类型

1、自定义变量: 程序根据写脚本的需要定义的变量,定义变量时,要遵循变量的使用规则


定义变量:

变量名=变量值


变量名的命名规则:


1.可以用字母数字下划线,但不能以数字开头和纯数字

2.同一个变量赋两个值,最后一个值生效

3.给变量赋值时,两边不能有空格

4.区分大小写


set 显示当前系统内已经定义的所有变量

set | grep name


env 只显示系统已有的环境变量


定义变量  (默认的变量的类型都是字符类型)

变量名=变量值

name=wsyht

age=24



使用变量 $变量名 $name


输出变量的值 echo $变量名 echo $name $age


撤消变量 unset 变量名 unset name


2、系统环境变量:在系统启动时,加载系统配置文件定义的变量,

   变量名和变量值是系统设置,变量名通常用大写字母定义,变存量的值是规定的,通常

   情况下不建议修改系统环境变量的值


3、预定义变量: 当前脚本使用的shell里预先定义好的变量,变量名是固定的,变量的值不修改


预定义变量:预先定义好的变量,变量名和值都是固定的。

$? 上一条命令执行结果的返回状态 0 执行成功 

                              非0 执行失败


$0 当前执行脚本的脚本名和路径


$! 当前终端后台最后一个运行的进程


$$ 当前终端运行进程的pid号  //敲ps可查看进程pid号


$# 脚本位置参数的个数


$* 脚本所有位置参数的值



4、位置变量:在执行脚本或调用函数时给自已传值

$1... ...$n

${10}... ...${N}


dirname $0   #获取脚本路径

basename $0  #获取脚本名


 

位置变量:

$1~ $9  ${数字}

$1  脚本的第一个位置变量

$2  脚本的第二个位置变量

$3  脚本的第三个位置变量

当脚本的位置变量个数大于9时 要这样表示位置变量

${10}  脚本的第10个位置变量

${11}  脚本的第11个位置变量


#!/bin/bash

echo $#

echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}


变量的生命周期

在脚本里定义的变量,只在脚本执行过程中有效



变量的作用范围:默认情况下只在当前shell里可以使用,

要想定义的变量在所有的shell里被使用,要把变量定义为全局变量,

格式

1.

export 变量名=值 


2.

变量名=值

export 变量名


变量被定义为全局变量后,这个变量可以在当前shell和当前shell的

子shell使用


字符终端下,用户每打开一个新终端时加载的文件

系统级配置文件(对登陆系统的所有用户都有效)

1./etc/profile

2./etc/bashrc

/etc/profile.d/


用户级配置文件(只针对对应的用户有效)

3.~/.bashrc

4.~/.bash_profile


图形运行级别下,用户每打开一个新终端时加载的文件

1、/etc/bashrc

2、~/.bashrc


source /etc/bashrc //马上生效




编写shell脚本

vim test.sh

#!/bin/bash    //指定脚本的执行环境,默认是/bin/bash,可以省略,一般不省略

#注释信息不会在执行脚本时显示出来,是程序员给自已看的

脚本的功能体


编写脚本的思路:

1、明确脚本要实现的功能

2、哪些数据是变化的,把变化的数据用变量来表示

3、使用哪种流程控制

4、使用哪些系统命令


运行脚本 

1.sh xxx.sh 或 bash xxx.sh

2.加x权限 ./xxx.sh  或 路径/xxx.sh

3.source xxx.sh  或  . xxx.sh


'' 禁止引用其他变量值,$视为普通字符       //不可以引用$变量,当做普通字符看待

                                 

"" 允许通过$符号引用其他变量值   //可以引用$变量

`` 将命令执行的结果输出给变量   //保持命令的功效,输出给变量


命令 | awk '{print }'

head -1 /etc/passwd | awk -F":" '{print $1}'

free -m | grep Mem | awk '{print $3}'


read 接收用户从健盘输入的数据


read 选项 变量名

-p “输出的提示信息”

-t n 等待用户输入的超时时间


接收用户从健盘输入的数据可用read 或 $#(位置参数)


例:用位置参数接收数据

#!/bin/bash

#read -p "请输入要检测的ip地址:"  ipaddr


[  $# -eq 0 ] && exit


# [ -z $ipaddr ] && exit


echo $1

ping -c 3 $1 &> /dev/null && echo $1 is online" || echo "$1 not online"


例2:用read接收数据

#!/bin/bash

read class

read -p "请输入你的名字" -t 30 name

read -p "请输入你的年龄" -t 30 age

echo $class $name $age