bash编程: 位置变量

$1, $2, $3, $4, ...

写一个脚本:计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数;

#!/bin/bash

#

EvenSum=0

OddSum=0

for I in `seq 1 $1`;do

if [ $[$I%2] -eq 1 ]; then

OddSum=$[$OddSum+$I]

else

EvenSum=$[$EvenSum+$I]

fi

done

echo "EvenSum: $EvenSum."

echo "OddSUm: $OddSum."

echo "Sum: $[$EvenSum+$OddSum]"

shift [n]:实现位置参数轮替;

例子:通过参数传递n个正整数给脚本,求其和;

#!/bin/bash

#

Sum=0

for I in `seq 1 $#`; do

Sum=$[$Sum+$1]

shift

done

echo $Sum

练习,写一个脚本,完成以下要求:

1、添加10个用户user1, user2, ..., user10;但要先判断用户是否存在,不存在而后再添加;

2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;

3、最后显示当前系统上共有多少个用户;

#!/bin/bash

#

Count=0

for I in {1..10}; do

if id user$I &> /dev/null; then

echo "user$I exists."

else

useradd user$I

echo "Add user$I successfully."

Count=$[$Count+1]

fi

done

echo "Add $Count new users."

echo "Total users: `wc -l /etc/passwd | cut -d' ' -f1`."

bash字符测试:

>: 大于

<: 小于

==: 等于

=~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];

[[ $opt1 =~ $opt2 ]]

一般做行首、行尾锚定;不要加引号;

单目:

-z $STRING: 为空则为真,不空则为假;

-n $STRING: 为空则为假,不空则真;

例子:写一个脚本,判定用户的shell是否为bash;

[ "$Shell" == "/bin/bash" ]

#!/bin/bashs

hell=`grep "^$1:" /etc/passwd | cut -d: -f7`

if [ "$Shell" == "/bin/bash" ]; then

echo "Bash User."

Ret=0

else

echo "Not Bash User."

Ret=9

fi

exit $Ret

改进版:

#!/bin/bash

#

Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`

if [ -z $Shell ]; then

echo "No such user or User's shell is null."

exit 10

fi

if [ "$Shell" == "/bin/bash" ]; then

echo "Bash User."

Ret=0

else

echo "Not Bash User."

Ret=9

fi

exit $Ret

例子:根据用户shell的结束符是否为sh来判定其是否为登录用户:

#!/bin/bash

#

Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`

if [ -z $Shell ]; then

echo "No shell."

exit 3

fi

if [[ "$Shell" =~ sh$ ]]; then

echo "Login User."

Ret=0

else

echo "None Login User."

Ret=4

fi

exit $Ret

写一个脚本:

判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。

如果其生产商为GenuineIntel,就显示其为Intel公司;

否则,就显示其为AMD公司;

#!/bin/bash

#

Vendor=`grep "vendor_id" /proc/cpuinfo  | uniq | cut -d: -f2`

if [[ "$Vendor" =~ [[:space:]]*GenuineIntel$ ]]; then

echo "Intel"

else

echo "AMD"

fi

练习:写一个脚本

通过参数传递一个字符串给脚本,如果传递的字符串为“memory”或“Memory”,就以MB为单位显示当前主机的内存信息;

否则,就显示/proc/uptime文件的内容。

#!/bin/bash

#

if [[ $1 =~ [Mm]emory$ ]]; then

free -m

else

cat /proc/uptime

fi

bash文件测试:

操作符 文件路径

-f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;

-d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;

-e: 测试文件是否存在;存在为真,否则为假;

-r: 测试文件对当前用户来说是否可读;

-w: 测试文件对当前用户来说是否可写;

-x: 测试文件对当前用户来说是否可执行;

-s: 测试文件大小是否不空,不空则真,空则假;

例子:给定一个路径,判断

如果为普通文件,显示之;

如果为目录,显示之;

否则,说无法识别;

#!/bin/bash

#

if [ ! -e $1 ]; then

echo "No such file."

exit 7

fi

if [ -f $1 ]; then

echo "Common file."

elif [ -d $1 ]; then

echo "Directory."

else

echo "Unknown file."

fi

bash的特殊参数:$0: 脚本名称;

/tmp/script.sh

basename $0

写一个脚本:可以接受一个参数,其使用形式如下:

script.sh {start|stop|restart|status}

如果参数为start,创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;

如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;

如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示“Restarting script successfully.”;

如果参数为status,那么:

如果/var/lock/subsys/script文件存在,则显示为“script is running.”

