常用shell脚本
- 格式:doc
- 大小:37.00 KB
- 文档页数:11
powershell⽇常操作服务器脚本(1)由于⽇常接触服务器和APP运维⼯作较多,估整理⼀些⽇常使⽤powershell 脚本来操作服务器的⼀些⽅法:脚本如下:# 重启IISfunction Action-IIS-Restart{param(#输⼊参数[Paramter(Mandatory=$true)][string]$password,[evntype]$evn)#password 转换$password_conv =ConvertTo-SecureString -String#需要重启IIS的服务器列表$servers= 'server1','server2'#登陆凭证对应⽤户信息$username='username'#创建登陆凭证$credential =New-Object System.Management.Automation.PSCredential -argumentlist $username ,$password_convwrite-output '正在重启 IIS 服务 ................ '#循环遍历需要重启IIS服务器foreach($server in$servers){$message= '正在重启 IIS 服务,服务器 : '+$serverwrite-output $message$sessions=New-PSSession -ComputerName $server -credential $credentialInvoke-Command –Session $sessions -scriptBlock {restart-Service w3svc}$message= 'IIS 服务已重启,服务器 : '+$serverwrite-output $message}write-output 'IIS 服务已全部重启 ...................'}#重启服务器function Action-Restart-Server{param([Paramter(Mandatory=$true)][string]$password)$username='username' #推荐使⽤G-account ,且该账号需要有admin权限$servers='server1','server2'#需要重启的服务器列表$password_conv =ConvertTo-SecureString -String $password -AsPlainText -Force#创建凭证$credential =New-Object System.Management.Automation.PSCredential -argumentlist $username ,$password_conv#重启命令write-output '开始重启服务器......'Restart-Computer -ComputerName $servers -Credential $credential -Wait -For PowerShell -InformationActionwrite-output '服务器重启完成......'}#获取服务上IIS pool的状态function IIS_Status_Check{#获取应⽤程序池状态Import-Module WebAdministration; Get-WebAppPoolState -Name 'DefaultAppPool'#开启应⽤程序池Import-Module WebAdministration; Start-WebAppPool -Name 'DefaultAppPool'#关闭应⽤程序池Import-Module WebAdministration; Stop-WebAppPool -Name 'DefaultAppPool'#获取站点状态Import-Module WebAdministration; Get-WebsiteState -Name "Default Web Site"}View Code--待续--。
Shell脚本中的日期和时间处理技巧在Shell脚本中,日期和时间的处理是经常会使用到的一个功能。
本文将介绍一些常用的Shell脚本中日期和时间处理的技巧,帮助读者更好地处理日期和时间相关的问题。
一、获取当前日期和时间在Shell脚本中,获取当前日期和时间是很常见的需求。
可以使用date命令来获取当前的日期和时间。
下面是一个示例代码:```#!/bin/bashcurrent_date=$(date +%F)current_time=$(date +%T)echo "当前日期:$current_date"echo "当前时间:$current_time"```上述代码中,使用date命令的+%F参数获取当前日期,+%T参数获取当前时间。
通过将获取到的日期和时间赋值给变量,我们可以在脚本中进行进一步的处理和输出。
二、格式化日期和时间在实际的脚本中,可能需要将日期和时间按照一定的格式进行输出。
可以使用date命令的-d参数来指定输入的日期和时间,并结合+%格式参数来格式化输出。
下面是一个示例代码,将指定的日期和时间格式化为"YYYY-MM-DD HH:MM:SS"的格式:```#!/bin/bashformatted_date=$(date -d "2021-01-01 12:34:56" +%F)formatted_time=$(date -d "12:34:56" +%T)echo "格式化后的日期:$formatted_date"echo "格式化后的时间:$formatted_time"```在上述代码中,使用date命令的-d参数指定输入的日期和时间,后面的+%F和+%T参数分别表示格式化为日期和时间的格式。
三、计算日期和时间差有时候我们需要计算两个日期或时间之间的差值。
shell脚本常⽤命令shell基本命令1.#!/bin/sh是指此脚本使⽤/bin/sh来解释执⾏。
解释:#! 是⼀个约定的标记,它告诉系统这个脚本需要什么解释器来执⾏,即使⽤哪⼀种 Shell。
2.echo 命令⽤于向窗⼝输出⽂本。
举例:echo "Hello World !"3.your_name="qinjx"赋值变量echo ${your_name}打印变量;使⽤变量的时候加括号和美元符4.chmod +x ./test.sh #使脚本具有执⾏权限./test.sh #执⾏脚本chmod 777 /tmp -R 意思是把tmp⽂件夹及其⼦bai⽂件夹的权限全部修改为777解释语句⼀:ping -c 5 > /dev/null 2>&11. ping -c 5 -c<完成次数>:设置完成要求回应的次数;2. >/dev/null这条命令的作⽤是将标准输出1重定向到/dev/null中。
/dev/null代表linux的空设备⽂件,所有往这个⽂件⾥⾯写⼊的内容都会丢失,俗称“⿊洞”。
那么执⾏了>/dev/null之后,标准输出就会不再存在,没有任何地⽅能够找到输出的内容。
3. 2>&1这条命令⽤到了重定向绑定,采⽤&可以将两个输出绑定在⼀起。
这条命令的作⽤是错误输出将和标准输出同⽤⼀个⽂件描述符,说⼈话就是错误输出将会和标准输出输出到同⼀个地⽅。
linux在执⾏shell命令之前,就会确定好所有的输⼊输出位置,并且从左到右依次执⾏重定向的命令,所以>/dev/null 2>&1的作⽤就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重⽤了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。
执⾏了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到⽂件中。
常用shell脚本命令1、显示包含文字aaa的下一行的内容:sed -n '/aaa/{n;p;}' filename2、删除当前行与下一行的内容:sed -i '/aaa/{N;d;}' filename3、删除当前行与下两行的内容:sed -i '/aaa/{N;N;d;}' filename依次类推,删除三行,则为{N;N;N;d;},分析知:N为next4、得出以空格为分割的字符串中单词的个数,即统计个数:awk ' { print NF } '如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f则执行 echo $VALUE | awk ' { print NF } ' 后的结果为65、在linux中建立一个文件与另一文件的链接,即符号链接ln -s /var/named/chroot/etc/named.conf named.conf这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf 的符号链接。
即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf ,这时用ll命令查看的结果如:lrwxrwxrwx 1 root root 32 Mar 22 12:29 named.conf ->/var/named/chroot/etc/named.conf注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。
所以需对实际文件进行删除操作。
6、显示指定字符范围内的内容:如:显示文件test.txt中字符#test begin与#test end之间所有的字符sed -n "/#test begin/,/#test end/p" test.txt或 awk "/#test begin/,/#test end/" test.txt在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.1. 单引号和双引号的区别单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。
shell脚本100例、练习使⽤1、编写hello world脚本#!/bin/bashecho"hello world"2、通过位置变量创建linux系统账户和密码#!/bin/bash#$1是执⾏脚本第⼀个参数 $2是执⾏脚本第⼆个参数useradd "$1"echo"$2" | passwd --stdin "$1"#测试脚本[root@template-host sh1]# sh2.sh aaa 123Changing password for user aaa.passwd: all authentication tokens updated successfully.#测试登录[root@template-host sh1]# su - aaa[aaa@template-host ~]$3、每周五使⽤tar命令备份 /var/log下的所有⽇志⽂件#!/bin/bashtar -czPf log-`date +%y%m%d`.tar.gz /var/log #加P是因为如果不加会出现错误:tar: Removing leading `/' from member names date和+之间注意有空格。
修改系统参数[root@template-host sh1]# crontab -e00 03 * * 5 /data/sh1/3.sh4、⼀键部署LNMP(RPM包版本)#!/bin/bash#此脚本需要提前配置yum源,否则⽆法配置成功。
本脚本使⽤于7.4yum -y install httpdyum -y install mariadb mariadb-devel mariadb-serveryum -y install php php-mysqlsystemctl start httpd mariadb #启动httpd、mariadbsystemctl enable httpd mariadb #加⼊开机⾃启动systemctl status httpd mariadb #查看是否成功5、实时监控本机硬盘内存剩余空间,剩余内存空间⼩于500M,根分区剩余空间⼩于1000M时,发送警报信息到命令⾏#!bin/bash#提取分区剩余空间单位:kbdisk_size=$(df / | awk'/\//{print $4}')#提取内存空间单位Mmem_size=$(free -m | awk'/Mem/{print $4}')while :doif [ $disk_size -le 512000 -o $mem_size -le 1024 ];thenecho"警报:资源不⾜"sleep5fidone6、随机⽣成⼀个100以内的随机数,提⽰⽤户猜数字,提⽰⽤户猜⼤了、猜⼩了、猜对了,直⾄⽤户猜对,脚本结束。
5个实⽤的shell脚本⾯试题和答案这边提到的5个⾯试问题,延续之前的有关Linux⾯试问题和答案。
如果你是Tecmint的读者,你的⽀持我⾮常感谢。
1. 写⼀个shell脚本来得到当前的⽇期,时间,⽤户名和当前⼯作⽬录。
答案 : 输出⽤户名,当前⽇期和时间,以及当前⼯作⽬录的命令就是logname,date,who i am和pwd。
现在,创建⼀个名为userstats.sh⽂件,将下⾯的代码添加到它。
复制代码代码如下:#!/bin/bashecho "Hello, $LOGNAME"echo "Current date is `date`"echo "User is `who i am`"echo "Current directory `pwd`"给它添加执⾏权限,并且执⾏他。
复制代码代码如下:# chmod 755 userstats.sh# ./userstats.sh样例输出复制代码代码如下:Hello, aviCurrent date is Sat Jun 7 13:05:29 IST 2014User is avi pts/0 2014-06-07 11:59 (:0)Current directory /home/avi/Desktop2.写⼀个shell脚本,进⾏两个数字的相加,如果没有输⼊参数就输出错误信息和⼀⾏使⽤说明答案 : 下⾯是简单的shell脚本以及描述,如果没有命令⾏参数,它会抛出错误与如何使⽤脚本的说明。
再创建⼀个名为twonumbers.sh⽂件和下⾯的内容添加到⽂件⾥。
复制代码代码如下:#!/bin/bash# The Shebangif [ $# -ne 2 ]# If two Inputs are not received from Standard Inputthen# then execute the below statementsecho "Usage - $0 x y"# print on standard output, how-to use the script (Usage - ./1.sh x y )echo " Where x and y are two nos for which I will print sum"# print on standard output, “Where x and y are two nos for which I will print sum ”exit 1# Leave shell in Error Stage and before the task was successfully carried out.fi# End of the if Statement.echo "Sum of $1 and $2 is `expr $1 + $2`"# If the above condition was false and user Entered two numbers as a command Line Argument,it will show the sum of the entered numbers.给他添加可执⾏权限,并且执⾏。
shell脚本介绍以及常⽤命令Shell脚本Shell Script,Shell与Windows/Dos下的相似,也就是⽤各类命令预先放⼊到⼀个⽂件中,⽅便⼀次性执⾏的⼀个,主要是⽅便进⾏设置或者管理⽤的。
但是它⽐Windows下的批处理更强⼤,⽐⽤其他编程的程序效率更⾼,毕竟它使⽤了Linux/Unix下的命令。
换⼀种说法也就是,shell script是利⽤shell的功能所写的⼀个程序,这个程序是使⽤,将⼀些shell的语法与指令写在⾥⾯,然后⽤正规表⽰法,管线命令以及数据流重导向等功能,以达到我们所想要的处理⽬的shell和shell脚本的区别:shell是什么呢?确切⼀点说,Shell就是⼀个,它的作⽤就是遵循⼀定的语法将输⼊的命令加以解释并传给系统。
它为⽤户提供了⼀个向Linux发送请求以便运⾏程序的接⼝系统级程序,⽤户可以⽤Shell来启动、挂起、停⽌甚3⾄是编写⼀些程序。
Shell本⾝是⼀个⽤C语⾔编写的程序,它是⽤户使⽤Linux的桥梁。
Shell既是⼀种命令语⾔,⼜是⼀种(就是你所说的shell脚本)。
作为命令语⾔,它互动式地解释和执⾏⽤户输⼊的命令;作为程序设计语⾔,它定义了各种和参数,并提供了许多在⾼阶语⾔中才具有的控制结构,包括循环和分⽀。
它虽然不是 Linux系统的⼀部分,但它调⽤了系统内核的⼤部分功能来执⾏程序、创建⽂档并以并⾏的⽅式协调各个程序的运⾏。
交互式shell和⾮交互式shell 交互式模式就是shell等待你的输⼊,并且执⾏你提交的命令。
这种模式被称作交互式是因为shell与⽤户进⾏交互。
这种模式也是⼤多数⽤户⾮常熟悉的:登录、执⾏⼀些命令、签退。
当你签退后,shell也终⽌了。
shell也可以运⾏在另外⼀种模式:⾮交互式模式。
在这种模式下,shell不与你进⾏交互,⽽是读取存放在⽂件中的命令,并且执⾏它们。
当它读到⽂件的结尾,shell也就终⽌了。
shell脚本四种数值计算方式在shell脚本中,可以使用四种不同的计算方式来进行数值计算:表达式求值、命令替换、算术运算和高级数学函数。
1.表达式求值:表达式求值是最简单的一种计算方式,只需要将数学表达式放在$(())中。
例如:```result=$(( 5 + 3 ))echo $result```在这个例子中,表达式求值计算了5 + 3,并将结果赋给变量result。
然后,使用echo命令打印出了结果。
2.命令替换:命令替换是一种在数学计算中使用shell命令的方式。
通过将命令放在$(中,shell会先执行该命令,然后将命令的输出结果作为数值计算的一部分。
例如:```result=$(expr 5 + 3)echo $result```在这个例子中,命令替换使用了expr命令来计算5 + 3的结果,并将结果赋给变量result。
然后,使用echo命令打印出了结果。
3.算术运算:除了使用$(( ))和$(进行计算,shell还提供了一些算术运算符来进行数值计算。
例如:```result=`expr 5 + 3`echo $result```在这个例子中,使用了expr命令和反引号(``)来执行数学计算。
结果与前两种方式相同。
4.高级数学函数:在shell脚本中,可以使用数学函数来执行更复杂的数值计算。
有一些内置的数学函数,如sqrt、sin、cos等,可以通过shell的数学库调用。
例如:```result=$(echo "sqrt(4)" , bc -l)echo $result```在这个例子中,先使用echo命令将数学表达式"sqrt(4)"输出给bc 命令,bc命令会执行计算并将结果输出。
然后,命令替换将结果赋给变量result,并使用echo命令打印出了结果。
总结:以上是四种常用的shell脚本中进行数值计算的方式。
表达式求值、命令替换和算术运算是最常见的方式,适合于简单的数学计算。
linux shell详解Linux Shell 是一种运行在 Linux 操作系统上的命令行解释器,它提供了一种与系统进行交互的方式。
本文将详细介绍Linux Shell 的相关知识,包括 Shell 的基本概念、常用命令以及一些实用技巧。
## 一、Shell 的基本概念Shell 是用户与操作系统内核之间的接口,它接收用户输入的命令,并将其转发给内核执行。
在Linux 中,常见的Shell 有Bash (Bourne Again Shell)、Csh(C Shell)等。
Bash 是最常用的Shell,也是默认的 Shell。
Shell 的主要功能包括命令解析与执行、环境控制、脚本编程等。
用户可以通过Shell 提供的命令来执行文件操作、进程管理、权限控制等操作。
## 二、常用 Shell 命令1. 目录操作命令:- `ls`:列出当前目录下的文件和子目录。
- `cd`:切换当前工作目录。
- `pwd`:显示当前工作目录的路径。
2. 文件操作命令:- `cp`:复制文件或目录。
- `mv`:移动文件或目录。
- `rm`:删除文件或目录。
- `cat`:查看文件内容。
3. 进程管理命令:- `ps`:显示当前正在运行的进程。
- `top`:实时显示进程状态。
- `kill`:终止指定进程。
4. 网络命令:- `ping`:测试与指定主机的连通性。
- `ifconfig`:查看和配置网络接口信息。
- `ssh`:远程登录到其他主机。
5. 权限管理命令:- `chmod`:修改文件或目录的权限。
- `chown`:修改文件或目录的所有者。
- `chgrp`:修改文件或目录的所属组。
## 三、Shell 脚本编程Shell 脚本是一种可以用来编写一系列命令的脚本文件,它可以实现自动化任务的目的。
Shell 脚本通常以 `.sh` 作为文件后缀名。
以下是一个简单的Shell 脚本示例,用于统计指定目录下文件的数量:```shell#!/bin/bashdir_path="/path/to/directory"file_count=0# 遍历目录下的文件for file in $(ls $dir_path)doif [ -f $dir_path/$file ]; then((file_count++))fidoneecho "文件数量:$file_count"```以上脚本中,使用了 `for` 循环遍历目录下的文件,并通过判断是否是普通文件来统计文件数量。
Shell脚本实现Linux系统定时任务调度一、介绍在Linux系统中,为了实现自动化任务调度,我们可以使用Shell脚本来编写定时任务。
Shell脚本是一种逐行解释执行的脚本语言,结合Linux系统提供的定时任务调度器,可以实现多种任务的定时执行。
二、Shell脚本基础1. Shell脚本的创建与执行Shell脚本文件以.sh为后缀,可以使用任意文本编辑器创建和编辑。
为了执行Shell脚本,首先需要给脚本文件添加可执行权限,使用chmod命令进行修改,如下所示:```chmod +x script.sh```然后,可以使用以下命令执行Shell脚本:```./script.sh```2. Shell脚本的语法Shell脚本的语法基本与Bash Shell相同,可以使用条件语句、循环语句、函数等实现复杂的逻辑。
下面是一个简单的示例:```#!/bin/bash# 打印当前系统时间echo "当前时间为:"date```以上示例使用了echo命令打印输出,并通过date命令获取系统当前时间。
三、定时任务调度器Linux系统提供了多种定时任务调度器,常用的有cron和at。
1. croncron是Linux系统上常用的定时任务调度器,它可以按照用户指定的时间间隔周期性地执行任务。
cron将定时任务的信息存储在一个称为crontab的表中,用户可以编辑、查询和删除任务。
2. atat是另一个常用的定时任务调度器,它允许用户在一次性的任务中指定一个具体的执行时间。
at的任务调度信息会被存储在一个队列中,系统将在指定的时间执行任务。
四、Shell脚本实现定时任务调度1. 使用cron调度任务使用cron调度任务需要编辑crontab表。
可以使用以下命令编辑当前用户的crontab表:```crontab -e```然后,在打开的编辑器中添加任务的调度信息。
例如,为每天的上午10点执行一个任务,可以添加以下行:```0 10 * * * /path/to/script.sh```其中,0 10 * * * 表示每天的10点执行任务,/path/to/script.sh为需要执行的Shell脚本的路径。
使用shell脚本进行系统性能调优和优化随着数据量的不断增加和业务的迅猛发展,系统性能调优和优化变得越来越重要。
在Linux系统中,Shell脚本是一种强大的工具,可以帮助我们自动化地进行性能优化。
本文将介绍如何使用Shell脚本进行系统性能调优和优化。
一、监控系统性能在进行性能调优和优化之前,我们需要先了解系统的当前性能状况。
Shell脚本可以帮助我们监控系统的各项指标,从而找出性能瓶颈所在。
下面是一些常用的监控指标及对应的Shell脚本命令:1. CPU利用率可以使用命令"top"来查看系统的实时CPU利用率。
如果需要将实时数据保存到文件中,可以使用以下脚本命令:```#!/bin/bashtop -b -n 1 | grep "Cpu(s)" >> cpu.txt```2. 内存利用率使用命令"free"可以查看系统的内存利用率。
以下是一个示例脚本命令,将内存利用率保存到文件中:```#!/bin/bashfree -h | grep "Mem" >> memory.txt```3. 磁盘利用率使用命令"df"可以查看系统的磁盘利用率。
以下是一个示例脚本命令,将磁盘利用率保存到文件中:```#!/bin/bashdf -h | grep "/dev/sda1" >> disk.txt```通过监控这些关键指标,我们可以获得系统当前的性能状况,为后续的优化工作提供依据。
二、分析系统性能瓶颈通过监控系统的性能指标,我们可以找到系统的性能瓶颈所在。
接下来,我们需要使用Shell脚本来分析性能瓶颈的原因,从而有针对性地进行优化。
1. CPU性能瓶颈分析在分析CPU性能瓶颈时,可以使用命令"top"来查看系统中消耗CPU资源最多的进程。
在macOS终端中执行批量任务的脚本命令在日常的工作中,我们经常需要执行一些重复性的任务,而这些任务可能需要在终端中一个一个地输入指令,非常繁琐。
为了提高工作效率,我们可以使用脚本命令来批量执行这些任务。
在macOS终端中,我们可以使用Shell脚本来进行批量任务的执行。
Shell是一种命令行解释器,常见的有Bash、Zsh等。
下面,我将介绍一些常用的Shell脚本命令来实现批量任务的执行。
1. 批量创建文件夹有时候,我们需要在某个目录下批量创建多个文件夹。
使用Shell脚本可以轻松实现这一功能。
打开终端,输入以下命令:```shell#!/bin/bashfor i in {1..10}domkdir "folder$i"done```在终端中执行上述命令后,就会在当前目录下创建10个文件夹,其名称分别为"folder1"、"folder2"、"folder3"等等。
2. 批量重命名文件有时候,我们需要对某个目录下的多个文件进行批量重命名。
使用Shell脚本可以很方便地实现这一功能。
打开终端,输入以下命令:```shell#!/bin/bashfor file in *domv "$file" "new_$file"done```在终端中执行上述命令后,目录下的所有文件将会被重命名为"new_文件名"的格式。
3. 批量执行命令有时候,我们需要在终端中执行多个命令,而且这些命令需要按照一定的顺序进行执行。
使用Shell脚本可以很容易地实现这一功能。
打开终端,输入以下命令:```shell#!/bin/bashecho "执行命令1"command1echo "执行命令2"command2echo "执行命令3"command3```在终端中执行上述命令后,命令1、命令2和命令3将会按照给定的顺序被执行。
shell脚本实战-while循环语句⽬录前⾔while 的使⽤案例1. 循环输出1-10的数字2. 使⽤while读⽂件并打印⽂件内容3. 输出两数相乘的效果(如下图)总结前⾔上⽂我们讨论了for循环的使⽤,在有限循环⾥,我们使⽤for循环是很⽅便的⼀件事情,今天我们来探讨下while循环while循环语句的语法分析语法格式⼀:while [条件]do操作done语法格式⼆:while read linedo操作done < file通过read命令每次读取⼀⾏⽂件,⽂件内容有多少⾏,while循环多少次注意:只有表达式为真,do和done之间的语句才会执⾏,表达式为假时,结束循环(即条件成⽴就⼀直执⾏循环)例如:while true ;doecho 'helloword'donewhile 的使⽤案例1. 循环输出1-10的数字#!/bin/bashnum=1while [ $num -le 10 ]doecho $numnum=$(( $num + 1 ))done2. 使⽤while读⽂件并打印⽂件内容⽤法⼀:while read linedoecho $linedone <./a.txt⽤法⼆:cat ./a.txt|while read linedoecho $linedonefor实现的读取⽂件并着⾏打印#!/bin/bashcontent=$(cat ./a.txt)for i in $contentdoecho $idone3. 输出两数相乘的效果(如下图)此处感谢 @⼀只⼩⼩⽩⼂的建议,因为⼤多数⼈看到等号就会想到两边相等,这符合我们的教育习惯。
如果要实现图中效果可以按照如下⽅式做:#!/bin/bashnum=1while [ $num -lt 10 ]dosum=$(( $num * $num))echo "$num * $num = $num"((num++))done当然⼤多数⼈习惯了让等式两边必须相等,不相等看上去别扭,这也是义务教育的结果,也可以稍微改⼀下:#!/bin/bashnum=1while [ $num -lt 10 ]dosum=$(( $num * $num))echo "$num * $num = $sum"((num++))done这样输出的结果符合⼤多数⼈的数学习惯:创建指定⽂件⾥的⽤户指定⽂件 name.txt ⾥⾯包含 zhangsan lisi wangwuname.txt 如下:[root@ecs-c13b ~]# cat name.txtzhangsanlisiwangwu从name.txt⾥⾯遍历⽤户名并创建⽤户#!/bin/bashfor name in `cat /root/name.txt`#for name in $(cat /root/a.txt)doid $name &> /dev/nullif [ $? -ne 0 ];thenuseradd $nameecho "123456" |passwd --stdin $name &> /dev/nullecho "user $name created"elseecho "user $name is exist"fidone总结到⽬前为⽌,for-while-if-case,这四个常⽤的控制语句我们都已经探讨过了,接下来就是⼤量练习和综合应⽤的时候,操练起来把。
shell脚本Shell什么是shell脚本实际上就是⼀些命令的集合shell脚本的创建和执⾏# cd /usr/local/sbin/# sh first.sh //执⾏脚本另外⼀种执⾏⽅法# ./first.sh# chmod +x first.sh //修改权限使⽤sh命令执⾏⼀个shell脚本时,可以加-x选项来查看这个脚本的执⾏过程,这样有利于我们调试这个脚本date⽤法date +%Y :表⽰以四位数字格式打印年份date +%y :表⽰以两位数字格式打印年份date +%m :表⽰⽉份date +%d :表⽰⽇期date +%H :表⽰⼩时date +%M :表⽰分钟date +%S :表⽰秒date +%w :表⽰星期。
结果显⽰0则表⽰周⽇“以四位数字格式打印年份-⽉份-⽇期⼩时:分钟:秒”//前⼀天的⽇期//前⼀⼩时//前⼀分钟Shell脚本中的变量定义变量的格式为:”变量名=变量的值”。
⽤来解决命令或路径修改。
在脚本中引⽤变量时需要加上符号¥。
本例中使⽤到了反引号。
它的作⽤是将引号中的字符串当成shell命令执⾏,返回命令的执⾏结果。
d和d1在脚本中作为变量出现。
查看该脚本的执⾏结果数学计算vi sum.sh//数学计算要⽤[]括起来,并且前⾯要加符号¥。
和⽤户交互# vi read.sh执⾏过程加上-x选项,再看看这个执⾏过程Shell脚本预设变量有时我们会⽤到类似/etc/init.d/iptables restart的命令,前⾯的/etc/init.d/iptables⽂件其实就是个shell脚本。
脚本后⾯为什么可以跟⼀个restart 字符串呢?这就涉及shell脚本的预设变量了。
Shell脚本在执⾏时,后⾯可以跟⼀个或者多个参数# vi option.sh执⾏结果¥1和¥2的值就是在执⾏时分别输⼊的1和2,¥1就是脚本的第⼀个参数,¥2是第⼆个参数。
⼀个shell脚本的预设变量是没有限制的。
如何用脚本实现分割文件#!/bin/bashif [ $# -ne 2 ]; thenecho 'Usage: split file size(in bytes)'exitfifile=$1size=$2if [ ! -f $file ]; thenecho "$file doesn't exist"exitfi#TODO: test if $size is a valid integerfilesize=`/bin/ls -l $file | awk '{print $5}'`echo filesize: $filesizelet pieces=$filesize/$sizelet remain=$filesize-$pieces*$sizeif [ $remain -gt 0 ]; thenlet pieces=$pieces+1fiecho pieces: $piecesi=0while [ $i -lt $pieces ];doecho split: $file.$i:dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1doneecho "#!/bin/bash" >; mergeecho "i=0" >;>; mergeecho "while [ $i -lt $pieces ];" >;>; mergeecho "do" >;>; mergeecho " echo merge: $file.$i" >;>; mergeecho " if [ ! -f $file.$i ]; then" >;>; mergeecho " echo merge: $file.$i missed" >;>; mergeecho " exit" >;>; mergeecho " fi" >;>; mergeecho " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >;>; mergeecho " let i=$i+1" >;>; mergeecho "done" >;>; mergechmod u+x merge'如何查找日期为某一天的文件#!/bin/sh# The right of usage, distribution and modification is here by granted by the author.# The author deny any responsibilities and liabilities related to the code. #OK=0A=`find $1 -print`if expr $3 == 1 >;/dev/null ; then M=Jan ; OK=1 ; fiif expr $3 == 2 >;/dev/null ; then M=Feb ; OK=1 ; fiif expr $3 == 3 >;/dev/null ; then M=Mar ; OK=1 ; fiif expr $3 == 4 >;/dev/null ; then M=Apr ; OK=1 ; fiif expr $3 == 5 >;/dev/null ; then M=May ; OK=1 ; fiif expr $3 == 6 >;/dev/null ; then M=Jun ; OK=1 ; fiif expr $3 == 7 >;/dev/null ; then M=Jul ; OK=1 ; fiif expr $3 == 8 >;/dev/null ; then M=Aug ; OK=1 ; fiif expr $3 == 9 >;/dev/null ; then M=Sep ; OK=1 ; fiif expr $3 == 10 >;/dev/null ; then M=Oct ; OK=1 ; fiif expr $3 == 11 >;/dev/null ; then M=Nov ; OK=1 ; fiif expr $3 == 12 >;/dev/null ; then M=Dec ; OK=1 ; fiif expr $3 == 1 >;/dev/null ; then M=Jan ; OK=1 ; fiif expr $OK == 1 >; /dev/null ; thenls -l --full-time $A 2>;/dev/null | grep "$M $4" | grep $2 ;elseecho Usage: $0 path Year Month Day;echo Example: $0 ~ 1998 6 30;fi如何计算当前目录下的文件数和目录数# ls -l * |grep "^-"|wc -l ---- to count files# ls -l * |grep "^d"|wc -l ----- to count dir如何只列子目录?ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)如何实现取出文件中特定的行内容如果你只想看文件的前5行,可以使用head命令,如: head -5 /etc/passwd如果你想查看文件的后10行,可以使用tail命令,你知道怎么查看文件中间一段吗?你可以使用sed命令如: sed -n '5,10p' /etc/passwd 这样你就可以只查看文件的第5行到第10行。
如何查找含特定字符串的文件例如查找当前目录下含有"the string you want find..."字符串的文件:$find . -type f -exec grep “the string you want find...” {} ; -print如何列出目录树下面的短小的shell程序可以列出目录树, 充分利用了sed强大的模式匹配能力.目录树形式如下:.`----shellp`----updates`----wu-ftpd-2.4| `----doc| | `----examples| `----src| | `----config| | `----makefiles| `----support| | `----makefiles| | `----man| `----util脚本如下:#!/bin/sh# dtree: Usage: dtree [any directory]dir=${1:-.}(cd $dir; pwd)find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e"s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g"如何实现取出文件中特定的列内容我们经常会遇到需要取出分字段的文件的某些特定字段,例如/etc/password就是通过“:”分隔各个字段的。
可以通过cut命令来实现。
例如,我们希望将系统账号名保存到特定的文件,就可以:cut -d: -f 1 /etc/passwd >; /tmp/users-d用来定义分隔符,默认为tab键,-f表示需要取得哪个字段。
当然也可以通过cut取得文件中每行中特定的几个字符,例如:cut -c3-5 /etc/passwd就是输出/etc/passwd文件中每行的第三到第五个字符。
-c 和-f 参数可以跟以下子参数:N 第N个字符或字段N- 从第一个字符或字段到文件结束N-M 从第N个到第M个字符或字段-M 从第一个到第N个字符或字段在vim中实现批量加密============================================================#!/bin/bash# Encrypt file with vimif (test $# -lt 2) thenecho Usage: decrypt password filenameelsevim -e -s -c ":set key=$1" -c ':wq' $2echo "$2 encrypted."fi============================================================[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; donetest2.txt encrypted.test4.txt encrypted.test9.txt encrypted.kick.txt encrypted.echo "$2 encrypted."fi[weeder@SMTH weeder]$ for file in *.txt ; do encrypt test $file ; donetest2.txt encrypted.test4.txt encrypted.test9.txt encrypted.kick.txt encrypted.too_old.txt encrypted.too_old_again.txt encrypted.bg5.txt encrypted.[weeder@SMTH weeder]$$@等特定shell变量的含义在shell脚本的实际编写中,有一些特殊的变量十分有用:$# 传递到脚本的参数个数$* 以一个单字符串显示所有向脚本传递的参数。