美文网首页
shell编程(二)

shell编程(二)

作者: Freestyle_0f85 | 来源:发表于2019-10-23 21:25 被阅读0次

一、字符串比对

字符串必须使用双引号
-n //nozero 字符串长度不为0时为真
-z //zero 字符串长度为0时为真

[root@web ~]# name=""
[root@web ~]# [ -z $name ]
[root@web ~]# echo $?
0
[root@web ~]# [ ! -z $name ]
[root@web ~]# echo $?
1
[root@web ~]# name="alex"
[root@web ~]# [ -z $name ]
[root@web ~]# echo $?
1
[root@web ~]# [ -n $name ]
[root@web ~]# echo $?
0

二、正则比对

正则比对必须用[[]]
~是匹配的意思

[root@web01 scripts]# [ "$USER" = "root" ]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ "$USER" =~ ^r ]]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ "$USER" =~ t$ ]]
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ ! "$USER" =~ t$ ]]
[root@web01 scripts]# echo $?
1

三、多整数比对

-a and 并且 正则比对里用&&
-o or 或者 正则比对里用||
案例一:批量创建用户 批量创建10个用户 oldboy1 oldboy2 oldboy3...oldboy10
要求密码统一设置为123456
1.输入用户的前缀 oldboy
判断如果为空 则退出
2.输入需要创建用户的个数 10
判断是否为整数

#!/bin/sh
read -p "please input prefix: " name
read -p "创建的个数: " num
for i in `seq $num`
do
  useradd $name$i >/dev/null 2>&1
  echo 123456|passwd --stdin $name$i &>/dev/null
  [ $? -eq 0 ] && echo "$name$i create is ok"
done

四、if判断

案例:输入两个数字,是否为整数,并判断大小

#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
if [ -z $num1 ]
then
echo "您输入的第一个数字为空"&& exit
elif [ -z $num2 ]
then
echo "您输入的第二个数字为空"&& exit
elif [[  "$num1" =~ ^[0-9]+$ && "$num2" =~ ^[0-9]+$ ]]
then
if [ $num1 -lt $num2 ]
then
echo "$num1<$num2"
elif [ $num1 -gt $num2 ]
then
echo "$num1>$num2"
else
echo "$num1=$num2"
fi
else
echo "您输入了错误的值!"&& exit
fi    

五、case流程语句

案例:批量删除用户

#!/bin/sh
read -p "请输入用户名前缀: " prefix
read -p "请输入要删除几个用户: " num
for i in `seq $num`
do
echo $prefix$i
done
read -p "你确定要删除以上用户吗?[y|yes|YES|n|N|no]" ready
for n in `seq $num`
do
name=$prefix$n
case $ready in
    y|yes|YES)
        id $name &>/dev/null
        if [ $? -eq 0 ];then
        userdel -r $name
         [ $? -eq 0 ] && echo "$name del is ok"
        else
        echo "id: $name: no such user"
        fi
        ;;
    n|N|no)
            echo "不删除我玩啥呢?" && exit
        ;;
         *)
        echo "USAGE $0 [y|yes|YES|n|N|no]"
esac
done

六、for循环

案例:使用for循环从1加到100

#!/bin/bash
#Author
for i in {1..100}
do
        sum=$[sum+i]
done
echo $sum
命令行
for i in `seq 100`;do sum=$[sum+i];done;echo $sum

七、while循环

案例:使用while循环从1加到100

#!/bin/bash
#Author
i=0
while [ $i -le 100 ]
do
        sum=$[sum+i]
        let i++
done
echo $sum

案例:统计行号
while read line line 变量名 按行读取文件的内容

#!/bin/bash
#Author
while read line
do
        let i++
done</etc/passwd
echo $i

八、流程控制语句 exit break continue

exit 退出整个脚本 不会继续执行
break 跳出本次循环 继续往下执行 跳出循环体
continue 结束当前此次的命令,继续下一次循环

#!/bin/sh
while true
do
    echo ok
    exit
    echo hehe
done
echo done......
#!/bin/sh
while true
do
    echo ok
    break 
    echo hehe