否则,则显示为“script is stopped.”

其它任何参数:则显示“script.sh {start|stop|restart|status}”

进一步:修改start的机制为:

如果参数为start,且/var/lock/subsys/script文件不存在,则创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;

否则,显示“script is already running.”

进一步:修改stop的机制为:

如果参数为stop,且/var/lock/subsys/script文件存在,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;

否则,显示“script is stopped yet.”

#!/bin/bash
if [[ $# -eq 1 ]];then
  if [[ $1 == start ]];then
     if [ ! -e $dir/script ];then
     echo >> $dir/script
     echo "Starting script successfully."
     else
     echo "script is already running."
     fi
  elif [[ $1 == stop ]];then
     if [ -e $dir/script ];then
     rm $dir/script
     echo "Stop script finished."
     else
     echo "script is stopped yet."
     fi
   elif [[ $1 == restart ]];then 
     if [ -e $dir/script ];then
     rm $dir/script
     echo >> $dir/script
     echo "Restarting script successfully."
     else
     echo >> $dir/script
     echo "Restarting script successfully." 
     fi
    elif [[ $1 == status ]];then
      if [ -e $dir/script ];then
        echo "script is running."
      else
      echo "script is stopped."
      fi
  else
    echo "script.sh {start|stop|restart|statu}"
   fi   
else 
    echo "script.sh {start|stop|restart|status}"
fi

练习:写一个脚本

给定一个文件:

如果是一个普通文件,就显示之;

如果是一个目录,亦显示之;

否则,此为无法识别之文件;

#!/bin/bash

if [ -f $1 ];then

echo "$1"

elif [ -d $1 ];then

echo "$1"

else

echo "unknown file."

fi

练习:写一脚本

能接受一个参数(文件路径)

判定:此参数如果是一个存在的文件,就显示“OK.”;否则就显示"No such file."

#!/bin/bash

if [ -e $1 ];then

echo "OK."

else

echo "No such file."

fi

练习:写一个脚本,完成以下任务

1、使用一个变量保存一个用户名;

2、删除此变量中的用户,且一并删除其家目录;

3、显示“用户删除完成”类的信息;

#!/bin/bash

USER=$1

if grep "\<$USER\>" /etc/passwd &> /dev/null;then

userdel -r $USER

echo "$USER is removed successfully."

else

echo "$USER not exist."

fi

写一个脚本:

1、添加10个用户user1到user10,密码同用户名;但要求只有用户不存在的情况下才能添加;

#!/bin/bash

for I in `seq 1 10`;do

if grep "\<user$I\>" /etc/passwd &> /dev/null;then

echo "user$I exist."

else

useradd user$I

echo "user$I" | passwd --stdin user$I

fi

done

2、删除添加的用户。

#!/bin/bash

for I in `seq 1 10`;do

if grep "\<user$I\>" /etc/passwd &> /dev/null;then

userdel -r user$I

echo "user$I has been removed."

else

echo "user$I not exist."

fi

done

bash知识点:组合条件测试

-a: 与

-o: 或

!: 非,单目操作符

A=3

UID>=1, UID<=499

bash测试:

bash命令

[]

[[]]

test

bash命令组合测试:

&&: 与

||: 或

!: 非

写一脚本,给定用户,如果其不存在,就退出脚本。

if ! id $1 &> /dev/null; then

echo "No such user."

exit 6

fi

if [ `id -u $1` -eq `id -g $1` ]; then

echo "Good Guy"

else

echo "Bad Guy"

fi

短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;

与运算:

真 && 真 =  真

真 && 假 =  假

假 && {真|假} = 假

或运算:

假 || 0 = 0

假 || 1 = 1

真 || 0或1 = 1

[ -e /tmp/test10 ] || mkdir /tmp/test10

id $UserName &> /dev/null || useradd $UserName

! id $UserName &> /dev/null && useradd $UserName || echo "$UserName exists."

id $UserName &> /dev/null && echo "$UserName exists." || useradd $UserName

转载于:https://blog.51cto.com/qiufengsong/1252890

bash脚本之for语句if语句以及各种测试语句(2)相关推荐

  1. 条件测试 linux,linux系统中条件测试语句

    linux系统中条件测试语句 linux系统中条件测试语句分为4类: 1.文件测试语句 2.逻辑测试语句 3.整数值比较语句 4.字符串比较语句 一.文件测试语句 -e :是否存在 -f :是否为文件 ...

  2. bash脚本之case语句应用,while、until和select循环应用及其示例

    bash脚本编程: case选择分支结构: case: case 词 in [模式 [| 模式]...) 命令 ;;]... esac 在脚本中使用case的结构: case ${VAR_NAME} ...

  3. linux脚本编程if[-z],Linux基础之bash脚本编程进阶篇-选择执行语句(if,case)

    bash脚本的书写规范简介 看本文需要了解的脚本撰写习惯:bash 开头顶格写#!紧接着写解释器路径/bin/bash 由于bash属于脚本语言,脚本语言的运行方式 解释运行:源代码 --> 运 ...

  4. Bash脚本之if-then语句

    本博客已迁往http://coredumper.cn if-then语句格式如下: if 命令; then命令块 fi 注意: 如果命令的退出状态码是0,则执行命令块,否则跳过命令块. 每条命令执行结 ...

  5. Shell 脚本知识回顾 (四) —— Shell 命令及Shell 相关语句

    一.Shell echo命令 echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.命令格式: echo arg 您可以使用echo实现更复杂的输出格式控制. 显示转义字符 echo & ...

  6. bash脚本编程之for循环

    bash脚本编程: shell: 交互式接口:编程环境:能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程:默认字符型: 条件测试:$? 命令的状态结果 真( 0 ...

  7. [分享]写出健壮的Bash脚本

    许多人用shell脚本完成一些简单任务,而且变成了他们生命的一部分.不幸的是,shell脚本在运行异常时会受到非常大的影响.在写脚本时将这类问题最小化是十分必要的.本文中我将介绍一些让Bash脚本变得 ...

  8. 如何在bash脚本中提示用户进行确认? [重复]

    本文翻译自:How do I prompt a user for confirmation in bash script? [duplicate] This question already has ...

  9. 从脚本本身获取Bash脚本的源目录

    如何获取其中的目录路径的Bash脚本所在,该脚本里面 ? 例如,假设我要使用Bash脚本作为另一个应用程序的启动器. 我想将工作目录更改为Bash脚本所在的目录,以便可以对该目录中的文件进行操作,如下 ...

  10. lftp压缩对方服务器文件,lftp 贴心好友 备份服务器bash脚本

    lftp 贴心好友 备份服务器bash脚本 利用了 bash 和 lftp 的自动登录功能 lftp 支持 ftp ssh 等多种登录协议 复制代码 代码如下: #!/bin/bash echo &q ...

最新文章

  1. 使用Zabbix通过BMC管理口监控HP服务器
  2. php doss_php下ddos攻击与防范代码
  3. 大厂首发:java转算法工程师
  4. Android调试工具之ADB
  5. springboot使用webjars引入jquery
  6. 两个有序链表序列的合并(c语言实现)
  7. koa --- 使用Github OAuth登录
  8. shell @ Linux (1)
  9. JadClipse反编译工具在MyEclipse中的安装(先看Eclipse的配置方式)
  10. linux使用oracal11g详细过程,很给力的linux下Oracle11g的安装过程及图解.doc
  11. CCF201604-4 游戏(100分)
  12. android 盒子远程调试,家+TV机顶盒怎么开启ADB/USB远程调试模式,安装软件?
  13. 《Java开发实战经典》习题第3章第12题:使用for循环打印下面的图形(用for循环打印金字塔)
  14. python手机连点器代码_【触动精灵】手机万能连点器 Lua 源码
  15. [LeetCode] 707.设计链表
  16. Bought a new glass in BeiJing Pan Jia Yuan
  17. Python使用Win32和天行机器人API实现微信自动聊天机器人(自动敷衍机器人)
  18. C# Winform 实现窗体无系统边框,但是具有系统边框的所有功能,同时保证控件不闪烁
  19. Vue全家桶之vue-router
  20. 高效并发unsafe-星耀

热门文章

  1. 推动大数据和AI应用场景的落地,加速实现与产业融合。
  2. 从自来水公司到社会工作者再做运维,我深耕 IT 一线的这 8 年
  3. 扎心!程序员旅行却只能紧紧抱着电脑加班?
  4. 编程能力差!90%输在这点上!谷歌AI专家:其实都是瞎努力!
  5. 知乎热帖:Qt 这么强大为什么火不起来?
  6. 关于webpack的使用
  7. core data 学习笔记
  8. python 3 最佳python中文书籍下载
  9. Sublime Text3 运行Python 出现Error:Decode error - output not utf-8
  10. 使用dispatch_group来进行线程同步