shell脚本编程入门基础(附:自动备份与解包文件脚本)
来源:互联网 发布:淘宝代销能赚钱吗 编辑:程序博客网 时间:2024/06/01 19:51
【shell脚本基础】
shell脚本文件后缀名:.sh
建立脚本顶行:#! /bin/sh
// 指明使用哪种shell来解释缩写的脚本
shell脚本是以文本方式存储的,而非二进制文件,所以shell脚本必须在Linux系统的shell下解释执行,需要修改其执行权限:
#:' chmod +x filename.sh
不设置权限指定shell脚本:
#:' sh filename.sh
#:' source filename.sh
【变量】
shell系统变量:
'$#' // 保存程序命令行的数目
'$0' // 当前程序名
'$*' // 以("$1 $2...")的形式保存所有输入的命令行参数
'$@' // 以("$1" "$2"...)的形式保存所有输入的命令行参数
'$n' // $1 为命令行的第一个参数,$2为命令行的第二个参数,依次类推
shell环境变量:
PATH // 决定shell将到哪些目录中寻找命令或程序
HOME // 当前用户主目录的完全路径名
HISTSIZE // 历史命令记录数
LOGNAME // 当前用户的登录名
HOSTNAME // 主机的名称
SHELL // shell路径名
LANGUGE // 语言相关的环境变量,多语言可以修改此环境变量
MAIL // 当前用户的邮件存放目录
PWD // 当前工作目录的绝对路径名
环境变量命令:
echo $HOME // 显示变量
export WELCOME="HE" // 设置变量
env // 查看所有变量
set // 查看本地变量
unset // 删除变量
env | grep WELCOME // 查询变量
shell用户变量:
linux下支持用户自定义变量,使用' = '进行赋值,即 变量名=变量值
【变量扩展】
变量扩展符号:'$'
【字符串截断】
左截断 '#'(3)
例如:
变量扩展 '$'(4)
右截断 '%'(5)
例如:
【流程控制】
主要有两种不同形式的条件语句: if 和 case
shell中的 if 格式:
if [ expression ] # expression 两侧一定保证各有一个空格,否则无法找到命令
then
commands1 # expression为true时的动作
else
commands2 # expression为false时的动作
fi
<文件比较运算符>
<字符串比较运算符> '注意引号的使用,防止空格扰乱代码的好方法'
<算术比较运算符>
shell中的 case 格式:
case 字符串 in
模式1) command;;
模式2) command;;
...
*) command;;
esac
如果每个都匹配不到,则会在最后放置一个*,相当于c语言中的default
【循环语句】
shell中的 while 语句格式:
while [ expression ]
do
command
...
done
shell中的 for 语句格式:
for 变量名 [in 列表]
do
command1
command2
...
done
>> 实验1:自动备份源代码
>> 实验2:自动解包分类并统计文件
shell脚本文件后缀名:.sh
建立脚本顶行:#! /bin/sh
// 指明使用哪种shell来解释缩写的脚本
shell脚本是以文本方式存储的,而非二进制文件,所以shell脚本必须在Linux系统的shell下解释执行,需要修改其执行权限:
#:' chmod +x filename.sh
不设置权限指定shell脚本:
#:' sh filename.sh
#:' source filename.sh
【变量】
shell系统变量:
'$#' // 保存程序命令行的数目
'$0' // 当前程序名
'$*' // 以("$1 $2...")的形式保存所有输入的命令行参数
'$@' // 以("$1" "$2"...)的形式保存所有输入的命令行参数
'$n' // $1 为命令行的第一个参数,$2为命令行的第二个参数,依次类推
shell环境变量:
PATH // 决定shell将到哪些目录中寻找命令或程序
HOME // 当前用户主目录的完全路径名
HISTSIZE // 历史命令记录数
LOGNAME // 当前用户的登录名
HOSTNAME // 主机的名称
SHELL // shell路径名
LANGUGE // 语言相关的环境变量,多语言可以修改此环境变量
MAIL // 当前用户的邮件存放目录
PWD // 当前工作目录的绝对路径名
环境变量命令:
echo $HOME // 显示变量
export WELCOME="HE" // 设置变量
env // 查看所有变量
set // 查看本地变量
unset // 删除变量
env | grep WELCOME // 查询变量
shell用户变量:
linux下支持用户自定义变量,使用' = '进行赋值,即 变量名=变量值
/* 代码演示 */#! /bin/shVAR="hello"echo $VAR // hello【正确引用变量值】echo "VAR" // hello【正确引用变量值】echo VAR // VARecho 'VAR' // $VARecho \$VAR // $VAR
【变量扩展】
变量扩展符号:'$'
例如:echo hey$VAR // heyhelloecho hey$VAR123 // hey【错误,无法正确使用变量扩展】修改:echo hey${VAR}123 // heyhello123 【正确实现变量扩展】{} 表示清晰的告诉bash引用的是哪一个变量。
【字符串截断】
左截断 '#'(3)
例如:
$ MYVAR=foodforthought.jpg$ echo ${MYVAR##*fo}rthought.jpg // 双#加上*fo是从左侧截断到最后一个fo最长的子字符串,输出剩余字符$ echo ${MYVAR#*fo}odforthought.jpg // 单#加上*fo是从左侧截断到最短的一个fo的子字符串,输出剩余字符
变量扩展 '$'(4)
右截断 '%'(5)
例如:
$ MYFOO="chickensoup.tar.gz"$ echo ${MYFOO%%.*}chickensoup // 双%加上.*是从右侧截断到最长的子字符串,输出剩余字符$ echo ${MYFOO%.*}chickensoup.tar // 单%加上.*是从右侧截断到最短的子字符串,输出剩余字符
【流程控制】
主要有两种不同形式的条件语句: if 和 case
shell中的 if 格式:
if [ expression ] # expression 两侧一定保证各有一个空格,否则无法找到命令
then
commands1 # expression为true时的动作
else
commands2 # expression为false时的动作
fi
<文件比较运算符>
-e filename // 如果filename存在,则为真 [ -e /var/log/syslog ]-d filename // 如果filename为目录,则为真 [ -d /tmp/mydir ]-f filename // 如果filename为常规文件,则为真 [ -f /usr/bin/grep ]-L filename // 如果filename为符号链接,则为真 [ -L /usr/bin/grep ]-w filename // 如果filename可写,则为真 [ -w /var/mytmp.txt ]-x filename // 如果filename可执行,则为真 [ -x /usr/bin/grep ]filename1 -nt filename2 // 如果filename1比filename2新,则为真 [ /tmp/server -nt /etc/server ]filename1 -ot filename2 // 如果filename1比filename2旧,则为真 [ /tmp/server -ot /etc/server ]
<字符串比较运算符> '注意引号的使用,防止空格扰乱代码的好方法'
-z string // 如果string长度为0,则为真 [ -z "$myvar" ]-n string // 如果string长度非0,则为真 [ -n "$myvar" ]string1 = string2 // 如果string1与string2相同,则为真 [ "$myvar" = "one two three" ]string1 != string2 // 如果string1与string2不同,则为真 [ "$myvar" != "one two three" ]
<算术比较运算符>
num1 -eq num2 // 等于 [ 3 -eq $mynum]num1 -ne num2 // 不等于 [ 3 -ne $mynum]num1 -lt num2 // 小于 [ 3 -lt $mynum]num1 -le num2 // 小于或等于 [ 3 -le $mynum]num1 -gt num2 // 大于 [ 3 -gt $mynum]num1 -ge num2 // 大于或等于 [ 3 -ge $mynum]
/* 代码演示 */#! /bin/shMYVAR=3if [ -e ./test.sh ]then echo "ok"else echo "err"fiif [ $MYVAR -eq 3 ]then echo "eq 3"fiif [ $MYVAR = "3" ]then echo "=3"fi
shell中的 case 格式:
case 字符串 in
模式1) command;;
模式2) command;;
...
*) command;;
esac
如果每个都匹配不到,则会在最后放置一个*,相当于c语言中的default
/* 代码演示 */Test=test.tar.gzcase "${Test##*.}" ingz) tar -xzvf $Text ;;bz2) tar -xjvf $Text ;;*) exho "format error..." ;;esac
【循环语句】
shell中的 while 语句格式:
while [ expression ]
do
command
...
done
/* 代码演示 */#! /bin/shMYNUM=0while [ $MYNUM -ne 10]do echo $MYNUM MYNUM=$(($MYNUM + 1)) # 注意小括号done
shell中的 for 语句格式:
for 变量名 [in 列表]
do
command1
command2
...
done
/* 代码演示 */for x in one two three four # 变量循环4次do echo number $xdonefor MYFILE in /etc/r*doif [ -d "$MYFILE" ]then echo "$MYFILE (dir)"else echo "$MYFILE"fidone
>> 实验1:自动备份源代码
/* 代码演示 */#!/bin/sh# BAKDIR可以换一个你喜欢的BAK_DIR=/backup# *为未知,自己查一下怎么取星期啦, 要0-6那个DATE=$(date +%*)# 自己查一下怎么周数啦WEEK=$(date +%*)# 备份文件名FULL_BAK=full_back.$WEEK.tar.bz2INCRE_BAK=increment_back.$WEEK.$DATE.tar.bz2# 其实没什么不同的,只是要改文件名而已if [ $DATE -eq 0]; then tar -g $BAK_DIR/sn.$WEEK cjf $BAK_DIR/$FULL_BAKelse tar -g $BAK_DIR/sn.$WEEK cjf $BAK_DIR/$INCRE_BAKfiexit $?# 把任务加到crontab里就行了,每天执行一次'--------------------------------------------------------------------------------------------------'#!/bin/shBAK_DIR=/backup# 还原目录RECOVER_DIR=/FULL_BAK=full_back.$WEEK.tar.bz2INCRE_BAK=increment_back.$WEEK.$DATE.tar.bz2echo -n "recover from week: "read WEEKif [ -e $BAKDIR/$FULL_BAK ]then tar xjf $BAK_DIR/$FULL_BAK -C $RECOVER_DIR for N in $(seq 6) do if [ -e $BAK_DIR/$INCRE_BAK ] then tar xjf $BAK_DIR/$INCRE_BAK -C $RECOVER_DIR fi doneelse echo "Backup file not exist!! exit now~~"fiexit $?# 这个是手动执行的,要自己输入想还原到的周数年# 补充:使用的时候还是要自己调试一下。
>> 实验2:自动解包分类并统计文件
/* 代码演示 */clearecho "================================="echo " my test shell programe "echo "================================="testfile="test.tar.gz"cdir="c_files"hdir="h_files"csum=0hsum=0fileinfo() {echo " "echo "============file count=========" > fileinfo.txtdate >> fileinfo.txtecho "====c file info====" >> fileinfo.txtls $cdir/* >> fileinfo.txt # */echo "----c files count:${csum}" >> fileinfo.txtecho "====h file info====" >> fileinfo.txtls $hdir/* >> fileinfo.txt # */echo "----h files count:${hsum}" >> fileinfo.txtcat fileinfo.txtecho " "}if [ -e "$testfile" ]thenif [ -e test ] then echo "rm test dir" rm -rf testfitar -xzf $testfileif [ -e "$cdir" ] then echo "rm $cdir dir" rm -rf "$cdir"fimkdir "$cdir"if [ -e "$hdir" ] then echo "rm $hdir dir" rm -rf "$hdir"fimkdir "$hdir"if [ -e test ]then for xfile in test/* # */ do case "${xfile##*.}" in c) cp $xfile $cdir csum=$(($csum+1)) ;; h) cp $xfile $hdir hsum=$(($hsum+1)) ;; *) ;; esac done fileinfo else echo "test dir error" fielseecho "$testfile no found"fiecho "================================="echo " test finsh "echo "================================="
0 0
- shell脚本编程入门基础(附:自动备份与解包文件脚本)
- Shell 脚本编程入门基础
- shell脚本 tomcat自动备份发布war包
- mysqldump自动备份shell脚本
- shell脚本编程入门
- ubuntu下shell脚本基础与入门
- Shell脚本编程基础
- Shell脚本编程基础
- Shell脚本编程基础
- shell脚本编程基础
- shell编程基础 脚本
- Shell脚本编程基础
- Shell脚本编程基础
- shell脚本编程基础
- Shell脚本编程基础
- shell脚本编程基础
- shell脚本编程基础
- SHELL脚本编程基础
- Learning Spark笔记1-Spark介绍
- 邮件服务器搭建——linux中PowerMTA+OEMPRO安装与配置方案
- 六properties属性文件的使用
- ntko打开文件,区分图片和office
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能
- shell脚本编程入门基础(附:自动备份与解包文件脚本)
- SQL SERVER 2008数据库的表中修改字段的数据类型后,不能保存
- 数据库中的触发器的实例讲解
- 基本样式
- span和图片
- Turbine怎样获取到节点的监控信息
- 获取距离当前时间任意天数的时间
- ajax之post方法
- select 选中的序号