done
echo done......
#!/bin/sh
while true
do
    echo ok
    continue
    echo hehe
done
echo done......

九、函数

命令的集合 完成特定功能的代码块
模块化 复用
函数和变量类似 只有先定义才可以调用,如果只定义不调用 则不会执行

函数的定义和调用
三种方法

[root@web scripts]# cat fun.sh 
#!/bin/sh
test1(){
    echo "第一种函数定义方式"
}
function test2(){
    echo "第二种函数定义方式"
}
function test3 {
    echo "第三种函数定义方式"
}
test1
test2
test3

函数的传参 不能直接传参
1.在函数名后面跟参数
2.全局配置 在函数最上面设置变量
3.local 只在函数体内部生效

[root@web scripts]# cat fun.sh 
#!/bin/sh
fun(){
    if [ -f $1 ];then
     echo "$1 exists"
    else
    echo "$1 no exists"
    fi
}
fun $2 $3

#!/bin/sh
fun(){
num=20
for i in `seq 10`
do
    sum=$[num+i]
done
echo $sum
}
fun
    
#!/bin/sh
fun(){
num=20
for i in `seq $1`
do
    sum=$[num+i]
done
echo $sum
}
fun $3 $1 $2

函数返回值 return

[root@web scripts]# cat fun3.sh 
#!/bin/sh
fun(){
    if [ -f $1 ];then
    return 50
    else
    return 100
    fi  
}
fun $1
if [ $? -eq 50 ];then
    echo "ok"
else
    echo "error"
fi
函数内如果执行的上一条是函数名  则不会返回函数本身执行的返回值
[root@web scripts]# cat fun4.sh
    #!/bin/sh
    fun(){
       echo 50
       return 1
    }
    re=`fun`
    echo "函数的返回值是?: $?"
    echo "函数执行的结果是?: $re"
    [root@web scripts]# sh fun4.sh
    函数的返回值是?: 1
    函数执行的结果是?: 50

[root@web scripts]# cat fun4.sh
    #!/bin/sh
    fun(){
       echo 50
       return 1
    }
    re=`fun`
    name=oldboy
    echo "函数的返回值是?: $?"
    echo "函数执行的结果是?: $re"
    [root@web scripts]# sh fun4.sh
    函数的返回值是?: 0
    函数执行的结果是?: 50

坑:for循环可以区分空格
while循环按行读取
在shell中调用系统的/etc/init.d/functions,先执行这个文件,
在用action引用。

相关文章

  • shell 案例

    Shell编程一 Shell防范ARP攻击 Shell编程二 Shell防范DDos攻击 Shell编程三 ...

  • BigData~01:Shell

    Shell编程基础 内容大纲 一、Shell编程二、高级文本处理命令:sed、awk、cut三、crontab定时...

  • shell 第一天

    shell编程初识 1.1 shell编程初识 shell的定义 Shell 是命令解释器 Shell 也是...

  • Shell编程系列(三)-- 运算符

    前言 在上一篇文章Shell编程系列(二)-- Bash 变量中, 我们学习了Shell编程中的变量相关的知识。...

  • shell编程(二)

    变量 局部变量 环境变量-----export 一个用户的所有进程中都可以访问的变量 环境变量的命令一...

  • shell编程(二)

    一、字符串比对 字符串必须使用双引号-n //nozero 字符串长度不为0时为真-z //zero 字符串长度为...

  • shell编程(二)

    样例 注意:shell代码中linux命令中有交互命令的,以<<EOF开头,以EOF结尾。中间写交互命令,命令要顶...

  • shell编程二

    目录 一、shell中的函数二、shell中的数组三、shell告警系统 一、shell中的函数 函数就是把一段代...

  • 78.shell编程

    shell编程 Shell脚本,是一种为shell编写的脚本程序。 Shell编程跟JavaScript、Pyth...

  • 2019-01-25

    Linux系统Shell编程指南 前言 适合人群:有类似C编程基础的人 一、Shell编程介绍 Shell解释型语...

网友评论

      本文标题:shell编程(二)

      本文链接:https://www.haomeiwen.com/subject/ezklvctx.html