『壹』 启动所有配置文件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 ntpdateSYNC_HWCLOCK=no# Additional options for ntpdateNTPDATE_OPTIONS=""例子 2:网络配置文件$ cat /etc/sysconfig/networkNETWORKING="yes"HOSTNAME="xx.com"而且,要注意得是,一般 key=value 的等号两边不应该有空格,因为大多数脚本都是直接 source 配置文件的(当然,也有部分脚本是会自己处理配置文件格式),使用起来很简单,基本上没有解析的操作:$ cat /etc/init.d/networkif [ ! -f /etc/sysconfig/network ]; then exit 0fi. /etc/sysconfig/network理所当然,这种格式无法满足更复杂的配置文件需求,比如 ini 格式的 section。那么,在 shell 中除了满世界去找一个解析库之外,能有什么方法可以实现呢?扩展 key=value 文本格式配置假设,我们管理着 n 个集群,每个集群配置项都是一样的,我们需要在 shell 脚本中,可以根据集群的名称来导入对应的配置。下面我们介绍一种最简单的方法,只需要针对第一种格式扩展下即可。我们创建一个配置文件目录 conf.d,在这个目录下存放各个集群的配置文件。每个集群对应一个配置文件,文件名为集群名称,例如:$ cat conf.d/CLUSTER_Ac_cluster_name="CLUSTER_A"c_cluster_type=1在脚本中,我们可以这样来导入相应集群的配置:function load_config(){ local cluster_name="$1" if [ -f "conf.d/$cluster_name" ]; then . conf.d/$cluster_name fi}load_config CLUSTER_A因为各个集群的配置文件相互独立,所以如果包含一些全局范围的配置项,需要在每个配置文件中都增加。或者,再增加一个入口的配置文件:# cat global.confg_conf_dir=conf.d # 配置文件目录g_version="0.1" # 全局配置脚本相应调整下:GLOBAL_CONF=/etc/xxx/global.confif [ -f "$GLOBAL_CONF" ]; then . $GLOBAL_CONFfiif [[ "$g_conf_dir" != /* ]]; then # 如果是相对路径 g_conf_dir="$(dirname $GLOBAL_CONF)/$g_conf_dir"fifunction load_config(){ local cluster_name="$1" if [ -f "$g_conf_dir/$cluster_name" ]; then . $g_conf_dir/$cluster_name fi}load_config CLUSTER_A类 ini 配置格式第二种方法,基本上已经可以解决我们之前假设中提出的需求,简单而且实现方便,不足的是配置文件比较零散,管理上可能不是很方便。如果,你仍然倾向于一种类似 ini 格式的配置,可以试试下面这种方法。在这种场景下,每个集群应该是一个独立的 section,所以转换成 ini 格式,配置文件应该是这样的:[DEFAULT]g_version="0.1" ; 全局配置[CLUSTER_A]c_cluster_name="CLUSTER_A"c_cluster_type=1但是,我们前面提到过,原生的 shell 是很难去解析 ini 格式的配置文件的,所以上面的形式还得变化下,我们用 shell 中的函数来模拟 section:$ cat cluster.conf# global configg_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 [ ! -f "cluster.conf" ]; then exit 0 # or print error before exitfi. cluster.conffunction load_config(){ local cluster_name=$(echo "$1" | tr A-Z.- a-z__) # 特殊符号转换 section_$cluster_name &>/dev/null # 执行函数,将集群的配置赋值给对应的全局变量}function option(){ local opt_name="$1" if [[ "$opt_name" != c_* ]]; then # no "c_" prefix opt_name="c_$opt_name" fi echo "${!opt_name}" # indirect reference by variable name}
『贰』 linux中的.conf文件是怎么被读取的
init.d下的都是开机时启动的后台进程执行脚本,脚本配置里会有执行程序版的定义,这个执权行的程序就会去读取相关配置文件。比如你说的/etc/init.d/dnsmasq脚本里定义的dnsmasq程序运行后就会去读取/etc/dnsmasq.conf文件.
『叁』 如何从一个文件读取shell脚本执行参数
使用source命令可以把一个文件的内容读取到当前脚本来
例如:
a.conf 里面有一个内变量 aa="1234"
在脚本里面使用source
#!容/bin/bashsource./a.conf(source的时候最好用绝对路径,我这儿用的相对路径)echo$aa
『肆』 我要写一个shell脚本,实现替换*.conf文件,怎么实现执行脚本时手动修改conf文件中的用户名、密码
1、替换字符串sed -i 's/user01/user02/g' u.confsed -i 's/password1/password2/g' u.conf2、删除相关行sed -i '/user01/d' a.conf或者删除指定行sed -i '20d' a.conf3、在第20行添加内容sed -i '20 r user.txt' a.conf4、在user.start后面开始添加内容sed -i '/user.start/r user.txt' b.conf
『伍』 标准的shell脚本应该包含什么
一个标准的shell脚本包括bin、conf、log三个文件夹。bin包含脚本的具体内容;conf包含脚本需要获取的配置;log包含脚本执行过程有无错误的log和跟业务相关的log。在计算机科学中,Shell俗称壳,是指“为使用者提供操作界面”的软件(命令解析器)。它用于接收用户命令,然后调用相应的应用程序。同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。在排序算法中,Shell是希尔排序的名称。
『陆』 Linux系统/etc/security/limits.conf文件什么作用
/etc/security/limits.conf#<domain> <type> <item> <value>##* soft core 0 禁止创建core文件#* hard rss 10000 非root用户最多使用10M内存#@student hard nproc 20 最多进程数限制在20#@faculty soft nproc 20#@faculty hard nproc 50#ftp hard nproc 0#@student – maxlogins 4limits.conf的工作原理: limits.conf的后端是这样工作的:limits.conf是pam_limits.so的设置文件,然后/etc/pam.d/下的应用程式调用pam_***.so模块。譬如说,当用户访问服务器,服务程式将请求发送到PAM模块,PAM模块根据服务名称在/etc/pam.d目录下选择一个对应的服务文件,然后根据服务文件的内容选择具体的PAM模块进行处理。 例:限制admin用户登录到sshd的服务不能超过2个 在/etc/pam.d/sshd 中添加 session required pam_limits.so 在/etc/security/limits.conf中添加 admin – maxlogins 2 查看应用程式能否被PAM支持,用ldd limits.conf文件的参数 Limits.conf文件的参数能设置成以下两种形式之一: 暂时地,适用于通过 ulimit 命令登录 shell 会话期间。 永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件之一(例如 ~/.profile),即特定于 shell 的用户资源文件;或通过编辑 /etc/security/limits.conf。 1.core – 限制内核文件的大小 何谓core文件,当一个程式崩溃时,在进程当前工作目录的core文件中复制了该进程的存储图像。core文件仅仅是个内存映象(同时加上调试信息),主要是用来调试的。 core文件是个二进制文件,需要用相应的工具来分析程式崩溃时的内存映像。 系统默认core文件的大小为0,所以没有创建能用ulimit命令查看和修改core文件的大小。 $ulimit -c0$ ulimit -c 1000$ ulimit -c1000 -c 指定修改core文件的大小,1000指定了core文件大小。也能对core文件的大小不做限制,如: # ulimit -c unlimited#ulimit -cunlimited 如果想让修改永久生效,则需要修改设置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf。 2.nofile – 打开文件的最大数目 对于需要做许多套接字连接并使他们处于打开状态的应用程式而言,最佳通过使用 ulimit ?n,或通过设置nofile 参数,为用户把文件描述符的数量设置得比默认值高一些。 limits.conf的格式如下:username|@groupname type resource limitusername|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 – 就表明同时设置了 soft 和 hard 的值。resource:core – 内核文件的大小date – 最大数据大小fsize – 最大文件大小memlock – 最大锁定内存地址空间nofile – 打开文件的最大数目rss – 最大持久设置大小stack – 最大栈大小cpu – 以分钟为单位的最多 CPU 时间noproc – 进程的最大数目as – 地址空间限制maxlogins – 此用户允许登录的最大数目要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。查看 /etc/pam.d/login 文件中有:session required /lib/security/pam_limits.so按下面说的,可以用ulimit -n 32768设置最大描述符,不过只对当前会话有用,而且要root,这个不好办或者修改/etc/security/limits.conf,但要重启另外,没查到linux究竟最大描述符有没有限制,其他几个限制要不要改
『柒』 在/etc目录下查找文件名以“.conf”结尾的文件. 用什么命令啊
查找/etc/目录下以.conf结尾的文件:find /etc/ -name "*.conf"。
统计/etc/目录下.conf结尾文件的个数:find /etc/ -name "*.conf" | wc -l。
find命令格式:
find +目录 +条件 +条件值
如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部进行显示,如图,在/root下的子目录和文件全部显示出来(截取部分):
find命令查找文件相关细分条件,条件越多,查找越准确
1、根据文件格式进行查找:
在/home下查找所有以 .txt 结尾的文件: find /home -name “*.txt"。
2、根据文件目录层数查找:
find –maxdepth+层数 按最大层数查找。
–mindepth+层数 按最小层数查找。
文件查找指令:
查找/etc/目录下大小大于 1M的文件(记得大写):find /etc/ -size +1M。
查找七天内改过的文件:find / -mtime -7。
按文件类型查找:-文件 d 目录 b块文件 c字符文件鼠标显示器。
在dev目录下查找所有块设备文件:find /dev/ -type b。
『捌』 写一个shell脚本,读取配置文件算出配置文件中是数字的和。 配置文件sum.conf 1 a 2
给你举个例子吧,下面是我写的一个读取配置参数的问题其中 for i in `cat $V_CFG_DIR/tab_tmp2.cfg` 是读取配置文件tab_tmp2.cfg如果你参数的名字需要通过参数来传递的话那就改下,添加一个参数并把tab_tmp2.cfg换成你添加的参数(就像参数V_DATA_DATE一样通过外部传入),另外加法求和你网络下就可以搞定了,快看看吧,有详细的注释 ##############################################################功能:装载指定目录数据#作者:PENGWEI#时间:2015-11-18############################################################## 数据日期参数,待传入V_DATA_DATE=$1#FTP完成后数据存放路径V_DATA_DIR=/home/almusr/data/odsdata/FTP/$V_DATA_DATE# FTP完成后生成的标志文件所在路径V_FTP_FLAG=/home/almusr/data/etl_load/FTPOK# 解压数据前备份数据的存放路径V_DATA_BAK=/home/almusr/data/odsdata/odsdata_bak# 配置文件存放路径V_CFG_DIR=/home/almusr/cfg#日志文件LOGDIR=/home/almusr/log/Loaddata_logLOGFILE=$LOGDIR/LoadData_$V_DATA_DATE.log# 初始化系统参数DBNAME=ALMDBUSER=almusrPASSWORD=almusrSCHEMA=ODSUSR#如果 日志目录不存在if [ ! -d "${LOGDIR}" ] then #建立目录 mkdir -p "${LOGDIR}" fi#\n –回车echo "\n日志文件[$LOGFILE]\n"#日志函数recordLog(){ echo `date +"%Y-%m-%d %T"`": $1" | tee -a $LOGFILE return 0}#判断参数个数if [ $# -ne 1 ]then recordLog "Usage:$0 directory" exit 1fi# $?表示上述命令执行后返回的状态(执行成功返回0 执行不成功返回非0)if [ $? -ne 0 ] then recordLog "cd $V_DATA_DIR error !" exit 1fi#连接数据库db2 connect to $DBNAME user $USER using $PASSWORDif [ $? -ne 0 ]then recordLog "connect[$DBNAME] fail!" exit 1fi#加载数据 RETVAL=0for i in `cat $V_CFG_DIR/tab_tmp2.cfg`do#读取表名并输出 TABLE_NAME=`echo $i | awk -F "," '{print $1}'` #读取文件后缀名并输出 echo " the table_name is $TABLE_NAME" #拼接文件名 FILENAME=${TABLE_NAME}.del #解压缩 临时变量 FILENAME_TMP=$FILENAME.gz echo "the FILENAME is $FILENAME" recordLog "the FILENAME $FILENAME!" # 第一步:对压缩文件备份,先扫描FTP完成标志,如果存在就说明FTP过程已结束,开始备份,否则等待继续扫描 #进去FTP完成标志所在目录 cd $V_FTP_FLAG #扫描FTP完成标志 if [[ ! -e "${V_DATA_DATE}.ok" ]]; then sleep 1800 else cd $V_DATA_BAK #备份文件 cp -r $V_DATA_DIR ${V_DATA_DATE}_bak cd ${V_DATA_DATE}_bak rm -rf ${V_DATA_DATE} fi recordLog "Copy data was finished" # 第二步:删除30天前的备份数据 v_BakFileDate=`date -d "- 30 day ${V_DATA_DATE}" +%Y%m%d` cd $V_DATA_BAK rm -rf ${v_BakFileDate}_bak recordLog "Removed the bak_data of 30 days before!" # 第三步:对文件进行解压 cd $V_DATA_DIR if [ -f $FILENAME_TMP ] then echo "$FILENAME_TMP must gunzip" #解压文件 gunzip $FILENAME_TMP echo "$FILENAME_TMP ,gunzip success" else echo "$FILENAME exist,next step" recordLog "$FILENAME exist,next step!" fi # 第四步:数据加载 if [ -f $FILENAME ] then # CMD="db2 \"load from $FILENAME of del MODIFIED BY coldel0x23 usedefaults keepblanks decpt. replace into ODSUSR.$TABLE_NAME data buffer 10000\" > $LOGDIR/$TABLE_NAME_XX.log 2>&1" CMD="db2 \"load from $FILENAME of del replace into ODSUSR.$TABLE_NAME data buffer 10000\" > $LOGDIR/$TABLE_NAME.log 2>&1" echo "$FILENAME is loading" eval $CMD fi echo "load data is over" recordLog "load data is over" # 第五步:判断加载是否正确#判断是否正常加载 read_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows read" | awk -F'=' '{print $2}'` skip_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows skipped" | awk -F'=' '{print $2}'` load_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows loaded" | awk -F'=' '{print $2}'` reject_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows rejected" | awk -F'=' '{print $2}'` delete_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows deleted" | awk -F'=' '{print $2}'` commit_num=`cat $LOGDIR/$TABLE_NAME.log | grep "Number of rows committed" | awk -F'=' '{print $2}'`echo "$read_num,$skip_num,$load_num,$reject_num,$delete_num,$commit_num" #条件判断加载是否正确 if [[ "$read_num" -eq "$load_num" && "$load_num" -eq "$commit_num" ]] then echo "Data loading is perfect!" else cat $LOGDIR/$TABLE_NAME.log recordLog "loading [$V_DATA_DIR/$TABLE_NAME] error!" RETVAL=1 continue fidonedb2 connect reset >/dev/null 2>&1if [ $RETVAL != 0 ]then recordLog "load data directory [$V_DATA_DIR] error!!!"else recordLog "load data directory [$V_DATA_DIR] successful!!!"fi # 第五步:完成退出exit 0你把这个问题看懂了估计你那个就没问题了有什么问题再交流
『玖』 新手求助:shell中如何查看一个程序的安装路径
假设忘记了httpd.conf这个文件在系统的哪个目录下,则可以使用如下命令:find / -name httpd.conf在find后面写上-name,表明要求系统按照文件名查找,最后写上httpd.conf这个目标文件名即可,命令反馈显示出查找结果列表:etc/httpd/conf/httpd.conf#这就是httpd.conf这个文件在Linux系统中的完整路径 #find()命令参数-amin n #查找系统中最后N分钟访问的文件 -atime n #查找系统中最后n*24小时访问的文件 -cmin n #查找系统中最后N分钟被改变状态的文件 -ctime n #查找系统中最后n*24小时被改变状态的文件 -empty #查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹 -false #查找系统中总是错误的文件 -fstype type #查找系统中存在于指定文件系统的文件,例如:ext2 . -gid n #查找系统中文件数字组ID 为 n的文件 -group gname #查找系统中文件属于gnam文件组,并且指定组和ID的文件。
『拾』 如何用shell脚本遍历指定目录下的文件,并按后缀名分类
脚本1:#!/bin/bash##cd /tmp/scriptcfile=` find -name '*.c' `hfile=` find -name '*.h' `for fc in $cfiledocfname=`basename -s .c $fc`cat $fc >/tmp/scripttest/$cfname.txtdonefor fh in $hfiledocp $fh /tmp/scripttestdone