Linux中Shell

Shell是什么

​ Shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,可以用Shell来启动、挂起、停止、编写一些程序。

Shell脚本的执行方式

脚本格式要求

  • 脚本以 #!/bin/bash 开头
  • 脚本需要有 执行权限

范例

#!/bin/bash
echo "hello world!"

执行方式

  • 方式一

    • 给 xx.sh 赋予 +x 的权限
    • 执行脚本
  • 方式二
    • sh xx.sh

Shell变量

  • 变量分为:系统变量和自定义变量。
  • 系统变量:【$HOME]、​$PWD 、$USER 等 : 区分大小写
  • 显示当前 shell 中所有变量 : set

定义

  • 定义变量:变量=值
  • 撤销变量:unset 变量
  • 申明静态变量:readonly 变量, 不能执行 unset

变量定义规则

  • 变量由 字母、数字、和下划线组成,不能以 数字开头。
  • 等号两侧不能有空格
  • 变量名称一般大写

使用 ``

A=`ls -la` :把执行结果 返回给变量 A
====================
A=$(ls -la)

设置环境变量

  • export 变量名=变量值:将shell变量输出为环境变量
  • export 配置文件:让修改后的配置文件生效
  • export $变量名:查询环境变量的值

位置参数变量

$n :$0 代表 命令本身;$1 -- $9 :第一个到第九个参数,10及以上的参数,用 ${10}

$* :代表命令行中的所有参数, 看成一个整体

$@ :代表命令行中的所有参数,会把每个参数区分开

$# :代表命令行中所有参数的个数

echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"
================
./position.sh 30 60
30 60
30 60
参数个数=2

预定义变量

​ Shell中已经定义好的变量,可以直接使用

$$:当前进程的PID

$!:后台运行的最后一个进程的PID

$?:最后一次执行的命令的返回状态。如果为0,表示上一个命令正确执行。

Shell运算符

  • $((运算符)) || $[运算符]

  • expr m + n : 运算符之间 有空格

  • expr m - n

  • 计算 (2+3)*4

#!/bin/bash
echo "hello"
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"
RESULT2=$[(2 + 3) * 4]
echo "result2=$RESULT2"
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"

Shell判断语句

[ condition ] :condition前后有空格

  • [ 1 ] :true
  • [] : false
  • [ condition ] && echo 123 || echo 234

常用判断条件

  • 数字的比较
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等
  • 按照文件权限判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
  • 按照文件类型判断
-f 文件存在并且是一个常规文件
-e 文件存在
-d 文件存在且是一个目录

Shell流程控制

If 语句

if [ condition ]
then XXX
elif [ condition ]
then xxx
fi

示例

if [ "ok" = "ok" ]
then echo "ok==ok"
fi if [ 23 -gt 22 ]
then echo "gt"
fi if [ -e /root/shell/aaa.txt ]
then echo "exist"
fi

case 语句

case $变量名 in
"值1")
echo "aaa";;
"值2")
echo "bbb";;
*)
echo "ccc";;
esac
#!/bin/bash
case $1 in
"1")
echo "aaa";;
"2")
echo "bbb";;
*)
echo "ccc";;
esac
------------------
./xx.sh 1

for 语句

for 变量 in 值1 值2 值3 ....
do
xxxx
done for ((初始值; 循环控制条件;变量变化))
do
xxxx
done

示例

for i in "$*"
do
echo "num is $i"
done
# 只会打印一次,所有参数当成一个
===================
for j in "$@"
do
echo "num is $J"
done
# 多个参数会打印多行
#!/bin/bash
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"

while

语句

while [ condition ]
do
xxxx
done
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM=$SUM"

Shell输入输出

read (选项)(参数):从控制台读取数据
-p:指定读取值时的提示符
-t:指定读值的等待时间【单位:秒】,超时不等待 参数:指定读取值的变量名
#!/bin/bash

read -p "input a number:" NUM1
echo "num1=$NUM1" read -t 5 -p "在5秒内,输入一个数num=" NUM2
echo "num=$NUM2"

Shell函数

系统函数

1)basename:返回完整路径最后 / 的部分,常用于获取文件名

basename [pathname] [suffix]

basename /home/aaa/test.txt => test.txt
basename /home/aaa/test.txt .txt => test

2)dirname:返回完整路径最后 / 的前面部分,常用于获取路径

dirname 文件绝对路径

diename /home/aaa/test.txt ==>/home/aaa

自定义函数

语法

[function] funcName[()]
{
action;
[return int;]
}

示例

function getSum() {
SUM=$[$n1 + $n2]
echo "sum=$SUM"
}
read -p "first num1=" n1
read -p "second num2=" n2 getSum $n1 $n2

案例

需求:

  • 每天凌晨 2 点 0分,备份数据库 testdb 到 /data/backup/db
  • 备份开始和结束给出提示信息
  • 备份好的文件要求以 备份时间为文件名,并打包 .tar.gz 格式:2019-02-23-09-02-01.tar.gz
  • 同时检查 是否有超过10天的备份文件,有就执行删除操作
