shell编程(二)

一、字符串比对

字符串必须使用双引号
-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引用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 变量 局部变量 环境变量-----export 一个用户的所有进程中都可以访问的变量 环境变量的命令一...
    雅称容阅读 230评论 0 0
  • 样例 注意:shell代码中linux命令中有交互命令的,以<<EOF开头,以EOF结尾。中间写交互命令,命令要顶...
    zhangxiaohao阅读 129评论 0 1
  • 目录 一、shell中的函数二、shell中的数组三、shell告警系统 一、shell中的函数 函数就是把一段代...
    XiaoMing丶阅读 291评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,233评论 0 4
  • 昨夜梦依稀,隔远去看你,话语藏心里,梦里泪沾衣。天明书欲寄,深深苦于思,暗处呼天地,大脚汉娶你。坐在那一起,却无交...
    废柴长短句阅读 155评论 1 6