一个小小的shell脚本实践
一、背景
最近碰到一下需要频繁复制一个文件夹的内容覆盖另一个文件夹的情况,想着正好可以对不是很熟悉的脚本下手了,写个复制的脚本。于是便有了本文的产生。下面我将会介绍最需要掌握的关于shell的知识以便各位速成shell脚本,需要全面了解请谷歌。
二、开始学习
1. 什么是shell脚本
shell就是linux或者mac的终端,它是一种C语言写的应用,也可以看作是一种命令语言,而shell script 即shell脚本是针对shell这个应用编写的脚本程序。脚本(Script),是使用一种特定的描述性语言,依据一定的格式编写的可执行文件。shell有很多种,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
不同的shell命令可能有些区别,本文是以bash为基础讨论的,因为免费且常用。
2.怎么用shell脚本
注意两个问题即可,一是可执行权限chmod +x xxx.sh
,二是使用正确的shell然后cd到当前文件夹./xxx.sh
3.如何写shell脚本
在我看来至少得会下面几个知识点
3.1 变量
规则如下
- 命名只能使用英文字母,数字和下划线
- 首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
声明变量也很简单,和python一样
#!/bin/bash #这句是指定应bash这个应用,不懂得加上就是了
var="这是一个变量"
# #可以注释,使用变量可以这样写
var2="11"+$var
#或者这样,花括号主要是可以解决一些界限的问题,遇到就懂了,
#推荐给所有变量加上花括号,这是个好的编程习惯。
var2="11"+${var}
#当然不能少了打印函数
echo $var2
更详细的删除变量,只读变量,以及变量类型及使用请谷歌之,都写出来就太长了
3.2 流程控制
if else if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while 循环
while condition
do
command
done
case选择(类似switch)
case 值 in
模式1)
command1
command2
...
commandN
;; # ;;代表break
模式2)
command1
command2
...
commandN
;;
esac
3.3 解析命令行参数getopts
这个就是可以解析命令行参数的东西,举个例子:
./xxx.sh -a 111 -b 111
a 和b后面的两个111就可以用getopts得到,其实这是个内置变量,使用格式如下
getopts optstring argname
具体使用请看下面的实践。
三、实践–复制文件夹
#!/bin/bash
#create by Gol_Light on 20201028
while getopts "a:b:" arg #选项后面的冒号表示该选项需要参数
do
case $arg in
a)
#echo "a's arg:$OPTARG" #参数存在$OPTARG中
dir_path_a=$OPTARG #需要复制的源文件
;;
b)
#echo "b's arg:$OPTARG"
dir_path_b=$OPTARG #需要复制的目的文件
;;
?) #当有不认识的选项的时候arg为?
echo "unkonw argument"
exit 1
;;
esac
done
echo "正在将 $dir_path_a 复制到 $dir_path_b"
rm -r $dir_path_b #先删除
mkdir $dir_path_b #后创建
cp -af $dir_path_a $dir_path_b #然后复制
#!/bin/bash
#create by Gol_Light on 20201028
./copy.sh -a ptahA -b pathB
编辑好目录,然后./下面的.sh 就大功告成
希望对你有所帮助,如果没有,你就当没看过