Shell 经典实例

合集下载

shell循环详解及实例

shell循环详解及实例

shell循环详解及实例⼀、条件选择、判断(if、case)1.1 if语句⽤法及实例当我们在脚本中遇到需要判断的时候,我们就可以⽤if语句来实现。

具体的语法如下:单分⽀if 判断条件;then 条件为真的分⽀代码 fi双分⽀if 判断条件; then条件为真的分⽀代码else条件为假的分⽀代码fi多分⽀if 判断条件1; then条件为真的分⽀代码elif 判断条件2; then条件为真的分⽀代码elif 判断条件3; then条件为真的分⽀代码else以上条件都为假的分⽀代码fi在多分⽀中,系统会逐条判断你写⼊的条件,第⼀次遇到“真”条件时,执⾏该分⽀,⽽后结束整个if语句。

注意:1、if和fi是成对出现的2、if语句可以嵌套。

Example:1)判断两个数字的⼤⼩1 #!/bin/bash2 #定义变量3 read -p "Please input the first num:" num14 read -p "Please input the second num:" num25 #判断数字是否符合标准6 if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then7 # 判断两个数字的⼤⼩并输出判断结果8 if [ $num1 -lt $num2 ];then9 echo "The num2 is biger than the num1"10 elif [ $num1 -eq $num2 ];then11 echo "Two numbers equal"12 else13 echo "The num1 is biger than the num2"14 fi15 else16 echo "Please enter the correct number"17 fi1819 #删除变量20 unset num1 num22)编写脚本/root/bin/createuser.sh,实现如下功能:使⽤⼀个⽤户名做为参数,如果指定参数的⽤户存在,就显⽰其存在,否则添加之;显⽰添加的⽤户的id号等信息1 #!/bin/bash2 #定义变量3 read -p "请输⼊⼀个⽤户名:" name4 #判断⽤户名是否存在5 if `id $name &> /dev/null`;then6 # 若存在,则输出ID等信息7 echo "⽤户存在,⽤户的ID信息为:`id $name`"8 else9 # 若不存在,则添加⽤户,设置密码为随机8位,下次登录时提⽰修改密码,同时显⽰ID等信息10 passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`11 `useradd $name &> /dev/null`12 `echo "$passwd" | passwd --stdin $name &> /dev/null`13 echo "⽤户名:$name 密码: $passwd" >> user.txt14 `chage -d 0 $name`15 echo "⽤户已添加,⽤户的ID信息为:`id $name` 密码为:$passwd"16 fi1718 #删除变量19 unset name passwd1.2 case⽤法及实例当涉及到多个条件匹配的时候,我们⽤if可能就很⿇烦了,这个时候,我们就可以⽤case来编写这个脚本。

经典shell 脚本实例

经典shell 脚本实例