# 数据库定时备份 脚本
BACKUP_PATH=/data/backup/db
DATETIME=$(date +%Y-%m-%d-%H-%M-%S)
# echo "date=$DATETIME" echo "========备份开始========="
echo "========备份路径=$BACKUP_PATH/$DATETIME.tar.gz===========" HOST=localhost
USER=root
PWD=root
DB=testdb # 如果路径不存在就新建
[ ! -d "$BACKUP_PATH/$DATETIME" ] && mkdir -p $BACKUP_PATH/$DATETIME # 执行备份命令
mysqldump -u$USER -p$PWD --host=$HOST $DB | gzip > $BACKUP_PATH/$DATETIME/$DATETIME.sql.gz cd $BACKUP_PATH
tar -zcvf $DATETIME.tar.gz $DATETIME # 删除临时文件
rm -rf $BACKUP_PATH/$DATETIME # 找10天前文件,并删除
find $BACKUP_PATH -mtime +10 -name "*.tar.gz" -exec rm -rf {} \; # 输出备份结束信息
echo "==========备份成功==========="
  • crontab -e
  • 0 2 * * * /xxx.sh

Linux中Shell的更多相关文章

  1. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  2. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释 linux中shell变量$#,$@,$0,$1,$2的含义解释:  变量说明:  $$  Shell本身的PID(ProcessID ...

  3. Linux中shell变量$0,$?等含义

    linux中shell变量$#,$@,$0,$1,$2的基本含义: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  4. 【转】linux中shell变量$#,$@,$0,$1,$2的含义解释

    原文网址:http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html linux中shell变量$#,$@,$0,$1,$2的含义解释: ...

  5. 【Shell】linux中shell变量$#,$@,$0,$1,$2的含义解释 && set 关键字使用

    linux中shell变量$#,$@,$0,$1,$2的含义解释   摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linu ...

  6. linux中shell变量$#,$@,$0,$1,$2的含义

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  7. linux中shell变量$#,$@,$0,$1,$2

    linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  8. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

  9. linux中shell变量$#,$@,$0,$1,$2的含义解释<转>

    linux中shell变量$#,$@,$,$,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命 ...

随机推荐

  1. 【10-2】复杂业务状态的处理(从状态者模式到FSM)

    一.概述 我们平常在开发业务模块时,经常会遇到比较复杂的状态转换.比如说用户可能有新注册.实名认证中.已实名认证.禁用等状态,支付可能有等待支付.支付中.已支付等状态.OA系统里的状态处理就更多了. ...

  2. ScheduledExecutorService的两种方法

    开发中,往往遇到另起线程执行其他代码的情况,用java定时任务接口ScheduledExecutorService来实现. ScheduledExecutorService是基于线程池设计的定时任务类 ...

  3. PHP定界符<<<eof 使用

    PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特 ...

  4. cf19E. Fairy(奇环 二分图染色)

    题意 题目链接 Sol 非常有思维含量的一道题,队爷的论文里介绍了一种\(N \sqrt{N}\)的暴力然鹅看不懂.. 看了一下clj的\(O(nlogn)\)的题解,又翻了翻题交记录,发现\(O(n ...

  5. 【jdk源码1】TreeMap源码学习

    这是看过的第一个jdk源码(从立下目标以来):TreeMap.说实话断断续续的看了有好几天了,我觉得我犯了一个错误,就像一开始说的那样,我打算完完全全看懂TreeMap关于红黑树的实现方式,后来我想了 ...

  6. redis学习历程

    redis只知道作用于缓存,其它一无所知,所以现在系统的 学习下,这样应用的时候可以考虑多面性和实用性 首先先了解一下redis的背景和概念 背景 Redis是一个开源的使用ANSI C语言编写.支持 ...

  7. 学习git踩坑之路

    第一次使用git: 1.使用CentOS Linux release 7.3.1611 (Core),内核版本3.10.0-514.el7.x86_64 2.安装git: root权限运行:yum   ...

  8. Windows Server查看和记录远程登录信息的方法

    前两天我的一台Windows Server 2012R2的服务器中了传说中的cryptowall病毒,所有数据文件都被加密,需要我支付1个比特币才能解码.幸好服务器上没什么重要的文件,还好我没钱,我选 ...

  9. Java语言的主要特点

    Java语言有很多的优点,可靠.安全.编译和解释型语言.分布式.多线程.完全面向对象.与平台无关性等等. 与平台无关性 Java语言最大的优势在于与平台无关性,也就是可以跨平台使用. 绝大多数的编程语 ...

  10. 安全之路 —— 利用SVCHost.exe系统服务实现后门自启动

    简介 在Windows系统中有一个系统服务控制器,叫做SVCHost.exe,它可以用来管理系统的多组服务.它与普通的服务控制不同的是它采用dll导出的ServiceMain主函数实现服务运行,详细原 ...