位置变量&特殊变量总结

位置变量

  • 常用的位置变量有 $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

相关推荐

  • 新的征程即将开始……

    新的征程,新的开始,开博祭旗篇!!!

    Linux干货 2016-12-26
  • 源码编译安装之apache

    工具: Development tools组包 httpd-2.2.9.tar.gz links网站浏览工具   安装apache之前需要安装编译需要的环境“Development tools”这个是编译使用的必须的环境包,使用下面的命令可以安装。 [root@CentOS6 ~]# yum groupinstall&…

    Linux干货 2016-08-24
  • yum用法第二篇-自定义创建yum仓库

    一、前言      上次写了yum命令的介绍及常见使用说明,这次打算继续整理下如何自定义创建yum仓库,这在企业中也是非常常见的设置方式,有些公司为了服务器安全是不允许连接外网的,自定义创建yum仓库正好可以实现局域网单独安装管理程序包这种需求。 二、用法说明      1.使用…

    Linux干货 2015-09-22
  • Nginx 负载均衡多个nmmp主机

    设计拓扑图 一、Memcache简介 cache(缓存系统) 高性能分布式缓存服务器,缓存所有的“可流式化”数据:livejournal旗下Danga Interacive公司 程序=指令+数据 指令:程序 数据:IO操作 文件系统: 特征:协议简单  基于libevent的事件处理  内置内存存储方式  memcached 不…

    2014-09-17
  • 如何正确安装一个源码包

        下周就要考试了,心情挺忐忑不安的,前几天做了25期的考试题,感觉每个题都是老师上课讲过的,但是自己做却想不起来了。这应该就像学习数学一样,需要大量练习,做的多了自然就会了。     这周我们学习了如何使用yum,还学习了磁盘管理。针对如何安装源码包,以httpd包为例我们…

    2017-08-19
  • 第八周

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥(Bridge)是早期的两端口二层网络设备,用来连接不同网段。网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。网桥比集线器(Hub)性能更好,集线器上各端口都是共享同一条背板总线的。后来,网桥被具有更多端口、同时也可隔离冲突域的交换机(Switch…

    Linux干货 2016-09-19

评论列表(1条)

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

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