fi
done
#!/bin/bash
if [ $# -le 0 ]
then
echo "Not enough parameters"
exit 1
fi
#string="2 3 4 5 6"
#set string
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。#!/bin/sh
unset var
while [ "$var" != "end" ]
do
echo -n "please input a number: "
ቤተ መጻሕፍቲ ባይዱ
read var
if [ "$var" = "end" ]
then
break
fi
Linux shell 脚本实例
1. 写一个脚本,利用循环计算 10 的阶乘#!/bin/sh
factorial=1
for a in `seq 1 10`
do
factorial=`expr $factorial \* $a`
done
echo "10! = $factorial"
2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打
esac done #! /bin/sh a=10 b=20 c=30 value1=`expr $a + $b + $c` echo "The value of value1 is $value1" value2=`expr $c / $b` echo "The value of value2 is $value2" value3=`expr $c * $b` echo "The value of value3 is $value3" value4=`expr $a + $c / $b` echo "The value of value4 is $value4" var4=`expr $value4 - $value2` echo $var4

反弹shell的操作例题

反弹shell的操作例题

反弹shell的操作例题
反弹shell是一种网络攻击技术,其中攻击者通过在目标系统上执行恶意代码来获取shell访问权限。

下面是一个反弹shell的示例:假设攻击者想要通过XSS漏洞在目标网站上执行恶意代码来获取shell访问权限。

攻击者可以在网站上找到一个可以插入恶意代码的输入字段,例如评论框或表单提交字段。

攻击者可以将恶意代码嵌入到该字段中,并提交表单或进行其他操作来触发该代码的执行。

当用户访问该网站并触发恶意代码时,代码会在用户的浏览器上执行。

攻击者可以通过在代码中包含恶意URL来执行反弹shell操作。

该URL指向攻击者的服务器,并由攻击者控制。

当恶意代码执行时,它会向攻击者的服务器发送一个HTTP请求,并将目标系统的控制权交还给攻击者。

攻击者可以通过在服务器上执行任意命令来控制目标系统。

这样,攻击者就可以利用反弹shell技术对目标系统进行任意操作,包括窃取数据、安装恶意软件或进行其他破坏活动。

需要注意的是,反弹shell技术是一种非常危险的网络攻击技术,可能会对目标系统造成严重的损害。

因此,强烈建议采取安全措施来保护系统免受此类攻击的影响,例如修复已知的安全漏洞、实施访问控制和防火墙规则、使用安全的编码实践等。

Shell脚本编写高级技巧使用循环结构处理多个文件

Shell脚本编写高级技巧使用循环结构处理多个文件

Shell脚本编写高级技巧使用循环结构处理多个文件Shell脚本是一种命令行解释器,它可以运行包含一系列命令的脚本文件。

在Shell脚本编写过程中,循环结构是非常重要的一个概念。

使用循环结构,我们可以有效地处理多个文件。

本文将介绍一些Shell脚本编写的高级技巧,来使用循环结构处理多个文件。

一、批量重命名文件在某些情况下,我们需要对多个文件进行批量重命名操作。

使用Shell脚本可以很方便地实现这个功能。

下面是一个示例代码,来演示如何批量重命名以.txt结尾的文件为以.bak结尾:```#!/bin/bashfor file in *.txtdomv "$file" "${file%.*}.bak"done```在这个脚本中,首先使用`for`循环遍历所有以.txt结尾的文件。

然后使用`mv`命令将文件重命名为以.bak结尾的文件。

二、批量复制文件有时候我们需要将一个目录下的文件复制到另一个目录,使用Shell 脚本编写可以很方便地实现这个功能。

下面是一个示例代码,来演示如何将一个目录下的所有文件复制到另一个目录:```#!/bin/bashsource_dir="/path/to/source/dir"target_dir="/path/to/target/dir"for file in $source_dir/*docp "$file" "$target_dir"done```在这个脚本中,首先通过变量`source_dir`指定源目录,通过变量`target_dir`指定目标目录。

然后使用`for`循环遍历所有源目录下的文件,并使用`cp`命令将文件复制到目标目录。

三、批量处理文件中的内容有时候我们需要对多个文件中的内容进行批量处理,使用Shell脚本编写可以很方便地实现这个功能。

shell脚本100例、练习使用

shell脚本100例、练习使用

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以内的随机数,提⽰⽤户猜数字,提⽰⽤户猜⼤了、猜⼩了、猜对了,直⾄⽤户猜对,脚本结束。

shell代码示例

shell代码示例

SHELL分支示例1、if语句x=5if [ $x = 5 ]; thenecho "x equals 5."elseecho "x does not equal 5."fi2、文件表达式#!/bin/bash# test-file: Evaluate the status of a fileFILE=~/.bashrcif [ -e "$FILE" ]; thenif [ -f "$FILE" ]; thenecho "$FILE is a regular file."fiif [ -d "$FILE" ]; thenecho "$FILE is a directory."fiif [ -r "$FILE" ]; thenecho "$FILE is readable."fiif [ -w "$FILE" ]; thenecho "$FILE is writable."fiif [ -x "$FILE" ]; thenecho "$FILE is executable/searchable."fielseecho "$FILE does not exist"exit 1fiexit3、字符串表达式#!/bin/bash# test-file: Evaluate the value of a string ANSWER=yesif test -z "$ANSWER" ; thenecho "There is no answer." >&2exit 1fiif test "$ANSWER" = "yes" ; thenecho "The answer is YES."elif test "$ANSWER" = "no" ; thenecho "The answer is NO."elif test "$ANSWER" = "maybe" ; thenecho "The answer is MAYBE."elseecho "The answer is UNKNOWN."fi4、整数表达式#!/bin/bash# test-integer: Evaluate the value of an integer. INT=-5if [ -z "$INT" ]; thenecho "INT is empty." >&2exit 1fiif [ $INT -eq 0 ]; thenecho "INT is zero."elseif [ $INT -lt 0 ]; thenecho "INT is negative."elseecho "INT is positive."fiif [ $((INT % 2)) -eq 0 ]; thenecho "INT is even."elseecho "INT is odd."fi5、更现代的test命令版本#!/bin/bash# test-integer2: Evaluate the value of an integer. INT=-5if [[ "$INT" =~ ^-?[0-9]+$ ]]; thenif [ $INT -eq 0 ]; thenecho "INT is zero."elseif [ $INT -lt 0 ]; thenecho "INT is negative."elseecho "INT is positive."fiif [ $((INT % 2)) -eq 0 ]; thenecho "INT is even."elseecho "INT is odd."fifielseecho "INT is not an integer." >&2exit 1fi6、为整数设计的(())命令#!/bin/bash# test-integer2a: Evaluate the value of an integer. INT=10if [[ "$INT" =~ ^-?[0-9]+$ ]]; thenif ((INT == 0 )); thenecho "INT is zero."elseif ((INT < 0 )); thenecho "INT is negative."elseecho "INT is positive."fiif (( ((INT % 2 )) == 0 )); thenecho "INT is even."elseecho "INT is odd."fifielseecho "INT is not an integer." >&2exit 1fi7、read语句输入一个值#!/bin/bash# read-integer: Evaluate the value of an integer.echo -n "Please enter an integer -> "read intif [[ "$int" =~ ^-?[0-9]+$ ]]; thenif [ $int -eq 0 ]; thenecho "int is zero."elseif [ $int lt 0 ]; thenecho "$int is negative."elseecho "$int is positive."fiif [ $((int % 2 )) -eq 0 ]; thenecho "$int is even."elseecho "$int is odd."fifielseecho "Input value is not an integer." >&2exit 1fi8、read语句输入多个值#!/bin/bash# read-multiple: read multiple values from keyboardecho -n "Enter one or more values > "read var1 var2 var3 var4 var5echo "var1 = '$var1'"echo "var2 = '$var2'"echo "var3 = '$var3'"echo "var4 = '$var4'"echo "var5 = '$var5'"9、read命令选项-t seconds:超时。

shell {}用法

shell {}用法

shell {}用法
在 shell 脚本中,`{}`有两种主要用法:命令分组和变量替换。

1. 命令分组:
使用`{}`可以将多个命令组合在一起,形成一个命令块。

这在需要执行一系列相关命令时非常有用。

例如:
```bash
{
command1
command2
command3
}
```
可以将上述命令块视为一个整体来执行。

2. 变量替换:
在`{}`内可以使用变量进行替换。

例如,假设有一个变量`$var`,其值为"value",可以这样使用它:
```bash
echo "The variable's value is: ${var}"
```
在上述示例中,`${var}`会被替换为变量`$var`的值。

另外,`{}`还可以用于其他一些特殊用途,如在条件语句中表示命令块(如`if`语句),或在函数定义中表示函数体等。

需要注意的是,具体的用法可能因不同的 shell 脚本语言而略有差异。

上述示例主要适用于常见的 Bash shell。

在使用`{}`时,应根据具体情况和需求进行适当的命令分组或变量替换。

如果你有特定的`{}`用法问题或需要更详细的帮助,请提供更多上下文信息,我将尽力提供更准确的回答。

dolphinscheduler shell使用实例

dolphinscheduler shell使用实例

dolphinscheduler shell使用实例DolphinScheduler是一个分布式的、易用的Big Data工作流调度系统,它能够帮助我们高效地管理和监控复杂的工作流任务。

其中shell任务是DolphinScheduler中常见的一个类型,今天我将会介绍关于使用DolphinScheduler的shell任务的一些实例。

在DolphinScheduler中,shell任务是指通过执行Shell脚本来完成某些自定义的任务。

它可以被用于各种用途,例如数据清理、文件处理、数据分析等。

通过结合DolphinScheduler的任务调度和监控功能,我们可以轻松地实现大规模、高效、可靠的任务调度。

下面,我将通过几个实例来介绍DolphinScheduler中shell任务的使用。

1. 数据清理任务假设我们有一个大型的数据仓库,并且每天会有大量的数据产生。

为了保持数据仓库的有效性和性能,我们需要定期清理过期的数据。

通过DolphinScheduler的shell任务,我们可以编写一个Shell脚本,实现自动化的数据清理。

在脚本中,我们可以使用类似Hadoop的命令来删除不需要的数据,比如删除过期的日志文件或清理不再需要的中间结果。

然后,我们可以将这个Shell脚本作为一个任务提交到DolphinScheduler中,设置适当的调度时间,即可实现每天自动清理过期数据的功能。

2. 文件处理任务在实际工作中,经常会遇到需要对大量的文件进行处理的情况。

例如,我们可能需要将多个文件合并成一个文件,或者需要对某个目录下的所有文件进行某种操作。

使用DolphinScheduler的shell任务,我们可以编写一个Shell脚本来完成这些文件处理任务。

在脚本中,我们可以使用Shell提供的各种命令和工具,如cat、grep、sed等,来实现不同的文件处理需求。

然后,我们可以将这个Shell脚本提交到DolphinScheduler中,并设置适当的触发条件,比如某个目录下有新的文件出现时触发任务执行,或者定时触发任务执行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Thizlinux 系统教程 Shell 经典实例----------------Milo经典小shell1 列目录树的shell脚本如下:#!/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"2 while中使用read (file是一个文件)cat file | while read linedoecho $lineecho " :: Please input any key(s):c"str4read=""while truedochr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null`str4read=$str4read$chr4readif [ "$chr4read" = "" ] ;then break; fidoneecho " :: |$str4read|"done3 将多个空格替换为字符sed 's/[ ][ ]*/ /g'如果空格与tab共存时用sed -e 's/[[:space:]][[:space:]]*/ /g' filename4用脚本实现分割文件#!/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 " rm -f $file.merged" >> mergeecho " exit" >> mergeecho " fi" >> mergeecho " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge echo " let i=$i+1" >> mergeecho "done" >> mergechmod u+x merge'5得到上月未日期,格式为YYYYMMDDget_lastday_of_lastmonth(){yy=`date +%Y`mm=`date +%m-1|bc`[ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1`aaa=`cal $mm $yy`dd=`echo $aaa|awk '{print $NF}'`echo $yy$mm$dd}print $NF的$NF是打印最后一个列。

因为awk的内置变量NF是列的总数,而$NF就代表着最后一列6 实现用backup或tar命令来做目录备份需要保持两个目录当中的文件以及属组关系不变。

子目录结构不变,通过管道控制tar和backup命令,不需要中间的archive,(考虑到速度以及空间的关系)(cd /source && tar cf - .) |(cd /dest && tar zxfp -)偶没有 backup 命令,但是 tar 用管道可以,tar -cf - dir1 | ( cd dir2; tar -xvf - )搬移大法more aaa.sh#计算两个日期间有多少天#date1,date2:yyyymmdd#Usage:command date1 date2str=$1yy1=`echo $str|cut -c 1-4`mm1=`echo $str|cut -c 5-6`dd1=`echo $str|cut -c 7-8`str=$2yy2=`echo $str|cut -c 1-4`mm2=`echo $str|cut -c 5-6`dd2=`echo $str|cut -c 7-8`count_day=`expr $dd2 - $dd1`while [ $yy2 -ne $yy1 -o $mm2 -ne $mm1 ]domm2=`expr $mm2 - 1`[ $mm2 -eq 0 ] && mm2=12 && yy2=`expr $yy2 - 1`aaa=`cal $mm2 $yy2`bbb=`echo $aaa|awk '{print $NF}'`count_day=`expr $count_day + $bbb`doneecho $count_day7 编写一个只允许用户执行telnet的shell为了监视用户网络操作行为,指定unxi主机给设备管理员登陆,然后用shell控制他。

只可以使用telnet命令,其他一概不许,包括cd,ls等。

就是一个用来远程登陆的管理平台。

我对shell不熟,请指导。

.profile中加入:read addrtelnet $addrexit8 判断文件的访问权限是不是600ls -l filename | awk '{ if($1 ~ "-rw-------") ..... }'ls -l filename | grep "^-rw------" -c#!/usr/bin/bash#showmod[ $# -eq 0 ] && { echo "Usage: $0 filelist ... "; exit ;} show(){{ [ -d $1 ] && ls -ld $1 ; [ -f $1 ] && ls -la $1 ;} | awk '{ umask=0umask_=""for(i=1;i<length($1);i++){if(substr($1,i+1,1)=="r")umask+=4;if(substr($1,i+1,1)=="w")umask+=2;if(substr($1,i+1,1)=="x")umask+=1;if(i%3==0){umask_=sprintf("%s%d",umask_,umask);umask=0;}}printf("%-20.20s: %-10.10s --> %s ",$9,$1,umask_);}';}for file_dir in $*doshow $file_dirdone9 算青蛙的脚本maxcount=$1;count=1;if [ $# -eq 1 ]thenwhile [ $count -le $maxcount ]do echo $count 只青蛙 $count 张嘴, `expr $count * 2`只眼睛,`expr $count * 4`条腿; count=`expr $count + 1`;done;elseecho "usage: sendos count"fi10 在SHELL程序中实现‘按任意键继续’在写一个SHELL程序,可是遇到了一个难题,在READ接受输入时,必须按回车键才能确认,而我需要只要按一个键就能得到用户的输入,无须按回车键!有什么好办法呢#!/bin/shget_char(){SAVEDSTTY=`stty -g`stty -echostty rawdd if=/dev/tty bs=1 count=1 2> /dev/nullstty -rawstty echostty $SAVEDSTTY}echo "Press any key to continue..."char=`get_char`如果你的机器上不认stty raw那么把函数中两处出现的raw换成cbreak。

11 在linux环境下启动时打开numlock想在系统启动时自动打开NumLock,可以在/etc/rc.d/rc.local中加入以下内容:for t in 1 2 3 4 5 6 7 8dosetleds +num$t>/dev/nulldone12 在shell里如何限制输入的长度举个例子,比如用户输入用户名时只能给他输入8个字符,如果超过了8个字符光标就停止在第八个字符那儿,不继续,一直等待回车只怕要自己来另写一个SHELL了。

相关文档
最新文档