位置变量&特殊变量总结

位置变量

  • 常用的位置变量有 $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)
上一篇 2016-08-15 09:22
下一篇 2016-08-15 09:24

相关推荐

  • N22-第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;   (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;   (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; 在扩展分区/dev/sda4下新建一个10G的分…

    Linux干货 2016-10-25
  • 马哥教育N22期第四周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 root@xuc-virtual-machine:/home/xuc# cp -r /etc/skel/ /home/tuser1 root@xuc-virtual-machine:/…

    Linux干货 2016-09-06
  • linux 网络管理

    1、ifconfig命令格式: ifconfig[interface] 查看IP ifconfig-a 查看全部网卡信息 ifconfigIFACE [up|down] 网卡开启关闭 ifconfigIFACE IP/netmask [up] ifconfigIFACE IP netmask NETMASK 命令立即生效,不能永久保存  &nbsp…

    Linux干货 2017-08-20
  • Linux进程查看及管理(2)

     Linux进程查看及管理的工具:pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup  vunt]] mstat命令: vmstat [options] [delay [co procs: r:…

    Linux干货 2015-09-28
  • 用户管理相关

    安全3A:     资源分配:       authentication:认证       authorization 授权       accouting|audition 审计 用户分为(centos7):   管理员:root 0 &…

    Linux干货 2017-02-25

评论列表(1条)

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

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