位置变量&特殊变量总结

位置变量

  • 常用的位置变量有 $1, $2, $3 ……,表示命令行传给脚本的第一个参数,第二个参数,第三个参数。。。

  • $0 表示脚本的文件名,比如a.sh

  • 位置变量在脚本中的主要作用,是让脚本通过他们来获取命令行传递给脚本的参数。

变量位置调整

shift [n] 
用于调整变量位置

第n+1个位置变量会被重新命名为$1,第$#个位置变量的变量名被重置为\${#-n+1}。n必须是非负数,且不能够大于\$# ,n默认为1,如果n大于\$#,位置变量不变。当n大于\$#时,返回状态会大于0(即命令执行错误),否则,当n小鱼\$#时,返回状态为0(即执行命令正确)

[root@centos7 bin]#cat testshift.sh #!/bin/bashfor i in 1 2 3 4 5doshift 1echo $1# 总是输出\$1这个变量sleep 4done

具体执行流程如下:

1471177592472046.jpg

特殊变量

  • 常用特殊变量有:$#,$*,$@,$?

  • $# 脚本参数的个数

  • $* 所有的脚本参数

  • $@ 所有脚本参数

  • $? 上一个命令(不是上一个脚本)执行结果,0表示正确(执行顺利完成),其他非0数字,代表错误码

 [root@centos7 bin]#cat testshift.sh 
 #!/bin/bash
 uname -r > /dev/null
 echo $?
 uame -r > /dev/null
 echo $? 
 
 [root@centos7 bin]#bash testshift.sh
  0
  testshift.sh: line 6: uame: command not found
  127
 #在脚本内,执行不同的命令,同样可以直接返回$?,所以是对命令执行结果的状态的返回。
[root@centos7 bin]#touch testshift.sh
[root@centos7 bin]#[ ! -f testshift.sh ]
[root@centos7 bin]#echo $?1
  • $$ 当前shell进程的pid

  • $! 后台运行的最后一个进程的pid

  • $– 显示shell使用的当前选项

  • $_ 之前命令的最后一个参数

$*与$@的区别

  • $*会将所有的参数,用‘’ 引起来,形成一个字符串

  • $@仍然是多个字符串

练习题:

1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。

