一.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