linux Shell 脚本基础

心已入冬 提交于 2020-01-13 17:14:15

#!/bin/bash

在Unix中,凡是被 #! 注释的,统统是指明加载器(解释器)的路径,也就是声明用哪个程序来运行本文件。
比如:
#!/bin/bash
#上面的意思是说,把下面的字符统统传递给/bin/bash
echo "Hello Boy!"
...
当然,还有很多。
#!/bin/lua
#!/bin/perl
#!/bin/python# 终止执行exit 2

 接收用户参数

#!/bin/bash

echo "当前脚本名称:$0"
echo "参数个数: $#"
echo "参数 list: $*"
echo "第一个参数 $1"
echo "=============="
ls
echo "=============="
echo "上次命令返回值:$?"

文件测试语句

-d   // 文件是否为目录

-e  // 文件是否存在

-f  // 文件是否为一般文件

-r  // 当前用户是否可读

-w  // 是否可写

-x  // 是否可执行

lyb@lyb-virtual-machine:~/work$ [ -f example.sh ]
lyb@lyb-virtual-machine:~/work$ echo $?
0

lyb@lyb-virtual-machine:~/work$ [ -f example2.sh ]
lyb@lyb-virtual-machine:~/work$ echo $?
1

lyb@lyb-virtual-machine:~/work$ [ -d example2.sh ]
lyb@lyb-virtual-machine:~/work$ echo $?
1

 *条件表达式两侧均应留空格

 

逻辑语句,与 c++ 含义一样

逻辑与 &&  // 前面的条件成立才会执行后面的

逻辑或 ||

逻辑非 !

lyb@lyb-virtual-machine:~/work$ [ -f example.sh ] && echo "文件存在"
文件存在

 

字符串比较运算符

=  // 是否相同

!=  // 是否不同

-z  // 是否为空

lyb@lyb-virtual-machine:~/work$ [ dfd = dfd ]
lyb@lyb-virtual-machine:~/work$ echo $?
0
lyb@lyb-virtual-machine:~/work$ [ dfd = dfdw ]
lyb@lyb-virtual-machine:~/work$ echo $?
1

 

 整数比较运算符

-eq  // ==

-ne       // !=

-gt       // >

-lt       // <

-le       // <=

-ge       // >=

=  // 特定条件下是赋值,如 numer=27,注意前后不能带空格

lyb@lyb-virtual-machine:~/work$ [ 10 -eq 9 ]
lyb@lyb-virtual-machine:~/work$ echo $?
1
lyb@lyb-virtual-machine:~/work$ number=27
lyb@lyb-virtual-machine:~/work$ echo $number 
27

 if 条件测试语句

#!/bin/bash
read -p "Enter your score(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
    echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
    echo "$GRADE is Pass"
else
    echo "$GRADE is Fail"
fi

 for 条件循环语句

#!/bin/bash
read -p "Enter the users password:" PASSWD

# users.txt 中存放用户名,每行一个
for UNAME in `cat users.txt`
do     # id uname // 查看用户信息,用户不存在时返回非0
        id $UNAME &> /dev/null
        if [ $? -eq 0 ]; then
               echo "Already exists"
               else
               useradd $UNAME &> /dev/null          # 设置用户密码
               echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
               if [ $? -eq 0 ]; then
                       echo "$UNAME create success"
               else
                       echo "$UNAME create failure"
               fi
        fi
done

 while 条件循环语句

#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品价格为0-999,猜猜看是多少?"
while true
do
        read -p "输入猜测的价格:" INT
        let TIMES++
        if [ $INT -eq $PRICE ]; then
                echo "回答正确,价格是: $PRICE"
                echo "总共猜测次数: $TIMES"
                exit 0
        elif [ $INT -gt $PRICE ]; then
                echo "太高了"
        else
                echo "太低了"
        fi
done

 case 条件测试语句

#!/bin/bash
read -p "请输入一个字符,按Enter确认:" KEY

case "$KEY" in
[a-z] | [A-Z])
        echo "您输入的是 字母"
        ;;
[0-9])
        echo "您输入的是 数字"
        ;;
*)
        echo "$KEY 不是单个字母或数字"
esac

 计划任务服务程序

一次性计划任务 at 命令

启动 atd 服务

at 23:00 poweroff  // 设置一次性计划任务 23::00 关机, Ctrl + d 退出并保存编写任务

at -l  // 查看未执行的一次性计划任务,每个任务有顺序号

atrm 1  // 删除顺序号为1的任务

[root@localhost ~]# at 23:03
at> reboot
at> <EOT>
job 6 at Sun Jan 12 23:03:00 2020
Can't open /var/run/atd.pid to signal atd. No atd running?

 

周期计划任务 crontab 命令

 crontab -e  // 创建、编辑计划任务,进入编辑器编写任务

任务格式(没有设置需要用 * 占位,时间段可以用‘,’或‘-’隔开,如 8,9,10 月,1-5 号等,可以用 / 表示执行任务的间隔时间,如 */2 表示每隔2分钟执行一次任务)

分 时 日 月 星期 命令

crontab -l  // 查看计划任务

crontab -r  // 删除计划任务

计划任务参数中,所有命令用绝对路径(whereis 命令可以查看命令路径)

 

 

------------------------------------------

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!