Shell脚本编程
关于脚本的调试
bash -n /path/to/some_script
检测脚本中的语法错误
v bash -x /path/to/some_script
调试执行
变量
变量:命名的内存空间
数据存储方式:
字符:
数值:整型,浮点型 v
变量:变量类型
作用:
1、数据存储格式
2、参与的运算
3、表示的数据范围
类型: 字符 数值:整型、浮点型
bash中变量的种类
根据变量的生效范围等标准:
本地变量:生效范围为当前shell进程;对当前shell之外 的其它shell进程,包括当前shell的子shell进程均无效
本地变量
v 变量赋值:name=‘value’, v
可以使用引用value:
(1) 可以是直接字串; name=“root"
(2) 变量引用:name="$USER"
(3) 命令引用:name=`COMMAND`, name=$(COMMAND) v
变量引用:${name}, $name
"":弱引用,其中的变量引用会被替换为变量值
'':强引用,其中的变量引用不会被替换为变量值,而保
持原字符串 v
显示已定义的所有变量:set v
删除变量:unset name
环境变量:生效范围为当前shell进程及其子进程
环境变量
v 变量声明、赋值:
export name=VALUE
declare -x name=VALUE v
变量引用:$name, ${name} v
显示所有环境变量:
export
env
printenv v
删除:unset name v
bash有许多内建的环境变量:PATH, SHELL, USRE,UID, HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1
局部变量:生效范围为当前shell进程中某代码片断(通常 指函数)
位置变量:$1, $2, …来表示,用于让脚本在脚本代码 中调用通过命令行传递给它的参数
$1, $2, …:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
特殊变量:$?, $0, $*, $@, $#
只读变量:
只能声时,但不能修改和删除
readonly name
declare -r name
示例:判断给出的文件的行数
linecount="$(wc -l $1| cut -d' ' -f1)"
echo "$1 has $linecount lines."
练习
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
8、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
9、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
原创文章,作者:xiaoqiang512,如若转载,请注明出处:http://www.178linux.com/35778