Shell基础编程

Shell编程:
编译器,解释器
编程语言:机器语言、汇编语言、高级语言
静态语言:编译型语言
强类型(变量),变量在使用前,必须事先声明,甚至还需要初始化;
事先转换可执行格式
C、C++、JAVA、C#
动态语言:解释型语言
弱类型,变量用时声明,甚至不区分类型;
边解释边执行
ASP、ASP.NET、PHP、Shell、python、perl
变量:内存空间,命名
内存:编址的存储空间
变量类型:事先确定数据的储存格式和长度
字符
数值
整型
浮点型
真、假
逻辑运算:与、或、非、异或
1:真
0:假
1&0=0
或:只要一个为真,结果就为真
非:!真=假、!假=真
异或:操作数相同为0,不同为1
变量赋值:VAR_NAME=VALUE
bash变量类型:
环境变量
作用域为当前shell进程及其子进程:
export VARNAME=VALUE
本地变量(局部变量)
本地变量:VARNAME=VALUE ;作用域当前bash进程
局部变量:local VARNAME=VALUE;作用域为当前代码段
位置变量
特殊变量
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;
NAME=Jerry(定义本地变量)
export NAME(将本地变量转换为环境变量)
echo $NAME(显示变量值)
bash(打开子shell)
echo $NAME(显示变量值)
若退出当前账号,重新登录,就不是当前shell了,所有echo $NAME就没有值了.
位置变量:
$1、$2、....
特殊变量:
$?:上一个命令执行状态返回值;
程序执行,可能有两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行,1、2、127系统预留;
Shell基础编程

输出重定向:
>:输出重定向,覆盖输出
<:输入重定向
ls /var > /tmp/var.out
>>:追加输出
2>:重定向错误输出
2>>:追加方式重定向错误输出
ls /varr 2> /tmp/var2.out

Shell基础编程

&>:重定向标准输出或错误输出至同一个文件
ls /var4 &> /tmp/var4.out
ls /var5 > /tmp/var5.out &> /tmp/var5.out
Shell基础编程

<:输入重定向
tr 'a-z' 'A-Z' < /etc/fstab
Shell基础编程

/dev/null:软件设备,bit bucket,数据黑洞
id student &> /dev/null
echo $?
Shell基础编程

撤销变量:
unset VARNAME
unset NAME

查看当前shell中变量:
set

查看当前shell中环境变量:
env
设置环境变量:
Shell基础编程

脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
shebang:魔数
#!/bin/bash(第一行格式必须这么写)
#:注释行,不执行

    练习:写一个脚本,完成以下任务
    1,添加5个用户:user1、....user5
    2,密码和用户名相同
    3,显示添加用户成功
    条件判断:
          如果用户不存在,添加用户,给密码并显示添加成功;
        否则
           显示如果已经存在,没有添加;
    bash中如何实现条件判断?
    条件测试类型:
                 整数测试
                             字符测试
                             文件测试
        条件测试的表达式:
            [ expression ]
                [[ expression ]]
                test expression
        整数比较:
               -eq:测试两个整数是否相等;相等,为真;不等,为假
                     如:A=3
                            B=6
                                    [ $A -eq $B ]

Shell基础编程

      -ne:测试两个整数是否不等;不等,为真;相等,为假;
                -gt:测试一个数是否大于另一个数;大于,为真,否则,为假;
                -lt:测试一个数是否小于另一个数;小于,为正,否则,为假;
                -ge:大于或等于
                -le:小于或等于
命令间的逻辑关系:
     逻辑与:&&
                  第一个条件为假时,第二个条件不用判断,最终结果已经有;
                            第一个条件为真时,第二个条件必须判断;
        逻辑或:||
                 id student &> /dev/null && echo "Hello,student."
                         id student2 &> /dev/null && echo "Hello,student2."
                         useradd student2
                         id student2 &> /dev/null && echo "Hello student2."
                         如果用户user6不存在,就添加用户user6
                         ! id user6 && useradd user6
                         id user6 || useradd user6
            写一个脚本:
              判断/etc/fstab,行数是否大于100,若大于100,显示这是一个大文件,否则显示这是一个小文件
                #!/bin/bash
                #
                LINES=`wc -l /etc/fstab`
                FINLINES=`$LINES | cut -d '  ' -f1`
                [ FINLINES -gt 100 ] && echo " This is a big file. " || echo "This is a small file."

Shell基础编程

    如果用户存在,就显示用户已存在;否则,就添加此用户
    id user1 && echo "user1 is exist." || useradd user1
    如果用户不存在,就添加;否则,显示其已经存在;
    ! id user1 && useradd user1 || echo "user1 is exist."

    如果用户不存在,添加并且给密码;否则,显示其已经存在;
    ! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 is exist."

    条件判断,控制结构;
    单分之if语句
    if 判断条件;then
        statement1
            statement2
            ...
    fi

    双分支if语句
    if 判断条件;then
       statement1
         statement2
         ...
    else
      statement3
        statement4
        ...
    fi

    判断一个用户是否是管理员,如果是管理员,显示Admin;否则,显示common user
    NAME=user1
    USERID=`id -u $NAME `
    if [ $USERID -eq 0 ];then
       echo "Admin."
    else
       echo "Common user."
    fi

        判断当前系统上是否有用户的默认shell为bash;如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
        #!/bin/bash
        #
        grep "\<bash$" /etc/passwd &> /dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ];then
           USERS=`grep "\<bash$" /etc/passwd | wc -l`
        echo "The shells of $USERS users is bash."
        else
           "No such users."
        fi   

