• 引号与不按套路出牌


    本文主要内容:

    • 说服自己在字符串比较时,都要加上双引号!避免意外的发生!

    • 在字符串比较时,如果用到扩展的正则表达式时,扩展正则表达式万万不要加引号!与其比较的变量必须要加上引号!此时不能用单中括号了,必须使用双中括号!!

    • 不按套路出牌的脚本示例

    在做字符串比较比较时,都要加上双引号!避免意外的发生!

    在开始之前,我们还得学习一下引号的使用,what?引号的使用不是再刚开始学脚本的时候就已经 学习了吗?对此,我之前对你说,太年轻,shell脚本的世界里引号的使用绝非那么简单!

    我们在前面讲过了条件测试时的格式,说了它对中括号情有独钟,但是对里面的引号问题还没有深入学习!我们下面就来学习一下,come on -------->!

    那么在条件测试判断里面什么时候该用双引号?什么时候不用加双引号呢?一言以蔽之:当其是字符串的时候当用双引号,当其是正则表达式千万不能用双引号!

    先说第一条:做字符串比较判断时当用引号把字符串引起来。

    -z是问变量内部是空的吗?是空的返回0,不是空的返回1

    -n是问变量内部不是空的吗?不是空的的返回0,是空的返回1

    [root@linuxprobe ~]# a=1
    [root@linuxprobe ~]# [ -z $a ];echo $?     #不是空的返回1
    1
    [root@linuxprobe ~]# a=
    [root@linuxprobe ~]# [ -z $a ];echo $?    #是空的返回0,在-z时用不用引号没什么影响!
    0
    [root@linuxprobe ~]# a=
    [root@linuxprobe ~]# [ -n $a ];echo $?  #what?这里问它不是空的吗?这里的a是空的,应该返回为1,但是却返回了0!     -n时就出了问题! 使用引号可解决这种不正常。
    0
    [root@linuxprobe ~]# a=1
    [root@linuxprobe ~]# [ -n $a ];echo $?  #
    0

    ######################我是加引号与不加引号的分隔线#########################

    [root@linuxprobe ~]# a=
    [root@linuxprobe ~]# [ -n "$a" ];echo $?       #看这就变正常了
    1
    [root@linuxprobe ~]# a=1
    [root@linuxprobe ~]# [ -n "$a" ];echo $?
    0

    结论:

    做字符串的判断时,在中括号内部都要加上引号,避免意外的发生,将意外扼杀在萌芽之中!

    在字符串比较时,如果用到扩展的正则表达式时,扩展正则表达式万万不要加引号!与其比较的变量必须要加上引号!此时不能用单中括号了,必须使用双中括号!!

    [root@linuxprobe ~]# a=1
    [root@linuxprobe ~]# [[ "$a" =~ ^[[:digit:]]+$ ]];echo $?
    0
    [root@linuxprobe ~]# [[ "$a" =~ ^[0-9]+$ ]];echo $?
    0
    [root@linuxprobe ~]# a=1b1
    [root@linuxprobe ~]# [[ "$a" =~ ^[[:digit:]]+$ ]];echo $?
    1
    [root@linuxprobe ~]# [[ "$a" =~ ^[0-9]+$ ]];echo $?
    1

    如果要使用扩展的正则表达式就必须得使用双中括号,而且还得使用专门的判断符号=~,在字符串比较里面是不支持标准的正则表达式的!一用就报错(我就是你,你还不相信吗?)

    数字用扩展的正则表达式如果表示?就是用^[[:digit:]]+$ ]或者^[0-9]+$ ]]都可以,此种方法可以用来判断是否变量是否为正整数,下面的脚本会上这种判断方法。

    不按套路出牌的脚本示例:

    下面我们来完善添加用户的那个脚本,上一个脚本把人相像的太简单了,对于不按套路出牌的用户怎么应对呢?

    原脚本:

    #!/bin/bash
    #author:zhanghe
    read -p "please input one username prefix:" PREFIX
    read -p "please input creat user number:" NUMBER
    for i in `seq $NUMBER`;do
    user=$PREFIX$i
    if ! id $user &>/dev/null;then
    useradd $user &>/dev/null
    echo 123 | passwd --stdin $user &>/dev/null
    chage -d 0 $user
    echo "$user 已经添加~,密码默认为123,已经强制用户第一次登录修改密码"
    else
    echo "$user已经存在,无需添加!"
    fi
    done

    修改后的脚本:

    [root@linuxprobe scripts]# vim useradd.sh
    #!/bin/bash
    #author:zhanghe
    read -p "please input one username prefix:" PREFIX
    if [ -z "$PREFIX" ];then
    echo "error PREFIX"
    exit 1
    fi
    read -p "please input creat user number:" NUMBER
    if [[ ! "$NUMBER" =~ ^[[:digit:]]+$ ]];then
    echo "error number! ,you must input signless integer"
    exit 2
    fi
    for i in `seq $NUMBER`;do
    user=$PREFIX$i
    if ! id $user &>/dev/null;then
    useradd $user &>/dev/null
    echo 123 | passwd --stdin $user &>/dev/null
    chage -d 0 $user
    echo "$user 已经添加~,密码默认为123,已经强制用户第一次登录修改密码"
    else
    echo "$user已经存在,无需添加!"
    fi
    done
  • 相关阅读:
    robotframework中文日志显示乱码
    flask学习
    RF元素定位的例子
    rf增加产品的例子
    Django如何重设Admin密码
    c++ ,类型转换
    new,delete和malloc,free以及allocator<T>
    疑问记录本
    c 字符串常用函数
    递归和栈溢出。
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/11039080.html
Copyright © 2020-2023  润新知