shell脚本编写大全(Linux如何编写shell脚本)
本文目录
Linux如何编写shell脚本
一般以#!/bin/sh开头(不是必须要写,但一定要单独一行),指定执行这个脚本的shell程序(也可以用#!/bin/zsh或其他),然后就是堆命令了。
Linux的shell脚本支持很多功能,加上Linux高度模缓铅块化的命令,完全可以用shell脚本写出复杂的程序。
以上只是简单介绍如何开始写shell脚本衫塌,如果要写复杂的脚本,还需要深入学习相关知识(如if——fi、case——esac等结构)。
当然,还需要给脚本加上可执行权限(chmod +x ./file.sh),否则可以用sh ./file.sh方式执行脚本(这里的sh是执行脚本所需shell,命令也可以是zsh ./file.sh或其他)。
整个shell脚本,其实就相当于你在终端输入的一系列命令,如果想在shell里做什么,就先想想在终端可以做什么吧,字符的的连接,就是直接用 "" 双引号,输出,变量定义无 $ 符号,但是使用时一定要加上 $ 符号。
"=" 赋值符号,两边一定不能有空格,这和其他语言有区别,尤其是你还有自己代码美观风格时特别注意,否则会报语法错误!
for 中的数组内容是以 " " 空格分隔,而非 "," 逗号分格。
条件判断 。
while 条件判断可扰塌好以用 () 括号,也可以用 中括号。
如果用windows写shell,一定要注意换行符格式 \n 而非 \r\n , 需要借助一些器(如notepad++)更改换行符格式!
启动所有配置文件shell脚本怎么写
key=value 文本格式配置
而对于 linux shell,基本上很难使用前面提到的各种格式。所以在 unix 系统上,铅乎很多 shell 脚本的配置文件都是纯粹的 key=value 文本格式,例如绝大多数的开机服务启动脚本、网络配置文件等。
例子 1:ntp 配置文件
$ cat /etc/sysconfig/ntpd
# Drop root to id ’ntp:ntp’ by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# Set to ’yes’ to sync hw clock after successful ntpdate
SYNC_HWCLOCK=no
# Additional opti*** for ntpdate
NTPDATE_OPTIONS=""
例子 2:网络配置文件
$ cat /etc/sysconfig/network
NETWORKING="yes"
HOSTNAME="xx.com"
而且,要注意得是,一般 key=value 的等号两边不应该有空格,因为大多数脚本都是直接 source 配置文件的(当然,也有部分脚本是会自己处理配置文件格式),使用起来很简单,基本上没有解析的操作:
$ cat /etc/init.d/network
if ; then
exit 0
fi
. /etc/sysconfig/network
理所当然,这种格式无法满足更复杂的配置文件需求,比如 ini 格式的 section。那么,在 shell 中除了满世界去找一个解析库之外,能有什么方法可以实现呢?
扩展 key=value 文本格式配置
假设,我们管理着 n 个集群,每个集群配槐孙悉置项都是一样的,我们需要在 shell 脚本中,可以根据集群的名称来导入对应的配置。
下面我们介绍一种最简单的方法,只需要针对第一种格式扩展下即可。我们创建一个配置文件目录 conf.d,在这个目录下存放各个集群的配置文件。每个集群对应一个配置文件,文件名为集群名称,例如:
$ cat conf.d/CLUSTER_A
c_cluster_name="CLUSTER_A"
c_cluster_type=1
在脚本中,我们可以这样来导入相应集群的配置:
function load_config()
{
local cluster_name="$1"
if ; then
. conf.d/$cluster_name
fi
}
load_config CLUSTER_A
因为各个集群的配置文件相互独立,所以如果包含一些全局范围的配置项,需要在每个配置文件中都增加。或者,再增凯悉加一个入口的配置文件:
# cat global.conf
g_conf_dir=conf.d # 配置文件目录
g_version="0.1" # 全局配置
脚本相应调整下:
GLOBAL_CONF=/etc/xxx/global.conf
if ; then
. $GLOBAL_CONF
fi
if ; then # 如果是相对路径
g_conf_dir="$(dirname $GLOBAL_CONF)/$g_conf_dir"
fi
function load_config()
{
local cluster_name="$1"
if ; then
. $g_conf_dir/$cluster_name
fi
}
load_config CLUSTER_A
类 ini 配置格式
第二种方法,基本上已经可以解决我们之前假设中提出的需求,简单而且实现方便,不足的是配置文件比较零散,管理上可能不是很方便。如果,你仍然倾向于一种类似 ini 格式的配置,可以试试下面这种方法。
在这种场景下,每个集群应该是一个独立的 section,所以转换成 ini 格式,配置文件应该是这样的:
g_version="0.1" ; 全局配置
c_cluster_name="CLUSTER_A"
c_cluster_type=1
但是,我们前面提到过,原生的 shell 是很难去解析 ini 格式的配置文件的,所以上面的形式还得变化下,我们用 shell 中的函数来模拟 section:
$ cat cluster.conf
# global config
g_version="0.1" # 全局配置
function section_cluster_a()
{
c_cluster_name="CLUSTER_A"
c_cluster_type=1
}
function section_cluster_b()
{
c_cluster_name="CLUSTER_B"
c_cluster_type=1
}
配套的配置文件解析库:
$ cat config.sh
#!/bin/echo Warnning, this library must only be sourced!
if ; then
exit 0 # or print error before exit
fi
. cluster.conf
function load_config()
{
local cluster_name=$(echo "$1" | tr A-Z.- a-z__) # 特殊符号转换
section_$cluster_name &》/dev/null # 执行函数,将集群的配置赋值给对应的全局变量
}
function option()
{
local opt_name="$1"
if ; then # no "c_" prefix
opt_name="c_$opt_name"
fi
echo "${!opt_name}" # indirect reference by variable name
}
shell脚本书写方法
在shell学习过程中,感觉挺有用的一份比较,略整理分享给大家。
首先,shell的作用
用户的**shell **后默认的shell程序是: /bin/bash
不同的shell内部指令,运行环境会有所区别
常见的shell有
/bin/sh
/bin/bash
/**in/nologin
1.编写脚本代码:
使用vi器,每行一条Linux命令,按照顺序执行
2.然后赋予脚本文件可执行的属性
3.执行脚本文件的三种方法
./chao.sh
sh /chao.sh
source /chao.sh
更完善的脚本构成
注释信息
可执行语句
重定向操作
类型 操作符 用途
重定向输入 《 从指定文件读取而不是从键盘输入
重定向输出 》 将输出文件保存到指定文件(覆盖原有内容)
》》 将输出文件保存到指定文件(覆盖原有内容)
标准错误输出 2》 将错误信息保存到指定的文件(覆盖原有内容)
2》》 将错误信息保存到指定的文件
混合输出 &》 将标准输出,标准错误的内容保存到同一文件中
管道操作符号“|”
将左侧的命令输出结果,作为右侧命令的处理对象
shell变量的作用
为灵活管理Linux系统提供的特定参数,有两层意思
变量名:使用固定的名称,由系统预设或用户定义
变量值: 能够根据用户设置,系统环境的变化而变化
变量的类型
自定义变量:由用户自己定义,修改和使用
环境变量: 由系统维护,用于设置工作环境
位置变量: 通过命令行给脚本程序传递参搏春唤数
预定义变量:BASH中内置的一类变量,不能直接修改
定义一个新的变量
格式: 变量名=变量值
变量名以字母或下划线开头,区分大小写,建议全大写
查看变量的值: echo $变量名
赋值时使用引号:
双引号:允许使用$符引用其他变量值
单引号: 禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提基凯取命令执行后的输出结果
将键盘输入内容为变量赋值
格式: read 变量名
设置变量的作用范围
export 变量名
export 变量名=变量值
两种格式可以混合使用
整数变量的运算:
expr 变量1 运算符 变量2
常见的运算符
加法运算符 +
减法运算符: -
乘法运算符:\*
除法运算符: /
取余运算:%
整数变量的运算(2)
((变量=变量运算符变量));
等号后面的变量可以是具体数值
例子:
((a=a+3)森笑);
环境变量:
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile ~/.bash_profile
常见环境变量的举例
位置变量:
表示为$n, n为1~9之间的数字
预定义变量:
/etc/passwd /etc/shadow
例如一些服务的内置用户名或密码
如apache的启动用户就是预定义变量
条件测试操作
测试特定的 表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值
格式 : test 条件表达式
应用实例:
test -z 进行测试的时候 字符串长度为0的时候 结果才返回1
如果变量数值为0 返回0
条件测试操作
部分是判断表达式,-d表示判断是否是目录
&&是”逻辑与“操作符,只有&&前面的判断成立,后面的语句才会执行
-b的意思是判断 后面的路径是否是一个目录
echo $? 表示对刚刚执行的表达式进行判断
0表示成立,1表示不成立
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
filename1-nt filename2 如果 filename1比 filename2新,则为真
filename1-ot filename2 如果 filename1比 filename2旧,则为真
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string长度为零,则为真
-n string 如果 string长度非零,则为真
string1= string2 如果 string1与 string2相同,则为真
string1!= string2 如果 string1与 string2不同,则为真
算术比较运算符
num1-eq num2 等于
num1-ne num2 不等于
num1-lt num2 小于
num1-le num2 小于或等于
num1-gt num2 大于
num1-ge num2 大于或等于
整数值比较
格式:
字符串比较
格式1:
格式2:
逻辑测试:
格式1:
格式2: 命令1 操作符 命令2
if语句的结构
while语句的语法结构
Linux里面基本的shell脚本编写有哪些
shell脚本就是一些命令的集合。
举个例子,我想实现这样的操作:
1)进入到/tmp/目录;
2)列出当前目录中所有的文件名;
3)把所有当前的文件拷贝到/root/目录下;
4)删除当前目录下所有的文件。
简单的4步在shell窗口中需要你敲4次命令,按4次回车。这样是不是很麻烦?当然这4步操作非常简单,如果是更加复杂旅纳的命令设置需要几十次操作呢?那样的话一次一次敲键盘会很麻烦。所以不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一步操作就可以完成。其实这个文档呢就是shell脚本了,只是这个shell脚本有它特殊的格式。《linux 就该这么学》
Shell脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh这个脚本就不能执行,只是大家的一个习惯而已。所以,以后你发现了.sh为后缀的文件那么它一定会是一个shell脚本了。test.sh中第一行一定是 “#! /bin/bash” 它代表的意思是,该文件使用的是bash语法。如果不设置该行,那么你的shell脚本就不能被执行。’#’表示注释,在前面讲过的。后面跟一些该脚本的相关注释内容以及作者和创建日期或者版本等等。当然这些注释并非必须的,如果你懒的很,可以省略掉,但是笔者不建议省略。因为随启镇宴着你工作时间的增加,你写的shell脚本也会越来越多,如果有一天你回头查看你写的某个脚本时,很有可能忘记该脚本悄银是用来干什么的以及什么时候写的。所以写上注释是有必要的。另外系统管理员并非你一个,如果是其他管理员查看你的脚本,他看不懂岂不是很郁闷。该脚本再往下面则为要运行的命令了。
更多文章:
大样本随机分组方法(大样本·随机.双盲.分组测试科学方法的由来)
2026年3月31日 23:20
96微信编辑器在线使用免费(微信编辑器怎么用 微信内容编辑器)
2026年3月31日 22:40
centos7关闭防火墙命令(如何关闭 linux centos7 防火墙)
2026年3月31日 22:00






