位置变量
-
常用的位置变量有 $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
具体执行流程如下:
特殊变量
-
常用特殊变量有:$#,$*,$@,$?
-
$# 脚本参数的个数
-
$* 所有的脚本参数
-
$@ 所有脚本参数
-
$? 上一个命令(不是上一个脚本)执行结果,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
评论列表(1条)
总结的很好,通过实验验证了自己的想法,加深了自己对变量的理解。