BESH 脚本的使用方法
本章的重点内容:
什么是脚本语言?如何写BASH 脚本?
脚本的控制格式有哪些?
shell脚本语言是:命令的堆积并提供流程控制
编程语言:分为编译型语言和脚本编程两种
编译型语言:
编辑-->编译-->连接-->运行运作于底层,所处理的是字节,整数,浮点数或其他机器层级的对象
很难进行“将一个目录里所有的文件复制到另一个目录中”
脚本语言:以源程序的方式存在,执行前不需要编译,而是靠一个解释器解释执行
维护简便 但是执行效率差 解释器本身是一个一般的执行器
bash, 脚本语言解释器
perl 最为难懂的语言 一个语言学家写的
python: 完全面向对象的语言 语法很严格 非常简洁 要求缩进
ruby
php 前三种最为流行
变量: 分四种类型
1.本地变量: 对当前shell有效 对子shell无效
2.环境变量:不但对当前shell有效 对子shell也有效
声明的时候必须使用一个特殊的命令 --> 导出命令: export
export A = 3
A = 3
export A
例如、export USERNAME
echo $USERNAME
export: 显示当前系统正在运行环境变量 导出的环境变量
man bash 可以查看有多少种符号可用
export PS1= '\t \!\$'
export PS1= '[\u@\h \w]\$'
printenv 类似于export
env 在一个指定的环境下运行的命令
回车 显示当前的环境变量
3.特殊变量
$? 表示上一个命令是否执行成功
0 表示执行成功
e.g. ls
echo $?
4.位置变量
$1, $2, $3..通过命令行向脚本传递的参数
-------------------------------------------------------------
#!bin/bash
echo " the first param: $1 "
echo " the second param: $2 "
./c.sh 1 2
-------------------------------------------------------------
A=2
B=3
1.echo "$[$A+$B]" man exprxian
格式: $[]
2.echo "$(($A+$B))"
格式:$(())
./sum.sh
------------------------------------------------------------------
BASH 命令别名
重启系统都会失效 系统环境初始化
通过命令 没有保存在文件中
path 系统中内置了保存文件 启动时都读取了一遍
保存用户自定义文件中
用户的环境设置依靠好几个文件实现
为了保存用户环境设置 用好几个文件保存了
装完系统后全局有效 对每个用户都有效
局部有效配置文件
全局下配置文件位置:
/etc/profile,
/etc/profile.d*,
/etc/bashrc
局部 位置
~/.bash_profile,
~/.bashrc,
~/.bash_logout
profile 类:
1.设置环境变量
2.用于运行用户登录执行的一些命令 自己写的脚本可以放进去
bashrc 类:
1.用于设置别名
2.设置本地变量
alias:
unalias:
alias clear cls = clear
shell:分为两类
交互式登录式shell:身份打开输入命令
读取次序:
/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc -->/etc/bashrc
非登录式shell:自己写的脚本 开机就运行 系统自动执行
读取次序;
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*
声明的别名对所有用户有效
etc/bashrc
favorcolor
/etc/profile
用户变量立即有效
source /etc/profile
echo $FAVORCOLOR
永久有效声明变量
-----------------------------------------------------------
用户登录系统的时候,显示,HI,I Know you
------------------------------------------------------------
写一个脚本,完成以下功能:
1.传递两个整数给脚本,让脚本显示这两个数的和差积商
避免转义可以采用 \string
输入/输出重定向,管道
计算机在没指定路径是 所采取的是标准输入输出
标准输入:/dev/stdin,0 设备本身通道标示符 标注输入 对应的文件
< 重定向标示符
标准输出:/dev/stdout,1 MONITOR 默认显示器
>
错误输出:/dev/stddrr,2 MONITOR
2>
&> 合并错误和正确的输出输出流
---------------------------------------------------------------------
ls
ls > /tmp/ls.out
cat !$
---------------------------------------------------------------------
> 覆盖输出重定向
>> 追加输出重定向
echo "----------" >> etc/profile 只能是最后一行
set -C 禁止使用覆盖重定向功能
set +C 打开覆盖重定向功能
正确的输出到一个 错误的输出到另一个文件中
ls /var >> /tmp/var.out 2>> /tmp/var.err
管道功能: | 连接多个命令 第一个命令结果送达第二个命令
前一个命令的执行结果 传递到第二个命令
exp : echo "123" | passwd --stdin redhat
ls /etc | less less 分页查看
T 实现一份保存在文件中 另一份送达后面管道命令
ls /etc | tee
多个命令的输出都需要保存至同一个文件
command >> a.out
command >> a.out
如何定义输入输出自定义重定向
自定义输出重定向
0, 1,2
exec 3> /tmp/myout.out
然后把所有的定义在3中
exec 3> /tmp/myout.out 自定义文件 保存在自己定义的文件中
ls /var >&3
cat /tmp/myout.out
ls /etc
实现在一个重定向的文件中避免不停的打开关闭
撤销命令
exec 3>&-
3-9 都能用
输入重定向 写为<
&> /dev/null 数据黑洞 虚拟的软设备
-----------------------------------------------------------------
程序的执行流:
面向过程 shell BASH
顺序执行:
选择分支:
循环执行:
for I in list; do
statement1
statement2
done
for I in 1 2 3 4 ; do // `seq 1 10` ; {1..4}
useradd user$I
echo user$I | passwd --stdin user$I
done
`` 相当于 $
-----------------------------------------------------------------------------------------------------------
写一个脚本:
1.切换工作目录至/var
2.依次向/var 目录中的每个文件夹或子目录问好,形如:
(提示:<input type="image" src="for FILE in /var/*; 或 for FILE in"> `ls /var`;)
Hello,log
Hello,run
3.统计/var 目录下共有多少个文件,并显示出来
写一个脚本:
1,设定变量FILE 的值为/etc/passwd
2. 使用循环读取文件/etc/passwd 的第2,4,6,10,13.15行,并显示其内容;(提示:LINE=`head -2 /etc/passwd | tail -1`可以取得第二行)
3. 把这些行保存至/tmp/mypasswd 文件中
#!bin/bash
#
cd /var
let SUM=0
for I in `ls /var`; do
echo "Hello,$I."
SUM=$[$SUM+1]
done
echo "$SUM files."
#!bin/bash
#
FILE=' etc/passwd'
// exec 3>> /tmp/mypasswd
for I in 2 4 6 10 13 15; do
LINE=`head -2 /etc/passwd | tail -1`
echo $LINE
// echo $LINE>&3
echo $LINE >> /tmp/mypasswd
done
exec 3>&-
unset FILE LINE
// 追加输出 exec 的功能一定要用进去
--------------------------------------------------------------------------------------------------
文本处理工具
cut: 剪切上下文本中的数据
-c 以字符为主 执行剪下操作
-d 指定分隔符 // dilim 界定符
-f 指定取第几段
e.g. cut -d: -f6,7 // 取第6段 7段 :冒号分割符
-d"" // 分隔符为空格
取出来后可以赋值变量
----------------------------------------------------------------------------------------------------
写一个脚本: sumuser.sh
1.设定变量FILE中的值为/etc/passwd
2.依次向/etc/passwd中的每个用户问好, 行号统计 取得的每一行进行切割
形如: HELL,root
Hello,root,your UID is 0.
3.统计一共有多少个用户
-----------------------------------------------------------------------------
如何引用一个脚本的执行结果? 脚本编程中的重要思想
-----------------------------------------------------------------------------