慕课网视频教程

shell范例
#!/bin/bash  #宣告脚本使用的shell: bash
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2015/07/16 VBird First release      #脚本基本信息:创建者/功能等等
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin     #设定环境变量
export PATH      #设置成全局变量
echo -e "Hello World! \a \n”    #输出 hello world
exit 0    #设定回传值 (备注:回传值得查看: 执行完毕之后在终端执行echo $?)

最好在自己主目录下面创建一个bin ,将编写好的脚本统一放在里面管理;

详细操作参见Django uwsgi nginx 应用部署中的【脚本化】部分

第一行#!/bin/bash在宣告这个script使用的shell名称: 因为我们使用的是bash ,所以,必须要以『#!/bin/bash』来宣告这个档案内的语法使用bash的语法!

  • script 的功能;
  • script 的版本资讯;
  • script 的作者与联络方式;
  • script 的版权宣告方式;
  • script 的History (历史纪录);
  • script 内较特殊的指令,使用『绝对路径』的方式来下达;
  • script 运作时需要的环境变数预先宣告与设定。

前置知识
控制字符作用说明

历史命令调用

!! 重复执行上一条命令 !字符串 重复执行最后一条已改字符串开头的命令

输出重定向

正确输出 覆盖 :命令>文件 正确输出 追加:命令»文件 错误命令 2> 文件 错误命令 2> 文件 正确输出和错误输出都覆盖到文件:命令&> 文件   命令&»文件 正确输出追加到文件1,错误输出追加到文件2:   命令»文件1 2»文件2

多命令顺序执行

多个命令无逻辑联系 命令1;命令2 逻辑与,当命令1正确执行,命令2才会执行;如果命令1执行不正确,则命令2不会执行 命令1&&命令2 逻辑或,当命令1执行不正确,命令2才会执行;如果命令1正确执行,则命令2不执行 命令1 || 命令2

补充其他符号: 应用系统命令 $( ) 转意符,将特殊符号失去特殊含义 \


条件判断
判断语句

判断文件是否存在及类型

  • -d 判断文件是否存在,并且是否是目录文件
  • -f 判断文件是否存在,并且是否是普通文件
  • -e 判断文件是否存在
[root@iZ94l43yka9Z ~]# [ -e /root/nohup.out ]
[root@iZ94l43yka9Z ~]# echo $?
0

判断文件是否存在,存在输出yes: [ -e /root/nohup.out ] && echo yes || echo no

判断文件权限

  • -r 判断文件是否存在,并且是否拥有读权限
  • -w 判断文件是否存在,并且是否拥有写权限
  • -x 判断文件是否存在,并且是否具有执行权限

两个文件比较

  • 文件1 -nt 文件2 判断文件1的修改时间是否比文件2新
  • 文件1 -ot 文件2 判断文件1的修改时间是否比文件2旧
  • 文件1 -ef 文件2 判断文件1和文件2是否是同一个文件
两个整数之间的比较
测试选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2 判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2 判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2 判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2 判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2 判断整数1是否小于等于整数2(小于等于为真)

温馨提示:

-eq:equal 等于
-ne:not equal 不等于
-gt:gleater than 大于
-lt:less then 小于
-ge:gleater or equal 大于等于
-le:less or equal 小于等于
字符串的判断
测试选项 作用
-z 字符串 判断字符串是否为空(为空为真)
-n 字符串 判断字符串是否为非空(非空为真)
字符串1==字符串2 判断字符串1和字符串2相等(相等为真)
字符串1!=字符串2 判断字符串1是否和字符串2不相等(不相等为真)
多重条件判断
测试选项 作用
判断1 -a 判断2 逻辑与
判断1 -o 判断2 逻辑或
! 判断 逻辑非
[root@iZ94l43yka9Z hesite]# aa=11
[root@iZ94l43yka9Z hesite]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
no
流程控制
单分支if语句
if [条件判断式]
    then
    程序
fi
双分支if语句
if [ -d "$dir" ]
    then
        echo "目录"
    else
        echo "不是目录"
fi
多分支if语句
if [条件判断式1]
    then
    当条件判断式1成立时,执行程序1
elif [条件判断式2]
    then
    当添加判断式2成立时,执行程序2
else
    当所有添加都不成立时,最后执行此程序
fi
多分支case语句
#!/bin/bash
read -t 30 -p "请输入1,2,3" select
case "$select" in
    "1")
        echo "one"
        ;;
    "2")
        echo "two"
        ;;
    "3")
        echo "three"
        ;;
    *)
        echo "其他"
        ;;
esac
for循环
#!/bin/bash
cd /root/shell/
ls *.sh > ls.log
for i in $( cat ls.log )
    do
        cat $i
    done
#!bin/bash
#从1加到100
s=0
for ((i=1;i<100;i=i+1))
    do
        s=$(($s+$i))
    done
echo "The sum of 1+2+3+...+100 is: $s"
#!/bin/bash
#批量添加用户
read -p "Input name of users:" -t 30 name
read -p "Input the number of users:" -t 30 num
read -p "Input password or users:" -t 30 pass
if [ -n "$name" -a -n "$num" -a -n "$pass" ]
    then
    y=$(echo $num | sed 's/[0-9]//g')
    if [ -z "$y" ]
        then
        for(( i=1;i<$num;i=i+1 ))
            do
                useradd $name$i &> /dev/null
                echo $pass | /usr/bin/passwd --stdin $name$i &> /dev/null
            done
    fi
fi
补充:
#!/bin/bash
#删除用户
users=$(cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f 1)
    for user in $users
        do
            echo $user
            userdel -r $user
        done
while
while [ 条件判断式 ]
        do
                程序
        done
#!/bin/bash
#从1加到100
i=1
s=0
while  [ $i -le 100 ]
   do
       s=$(( $s+$i ))
       i=$(( $i+1 ))
   done
echo $s
until
until [ 条件判断式 ]
        do
                程序
        done

while条件满足就循环,until 不满足才循环


以上就是shell编程的基本知识。