Linux下shell脚本的编写

由于需要频繁使用相同的命令,今天学习一下如何再Linux下编写简单的shell脚本,简化操作,节省时间

规范格式

我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。
利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:

1
2
3
#!/bin/sh
#comments
Your commands go here

首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上”,这个符号表明下一行与此行会合并为同一行。
编辑完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:
chmod +x filename.sh
执行脚本的方法是:
./filename.sh

Shell的基本知识

与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:
[ -f “$file” ] 判断$file是否是一个文件
[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x “$file” ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性
[ -n “$a” ] 判断变量$a是否有值,测试空串用-z
[ “$a” = “$b” ] 判断$a和$b的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立
要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

Linux中bash shell语音保留的关键字:
case、elif、let、clear、else、read、continue、if、then、echo、for in、while

2.1. shell提示符及其环境
提示符:$
环境:Linux,Unix,Dos等等
Shell其实就是一个解释执行命令的程序,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。
同传统的编程语言一样,shell提供了很多特性,这些特性可以使你的shell script编程更为有用,如:数据变量、参数传递、判断、流程控制、数据输入和输出,子程序及以中断处理等。
2.2 如何执行shell程序
Shell程序(***.sh)
? 执行这个命令时
(1) #./***.sh
(2) #chmod u+x .sh
#
.sh
(3) #sh ***.sh
2.3 常量
? 字符串,例如“Hello World!”。
? 数字,例如705,23。

2.4 变量
shell编程中它们是没有类型的,简称弱类型编程语言,在这个变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量时创建它。
STR=”Hello World!”
echo $STR
  HOME=”/home” //注意赋值不要有空格
  a=123
  HOME_LIST=$(ls /home) //把命令的执行结果赋值给变量
  ehco $HOME //$ 符号是获得变量HOME的值
  a=a+1
系统变量:
  $0 这个程序的执行名字
  $n  这个程序的第n个参数值,n=1…9
  $*  这个程序的所有参数
  $# 这个程序的参数个数
  $$ 这个程序的PID
  $! 执行上一个背景指令的PID
$? 上一个指令的返回值
2.5 局部变量
局部变量一般是指写在函数中的变量,他的生命力是有限的。局部变量比较好理解,这里就不再多介绍了。
2.6 从键盘输入变量值
使用read命令
read var1 var2 … varn
2.7 注释
?Shell编程中的注释以#开头
2.8 数字运算
主要是指整数运算。expr命令可以将字符型变量转换为整数进行操作
语法:expr integer operator integer
其中operator为+ - * / %, 但对的使用要用转义符/,如:
[oracle@localhost ~]$ more dvd.sh
#!/bin/bash
expr 5 /
5
[oracle@localhost ~]$ sh dvd.sh
25
2.9 逻辑运算
test进行逻辑运算,用[ ]括起来就是test运算
int1 -eq int2 相等?
int1 -ne int2 不等?
int1 -gt int2 int1 > int2 ?
int1 -ge int2 int1 >= int2 ?
int1 -lt int2 int1 < int2 ?
int1 -le int2 int1 <= int2
2.10 双引号及单引号
?$echo “$HOME $PATH” – 显示变量值
/home/hbwork opt/kde/bin:/usr/local/bin:
$echo ‘$HOME $PATH’ – 显示单引号里的内容
$HOME $PATH
2.11 空格
由于shell对命令中的多余的空格不作任何处理 ,而用引号括起来则可以防止shell去掉这些空格。
$ str1=abcd
$ str2=”abcd “
2.12 分支结构
if [ variable = value ]
then
command
else
if [ variable = value ]
then
command
else
command
fi
2.13 Case语句
case value in
pattern1)
command;;
pattern2)
command;;

patternn)
command;
esac
2.15 循环语句
For循环:
for var in arg1 arg2 … argn
do
command
….
command
done

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi

tar -Jcvf /home/xin/Desktop/hostapd-2018-05-21-62566bc2.tar.xz /home/xin/Desktop/hostapd-2018-05-21-62566bc2
echo "compile Success!"

mv -i /home/xin/Desktop/hostapd-2018-05-21-62566bc2.tar.xz /home/xin/openwrt/dl
echo "move Success!"

make FORCE\_UNSAFE\_CONFIGURE=1 V=s

自己写的一个很简单的shell脚本。


Linux下shell脚本的编写
https://chujian521.github.io/blog/2018/12/10/Linux下shell脚本的编写/
作者
Encounter
发布于
2018年12月10日
许可协议