Shell基础编程

    判断当前系统上是否有用户的默认shell为bash;如果有,就显示其中的一个用户名;否则,就显示没有这类用户;
    #!/bin/bash
    grep "\<bash$" /etc/passwd &> /dev/null
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
       AUSER=`grep "\<bash$" /etc/passwd | head -1 |cut -d: -f1`
         echo "$AUSER is one of such user."
    else
       echo "No such users."
    fi

Shell基础编程

给定一个文件,如/etc/inittab
判断这个文件中是否有空白行,如果有,则显示其空白行数;否则,显示没有空白行。
#!/bin/bash
konghang=grep "^$" /etc/inittab |wc -l
if [ $konghang -gt 0 ];then
echo "$konghang."
else
echo "No kongbaihang."
fi

Shell基础编程

给定一个文件,如/etc/inittab
判断这个文件中是否有空白行,如果有,则显示其空白行数;否则,显示没有空白行。
注:判断给定的文件是否存在,如果,不存在,显示没有此文件,然后退出。
#!//bin/bash
FILE=/etc/inittab
if [ ! -e $FILE ];then
echo "No such file."
exit 8
fi
if [ -e $FILE ];then
blank=grep "^$" $FILE | wc -l
echo "$blank"
else
echo "No blank"
fi

Shell基础编程

给定一个用户,判断其uid和gid是否一样,如果一样,显示good guy;否则,显示bad guy
#!/bin/bash
USERNAME=user1
USERID=id -u $USERNAME
GRPID=id -g $USERNAME
if [ $USERID -eq $GRPID ];then
echo "good guy"
else
echo "bad guy"
fi

Shell基础编程

给定一个用户,判断UID和GID是否相同,若相同,显示good guy;否则,显示bad guy
注:不可使用id 命令、还需判断用户是否存在,不存在直接退出。

#!/bin/bash
USERNAME=user1
if [ ! grep "^$USERNAME\>" /etc/passwd &> /dev/null ];then
   echo "No such user:$USERNAME"
     exit 1
fi

USERID=`grep "^USERNAME\>" /etc/passwd | cut -d: -f3`
GRPID=`grep "^USERNAME\>" /etc/passwd | cut -d: -f4`
if [ $USERID -eq $ GRPID ];then
   echo "good guy"
else
   echo "bad guy"
fi

Shell基础编程

给定一个用户,获取其密码警告期限;而后判断用户密码使用期限是否小于警告期限,如果小于,则显示waring;否则,显示OK
提示:最长使用期限减去已经使用的天数即为剩余使用期限
#!/bin/bash
USERNAME=user1
W=grep "$USERNAME" /etc/shadow | cut -d: -f6
L=grep "$USERNAME" /etc/shadow | cut -d: -f5
N=grep "$USERNAME" /etc/shadow | cut -d: -f3
T=$[$[date +%s]/86400]
SY=$[$L-$[$T-$N]]
if [ $SY - lt $W ];then
echo "waring"
else
echo "OK"
fi

Shell基础编程

shell中如何进行算术运算:
A=3
B=6
1、let 算术运算表达式
let C=$A+$B
2、$[算术运算表达式]
C=$[$A+$B]
3、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=expr $A + $B

测试方法:
[ expression ]
文件测试:
-e FILE:测试文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE:测试指定路径是否为目录
-r FILE:测试当前用户对指定文件是否有读取权限
-w FILE:测试当前用户对指定文件是否有可写权限
-x FILE:测试当前用户对指定文件是否有执行权限

        [ -e /etc/inittab ]
        echo $?
        0

多分之的if语句:
if 判断条件1;then
statement1
...
elif 判断条件2;then
statement2
...
elif 判断条件3;then
statement3
...
else
statemment4
...
fi

给定一个文件,如果是一个普通文件,就显示之;如果是一个目录,亦显示之;否则,此为无法识别之文件;

#!/bin/bash
FILE=/etc/rc.d/sysinit
if [ ! -e $FILE ];then
echo "No such file"
exit 5
fi
if [ -f $FILE ];then
echo "Common file"
elif [ -d $FILE ];then
echo "Directory file"
else
echo "Unknown"
fi

Shell基础编程

特殊变量:
$#:参数的个数
$*:参数列表
./filetest.sh /etc/fstab /etc/inittab
$1:/etc/fstab
$2:/etc/inittab

    能接受一个参数,判断此参数如果是一个已存在的文件,就显示ok;否则就显示no such file
    nano filetest2.sh
    #!/bin/bash
    echo $#
    echo $*
    if [ -e $1 ];then
      echo "OK"
    else
      echo "No such file"
 fi

Shell基础编程