[root@centos7 ~/bin#]cat systeminfo.sh 
#!/bin/bash
#
echo -e  "The following is systeminfo:\n"
echo "The hostname is `hostname`"
echo "The IP is `ifconfig |sed -n '2p' |sed -n -r 's@.*inet.(.*) net.*@\1@p'`"
echo "The OS version is `cat /etc/redhat-release`"
echo "The kernel version is `uname -r`"
echo "The CPU is `cat /proc/cpuinfo |grep 'model name' |sed -n '1p' |cut -d: -f2 |tr -d ' 'i`"
echo "The memory size is `cat /proc/meminfo |sed -n '1p' |cut -d: -f2 |tr -d ' '`"
echo "The disk size is `fdisk -l |sed -n '2p' |cut -d: -f2 |cut -d, -f1`"
[root@centos7 ~/bin#]

2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

[root@centos7 ~/bin#]cat baskup.sh 
#!/bin/bash
#
cp -r /etc/ /root/etc`date +%F`
[root@centos7 ~/bin#]

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

[root@centos7 ~/bin#]cat checkdisk.sh 
#!/bin/bash
#
NumDisk=`df |grep 'sd' |tr -s ' ' |cut -d' ' -f5 |cut -d% -f1`
[[ $NumDisk -gt 50 ]] && wall disk will be full!;exit

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

[root@centos7 ~/bin#]cat links.sh 
#!/bin/bash
#
echo -e "远程主机的IP地址及连接数:\n"netstat -nt | tr -s ' ' |cut -d' ' -f5 |tail -n +3 |cut -d: -f1 |sort |uniq -c

5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

[root@centos7 ~/bin#]cat sumid.sh 
#!/bin/bash
#
num1=`cat /etc/passwd |sed -n -e '10p' |cut -d: -f3`
num2=`cat /etc/passwd |sed -n -e '20p' |cut -d: -f3`
let var=$num1+$num2echo "第十个用户与第二十个用户的UID之和为:"echo $var

6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

[root@centos7 ~/bin#]cat sumspace.sh 
#!/bin/bash
#
fSpace1=`grep '^$' $1 |wc -l`
fSpace2=`grep '^$' $2 |wc -l`
sumSpace=$[ $fSpace1+$fSpace2 ]echo "两个文件的空白行之和为:$sumSpace"

7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

[root@centos7 ~/bin#]cat sumfile.sh 
#!/bin/bash 
#
#统计/etc, /var, /usr目录中共有多少个一级子目录和文件
Detc=`tree -L 1 /etc/ |wc -l`
Fetc=`ls -lR /etc/ |wc -l`

Dvar=`tree -L 1 /var/ |wc -l`
Fvar=`ls -lR /var/ |wc -l`

Dusr=`tree -L 1 /usr/ |wc -l`
Fusr=`ls -lR /usr/ |wc -l`
echo "/etc目录中共有一级子目录$Detc 个,文件 $Fetc 个"
echo "/var目录中共有一级子目录$Dvar 个,文件 $Fvar 个"
echo "/usr目录中共有一级子目录$Dusr 个,文件 $Fusr 个"

8、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

[root@centos7 ~/bin#]cat argsnum.sh 
#!/bin/bash
#
[[ $# -lt 1 ]] && echo "至少应该给一个参数"
[[ $# -ge 1 ]] && grep '^$' $1 |wc -l 
[root@centos7 ~/bin#]

9、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

[root@centos7 ~/bin#]cat hostping.sh 
#!/bin/bash
#
[[ $# -eq 1 ]] && (echo "$1" |grep -q -E '\<((([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\>' && (
ping -c1 -W1 $1 &> /dev/null && echo "该IP地址可访问!" || echo \ "该IP地址不可访问!" )) || echo "请给出一个合法IP地址!"; exit 2[root@centos7 ~/bin#]

10、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写

[root@centos7 ~/bin#]cat per.sh 
#!/bin/bash
[ ! -r $1 ] && [ ! -w $1 ] && echo "当前用户对$1 文件不可读且不可写!"

11、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。

[root@centos7 ~/bin#]cat nologin.sh 
#!/bin/bash
#
[ -e /etc/nologin ] && echo "已禁用普通用户登录系统" || touch /etc/nologin && echo "已禁用普通用户登录系统"
[root@centos7 ~/bin#]

[root@centos7 ~/bin#]cat login.sh 
#!/bin/bash
#
[ -e /etc/nologin ] && rm -f /etc/nologin && echo "已允许普通用户登录系统!"

12、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

#!/bin/bash
[[ $# != 1 ]] && ( echo "请输入一个IP地址 " ; exit 1) 
[[ $1 =~ [[:digit:]].[[:digit:]].[[:digit:]].[[:digit:]] ]] || ( echo "您输入的IP地址不合法" ; exit 1 )
ping -w 1 -c 1 $1 &> /dev/null && echo "IP地址$1可以访问" || echo "IP地址$1不可访问 "
exit 0

13、计算1+2+3+…+100的值

seq -s '+' 1 100| bc

14、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之

#!/bin/bas
#计算A和B及其之间数字的总和,如果A>B则退出
[[ $1 -ge $2 ]] && echo "第一个数字应小于第二个数字" && exit 
lvar=$1
hvar=$2
echo -n "the sumnum from $lvar to $hvar is : "
seq -s '+' $lvar $hvar | bc

原创文章,作者:m20-吴清玲,如若转载,请注明出处:http://www.178linux.com/35609

(0)
m20-吴清玲m20-吴清玲
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • CentOS Linux 系统计划任务简单介绍

    CentOS  Linux 系统计划任务简单介绍 §·linux 系统计划任务 ※·linux中Centos计划任务的程序为:cron 周期性任务计划:cron 相关的程序包: cronie: 主程序包,提供crond守护进程及相关辅助工具 cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任…

    Linux干货 2016-09-08
  • day6总结

    主要内容: useradd与usermod对比 groupadd与groupmod对比 passwd与chage对比 gpasswd与groupmems对比 切换用户 chown与chgrp用法 一般权限与特殊权限 chmod用法   useradd创建用户的初始信息存放在/etc/login.defs和/etc//default/useradd文…

    系统运维 2016-08-08
  • LAMP及部署wordpress/phpMyadmin

    LAMP详解 wordpress安装 一、引言 lamp含义:黄金组合。简要介绍一下下面这四个东西吧。linux,不用说了有很多发行版本,主流的三大版本是Debian系列,RedHat系列,slackware系列。apache,全称叫Apache HTTP Server,是世界使用排名第一的web服务器软件,httpd是超文本传输协议http服务器的主程序。…

    Linux干货 2016-12-13
  • 计算机;GPL等开源协议;Linux 哲学思想的炼成;MBR & GPT—fazion in magedu 20.July

    入门Linux的基础知识 fazionlan blog in 178Linux.July 22nd. 第一台计算机 1946第一台计算机ENIAC(electronic numerical integrator and calculator)在美国滨州大学诞生,是美国奥伯丁武器试验场为了满足计算弹道而研制的 冯诺依曼体系结构:1946年数学家提出运算器、控制…

    Linux干货 2016-07-29
  • Linux命令小总结

                     随着对Linux学习的深入,Linux命令也越来越多的。虽然我们可以通过man等帮助查询我 忘记的命令,但写脚本本质是由命令有序的堆砌而运行的。下面让我来总结一番我们学习过的命令 &nb…

    2017-07-30
  • 三问:linux操作系统安全加固

    三问:linux操作系统安全加固 1.为什么要进行安全加固?     安全加固的重要性不言而喻。我这里把操作系统同马斯洛需求层次做了个类比,如有不恰当之处,还请指教。同人一样,操作系统也有自己的生理需求,对于人来说生理需求无非吃喝拉撒等,而对于操作系统来说它的生理需求又是什么了?我个人认为应该是底层硬件的配置,内核的驱…

    Linux干货 2017-03-30

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-15 17:23

    总结的很好,通过实验验证了自己的想法,加深了自己对变量的理解。