如果没有接受文件,就提示该如何使用此命令。
#!/bin/bash
if [ $# -lt 1 ];then
   echo "Usage:./filetest3.sh ARG1 [ARG2 ...]"
     exit 7
fi
if [ -e $1 ];then
   echo "OK"
else
   echo "No such file"
if

Shell基础编程

给脚本传递两个参数(整数),显示此两者之和、之积。
#!/bin/bash
if [ $# -lt 2 ];then
echo "./CALS ARG1 ARG2"
exit 5
fi

echo "The sum is:$[$1+$2]"
echo "The prod is:$[$1*$2]"

Shell基础编程

sed,流编辑器
sed:模式空间
默认不编辑原文件,仅对模式空间中的数据做处理
sed [options] 'AddressCommand' file ...
-n:静默模式,不再默认显示模式空间中的内容
-i:直接修改原文件
-e script -e script:可以同时执行多个脚本
-f /PATH/TO/SED_SCRIPT
sed -f /path/to/scripts file
-r:表示使用扩展正则表达式
history | sed "s#[[:space:]]##g"
history | sed "s#[[:space:]]
##g" | cut -d' ' -f1

            Address:
            1、StartLine,EndLine
             比如1,100
             $:最后一行
             2、/RegExp/
              /^root/
            3、/Pattern1/,/Parten2/
              第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行
            4、LineNumber
               指定的行
            5、StartLine, +N
               从startline开始,向后的N行
        COMMAND:
          d:删除符合条件的行
            sed '1,2d' /etc/fstab
            sed '3,$d' /etc/fstab
            sed '1,+2d' /etc/fstab
            sed '/^\//d' /etc/fstab
            p:显示符合条件的行
            a\string:在指定的行后面追加新行,内容为string
            sed '/^L/a\# hello world' /etc/fstab
            sed '/^L/a\# hello world\n # hello,linux' /etc/fstab
            i\string:在指定的行前面添加新行,内容为string
            r file:将指定的文件的内容添加至符合条件的行处
            sed '2r /etc/issue' /etc/fstab将/etc/issue内容添加至/etc/fstab第二行后面
            sed '$r  /etc/issue' /etc/fstab将/etc/issue内容添加至/etc/fstab最后一行后面
            sed '1,2r /etc/issue' /etc/fstab将/etc/issue内容分别添加至/etc/fstab第一行和第二行后面
            w file:将地址指定的范围内的行另存至指定的文件中
            sed '/oot/w /tmp/oot.txt' /etc/fstab从/etc/fstab查找oot的行另存至/tmp/oot.txt
            s/pattern/string/修饰符:查找并替换,默认只替换每行中第一次被模式匹配到的字符串
            sed 's/oot/OOT' /etc/fstab
              修饰符:
                      g:全局替换
                            i:忽略字符大小写
            支持分组,后项引用\(\) \1 \2
               &:引用模式匹配整个串
            nano sed.txt
            hello,like
            hi,my love
            sed 's#l..e#&r' sed.txt
            sed 's#\(l..e\)#\1r#g' sed.txt
            sed 's#l\(..e\)#L\1#g' sed.txt
    练习:
        1,删除/etc/grub.conf 文件中行首的 空白符
         sed -r 's#^[[:space:]]+##g' /etc/grub.conf
        2,替换/etc/inittab文件中id:5:initdefault:一行中的数字3
        sed -r 's@\(id:\)[0-9]\(initdefault:\)@\13\2@g' /etc/inittab
        3,删除/etc/inittab文件中的空白行
        sed '/^$/d' /etc/inittab
        4,删除/etc/inittab文件中开头的#号
        sed '/^#/d' /etc/inittab
        sed -r 's@^#+@@g' /etc/inittab
        5,删除某文件中开头的#号及后面的空白字符,但要求#后面必须有空白字符
        sed -r 's@^#[[:space:]]+@@g' /etc/inittab
        6,删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
        sed -r 's@^[[:space:]]+#@@g' /etc/inittab

传递一个用户名的参数给脚本,判断此用户的用户名跟基本组的组名是否一致,并将结果显示出来
#!/bin/bash
if [ id -n -u $1 == id -n -g $1];then
   echo "The same"
else
   echo "Different"
fi

传递一个参数(单字符就行)给脚本,如参数q,Q,quit,就退出脚本,否则就显示用户的参数

#!/bin/bash
if [ $1 == 'q' ];then
echo "Quiting..."
elif [ $1 == 'Q' ];then
echo "Quiting..."
elif [ $1 == 'quit' ];then
echo "Quiting..."
else
echo $1
fi

字符测试:
==:测试是否相等,相等为真,不等为假
A=hello
B=hi
[ $A == $B ]
!=:测试是否不等,不等为真,等为假
-n string:测试指定字符串是否为空,空则真,不空则假
-s string:测试指定字符串是否不空,不空为真,空则假

for 循环
for 变量 in 列表;do
循环体
done

创建二十个用户user1-user20,初始密码都是123
#!/bin/bash
for i in {1..20};do
useradd $i
echo 123 | passwd --stdin $i
done

Shell基础编程

shell编程学习记录,暂且到这里,后续会针对shell脚本编程大量探索学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值