首页 文章 精选 留言 我的

精选列表

搜索[shell],共7518篇文章
优秀的个人博客,低调大师

Shell 脚本进阶,经典用法及其案例

关注「开源Linux」,选择“设为星标”回复「学习」,有我为您特别筛选的学习资料~ 一、条件选择、判断 1、条件选择if (1)用法格式 if判断条件1;then 条件为真的分支代码 elif判断条件2;then 条件为真的分支代码 elif判断条件3;then 条件为真的分支代码 else 以上条件都为假的分支代码 fi 逐条件进行判断,第一次为“真”条件时,执行其分支,而后结束整个if。 (2)经典案例: #判断年纪 #!/bin/bash read-p"Pleaseinputyourage:"age if[[$age=~[^0-9]]];then echo"pleaseinputaint" exit10 elif[$age-ge150];then echo"yourageiswrong" exit20 elif[$age-gt18];then echo"goodgoodwork,daydayup" else echo"goodgoodstudy,daydayup" fi 分析:请输入年纪,先判断输入的是否含有除数字以外的字符,有,就报错;没有,继续判断是否小于150,是否大于18。 #判断分数 #!/bin/bash read-p"Pleaseinputyourscore:"score if[[$score=~[^0-9]]];then echo"pleaseinputaint" exit10 elif[$score-gt100];then echo"Yourscoreiswrong" exit20 elif[$score-ge85];then echo"Yourscoreisverygood" elif[$score-ge60];then echo"Yourscoreissoso" else echo"Youareloser" fi 分析:请输入成绩,先判断输入的是否含有除数字以外的字符,有,就报错;没有,继续判断是否大于100,是否大于85,是否大于60。 2、条件判断 case (1)用法格式 case$namein; PART1) cmd ;; PART2) cmd ;; *) cmd ;; esac 注意:case支持glob风格的通配符: *:任意长度任意字符 ?:任意单个字符 []:指定范围内的任意单个字符 a|b:a或b (2)案例: #判断yesorno #!/bin/bash read-p"Pleaseinputyesorno:"anw case$anwin [yY][eE][sS]|[yY]) echoyes ;; [nN][oO]|[nN]) echono ;; *) echofalse ;; esac 分析:请输入yes or no,回答Y/y、yes各种大小写组合为yes;回答N/n、No各种大小写组合为no。 二、四个循环 1、for (1)用法格式 ①fornamein列表;do 循环体 done ②for((exp1;exp2;exp3));do cmd done exp1只执行一次,相当于在for里嵌了while ③ 执行机制: 依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 列表的表示方法,可以glob 通配符,如{1..10} 、*.sh ;也可以变量引用,如:seq 1 $name (2)案例 #求出(1+2+...+n)的总和 sum=0 read-p"Pleaseinputapositiveinteger:"num if[[$num=~[^0-9]]];then echo"inputerror" elif[[$num-eq0]];then echo"inputerror" else foriin`seq1$num`;do sum=$[$sum+$i] done echo$sum fi unsetzhi 分析:sum初始值为0,请输入一个数,先判断输入的是否含有除数字以外的字符,有,就报错;没有判断是否为0,不为0进入for循环,i的范围为1~输入的数,每次的循环为sum=sum+i,循环结束,最后输出sum的值。 #求出(1+2+...+100)的总和 for((i=1,num=0;i<=100;i++));do [$[i%2]-eq1]&&letsum+=i done echosum=$sum 分析:i=1,num=0;当i<=100,进入循环,若i÷2取余=1,则sum=sum+i,i=i+1。 2、while (1)用法格式 while循环控制条件;do 循环 done 循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true” ,则执行一次循环;直到条件测试状态为“false” 终止循环 (2)特殊用法(遍历文件的每一行): whilereadline;do控制变量初始化 循环体 done</PATH/FROM/SOMEFILE 或cat/PATH/FROM/SOMEFILE|whilereadline;do 循环体 done 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line (3)案例: #100以内所有正奇数之和 sum=0 i=1 while[$i-le100];do if[$[$i%2]-ne0];then letsum+=i leti++ else leti++ fi done echo"sumis$sum" 分析:sum初始值为0,i的初始值为1;请输入一个数,先判断输入的是否含有除数字以外的字符,有,就报错;没有当i<100时,进入循环,判断 i÷2取余 是否不为0,不为0时为奇数,sum=sum+i,i+1,为0,i+1;循环结束,最后输出sum的值。 3、until 循环 (1)用法 unitl循环条件;do 循环 done 进入条件:循环条件为true ;退出条件:循环条件为false;刚好和while相反,所以不常用,用while就行。 (2)案例 #监控xiaoming用户,登录就杀死 untilpgrep-uxiaoming&>/dev/null;do sleep0.5 done pkill-9-uxiaoming 分析:每隔0.5秒扫描,直到发现xiaoming用户登录,杀死这个进程,退出脚本,用于监控用户登录。 4、select 循环与菜单 (1)用法 selectvariableinlist do 循环体命令 done ① select 循环主要用于创建菜单,按数字顺序排列的示菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入 ② 用户输入菜单列表中的某个数字,执行相应的命令 ③ 用户输入被保存在内置变量 REPLY 中 ④ select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 按 命令终止脚本。也可以按 ctrl+c退出循环 ⑤ select 和 经常和 case 联合使用 ⑥ 与for循环类似,可以省略 in list, 此时使用位置参量 (2)案例 #生成菜单,并显示选中的价钱 PS3="Pleasechoosethemenu:" selectmenuinmifanhuimianjiaozibabaozhouquit do case$REPLYin 1|4) echo"thepriceis15" ;; 2|3) echo"thepriceis20" ;; 5) break ;; *) echo"notheoption" esac done 分析:PS3是select的提示符,自动生成菜单,选择5break退出循环。 三、循环里的一些用法 1、循环控制语句 (1)语法 continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层 break [N]:提前结束第N层循环,最内侧为第1层 例:whileCONDTITON1;do CMD1 ifCONDITION2;then continue/break fi CMD2 done (2)案例: #①求(1+3+...+49+53+...+100)的和 #!/bin/bash sum=0 foriin{1..100};do [$i-eq51]&&continue [$[$i%2]-eq1]&&{letsum+=i;leti++;} done echosum=$sum 分析:做1+2+...+100的循环,当i=51时,跳过这次循环,但是继续整个循环,结果为:sum=2449 #②求(1+3+...+49)的和 #!/bin/bash sum=0 foriin{1..100};do [$i-eq51]&&break [$[$i%2]-eq1]&&{letsum+=i;leti++;} done echosum=$sum 分析:做1+2+...+100的循环,当i=51时,跳出整个循环,结果为:sum=625 2、循环控制shift命令 (1)作用 用于将参数列表list左移指定次数,最左端的那个参数就从列表中删除,其后边的参数继续进入循环 (2)案例: #①创建指定的多个用户 #!/binbash if[$#-eq0];then echo"Pleaseinputaarg(eg:`basename$0`arg1)" exit1 else while[-n"$1"];do useradd$1&>/dev/null shift done fi 分析:如果没有输入参数(参数的总数为0),提示错误并退出;反之,进入循环;若第一个参数不为空字符,则创建以第一个参数为名的用户,并移除第一个参数,将紧跟的参数左移作为第一个参数,直到没有第一个参数,退出。 #②打印直角三角形的字符 #!/binbash while(($#>0)) do echo"$*" shift done 3、返回值结果 true永远返回成功结果 :nullcommand,什么也不干,返回成功结果 false永远返回错误结果 创建无限循环 whiletrue;do 循环体 done 4、循环中可并行执行,使脚本运行更快 (1)用法 fornamein列表;do { 循环体 }& done wait (2)实例: #搜寻自己指定ip(子网掩码为24的)的网段中,UP的ip地址 read-p"Pleaseinputnetwork(eg:192.168.0.0):"net echo$net|egrep-o"\ [$?-eq0]||(echo"inputerror";exit10) IP=`echo$net|egrep-o"^([0-9]{1,3}\.){3}"` foriin{1..254};do { ping-c1-w1$IP$i&>/dev/null&&\ echo"$IP$iisup" }& done wait 分析:请输入一个IP地址例192.168.37.234,如果格式不是0.0.0.0 则报错退出;正确则进入循环,IP变量的值为192.168.37. i的范围为1-254,并行ping 192.168.37.1-154,ping通就输出此IP为UP。直到循环结束。 四、信号捕获trap 1、用法格式 trap'触发指令'信号,自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作 trap''信号,忽略信号的操作 trap'-'信号,恢复原信号的操作 trap-p,列出自定义信号操作 信号可以3种表达方法:信号的数字2、全名SIGINT、缩写INT 2、常用信号 1)SIGHUP:无须关闭进程而让其重读配置文件 2)SIGINT:中止正在运行的进程;相当于Ctrl+c 3)SIGQUIT:相当于ctrl+\ 9)SIGKILL:强制杀死正在运行的进程 15)SIGTERM:终止正在运行的进程(默认为15) 18)SIGCONT:继续运行 19)SIGSTOP:后台休眠 9信号,强制杀死,捕获不住 3、案例 #①打印0-9,ctrl+c不能终止 #!/bin/bash trap'echopressctrl+c'2 for((i=0;i<10;i++));do sleep1 echo$i done 分析:i=0,当i<10,每休眠1秒,i+1,捕获2信号,并执行echo press ctrl+c #②打印0-3,ctrl+c不能终止,3之后恢复,能终止 #!/bin/bash trap''2 trap-p for((i=0;i<3;i++));do sleep1 echo$i done trap'-'SIGINT for((i=3;i<10;i++));do sleep1 echo$i done 分析:i=0,当i 五、脚本小知识 1、生成随机字符 cat /dev/urandom #生成8个随机大小写字母或数字 cat/dev/urandom|tr-dc[:alnum:]|head-c8 2、生成随机数 echo $RANDOM 确定范围echo$[RANDOM%7]随机7个数(0-6) echo$[$[RANDOM%7]+31]随机7个数(31-37) 3、echo打印颜色字 echo-e"\033[31malong\033[0m"显示红色along echo-e"\033[1;31malong\033[0m"高亮显示红色along echo-e"\033[41malong\033[0m"显示背景色为红色的along echo-e"\033[31;5malong\033[0m"显示闪烁的红色along color=$[$[RANDOM%7]+31] echo-ne"\033[1;${color};5m*\033[0m"显示闪烁的随机色along 六、分享几个有意思的小脚本 1、9x9乘法表 #!/bin/bash forain{1..9};do forbin`seq1$a`;do letc=$a*$b;echo-e"${a}x${b}=$c\t\c" done echo done 2、彩色等腰三角形 #!/bin/bash read-p"Pleaseinputanum:"num if[[$num=~[^0-9]]];then echo"inputerror" else foriin`seq1$num`;do xing=$[2*$i-1] forjin`seq1$[$num-$i]`;do echo-ne"" done forkin`seq1$xing`;do color=$[$[RANDOM%7]+31] echo-ne"\033[1;${color};5m*\033[0m" done echo done fi 3、国际象棋棋盘 #!/bin/bash red="\033[1;41m\033[0m" yellow="\033[1;43m\033[0m" foriin{1..8};do if[$[i%2]-eq0];then foriin{1..4};do echo-e-n"$red$yellow"; done echo else foriin{1..4};do echo-e-n"$yellow$red"; done echo fi done 关注「开源Linux」加星标,提升IT技能

优秀的个人博客,低调大师

HBase Shell Get 操作常用小技巧

在工作中,有时候只是想简单看下HBase表某些关键指标的值,这个时候总不能现写Java代码去查看,以下几个小技巧你可能会经常用到。 1. 某行有许多列,只想获取指定2~3列的数据 hbase> get 't1', 'r1', ['f:c1', 'f:c2', 'f:c3'] 2. 想看某个字段多个版本的数据 hbase> get 't1', 'r1', {COLUMN => 'f:c1', VERSIONS => 4} 3. 想看被16进制化的中文或数字 hbase> put 't1','r1','f:c1','中国' hbase> get 't1','r1','f:c1:toString' COLUMN CELL f:c1 timestamp=1585635275771, value=中国 1 row(s) in 0.0180 seconds 对于Int型、Long型数值,支持toInt|toLong语法。 4. 快速获取一个列族下的所有列 使用列族过滤器: 1. 精确匹配列族 hbase> get 't1,'r1',FILTER=>"FamilyFilter(=,'binary:f')" 2. 模糊匹配列族 hbase> get 't1,'r1',FILTER=>"FamilyFilter(=,'substring:f')" 5. 根据列名前缀获取数据 hbase> get 't1','r1',FILTER=>"ColumnPrefixFilter('c')" 不常用的语法不再论述。 转载请注明出处!欢迎关注本人微信公众号【HBase工作笔记】

优秀的个人博客,低调大师

通过shell脚本检测MySQL服务信息

今天改了一版脚本,对于MySQL的基本信息的获取有了一个相对比较清晰的收集方式。 我简单解释下脚本。 整体是分为两部分 第一部分是通过系统层面来解析MySQL的基本信息,方式是通过ps -ef|grep mysql得到的信息来解析。 第二部分是通过登录MySQL得到的信息,基本信息包括server_id,log_bin等。 脚本内容如下: ps -ef|grep mysql |grep -w mysqld|grep -v grep |awk -F'--' '{for (i=2;i<=NF;i++) {printf $i" "}printf " "}' > info_from_sys.tmp function get_info_from_sys() { while read line do array=$line port_str='port=' socket_str='socket=' for arr_tmp in ${array[*]}; do if [[ $arr_tmp =~ $port_str ]];then port_tmp=`echo $arr_tmp|sed 's/port=//g'` fi if [[ $arr_tmp =~ $socket_str ]];then socket_tmp=`echo $arr_tmp|sed 's/socket=//g'` fi done if [ -z "$port_tmp" ];then port_tmp=3306 fi echo $port_tmp $socket_tmp >> info_from_sys.lst done < info_from_sys.tmp } function get_info_from_db() { while read line do port=`echo $line|awk '{print $1}'` #echo $port /usr/local/mysql/bin/mysql -udba_admin -p$dec_passwd -h127.0.0.1 -P${port} -N -e "select @@port,@@log_bin,@@innodb_buffer_pool_size,@@gtid_mode,@@datadir,@@character_set_server,@@server_id,version();" >> info_from_db.lst # echo $port_tmp $socket_tmp done < info_from_sys.lst } function decrypt_passwd { tmp_passwd=$1 dec_passwd=`echo $tmp_passwd|base64 -d` } ##MAIN get_info_from_sys sec_password='RHB6TEST1d1c5TTEzZGIwSgo=' --这个是数据库密码的base64加密串,可以根据需求来定制 dec_passwd='' decrypt_passwd $sec_password get_info_from_db sort info_from_db.lst > info_from_db.tmp sort info_from_sys.lst > info_from_sys.tmp rm info_from_db.lst info_from_sys.lst join -j 1 info_from_sys.tmp info_from_db.tmp 最后送波福利。现在加群即可获取Java工程化、高性能及分布式、高性能、高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限及领取相关资料,群号:835638062 点击链接加入群聊【Java高级架构】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

优秀的个人博客,低调大师

shell命令使用HDFS的distcp命令

Java API等多种接口对HDFS访问模型都集中于单线程的存取,如果要对一个文件集进行操作,就需要编写一个程序来执行并行操作。HDFs提供了一个非常实用的程序——distcp ,用来在Hadoop文件系统中并行地复制大数据量文件。distcp一般适用于在两个HDFS集群间传送数据的情况。如果两个集群都运行在同一个Hadoop版本上,那么可以使用HDFS模式: hadoop distcp hdfs://NameNode1/foohdfs://NameNode2/bar 这条命令会将第一个集群中的/foo文件夹以及文件央下的文件复制到第二个集群中的/bar目录下,即在第二个集群中会以/bar/foo的目录结构出现。如果/bar目录不存在,则系统会新建一个。也可以指定多个数据源,并且所有的内容都会被复制到目标路径。需要注意的是,源路径必须是绝对路径。即hdfs://NameNode1/foo 默认情况下,虽然distcp会跳过在目标路径上已经存在的文件,但是通过-overwirte选项可以选择对这些文件进行覆盖重写,也可以使用,-update选项仅对更新过的文件进行重写。 distcp操作有很多选项可以设置,比如忽略失败、限制文件或者复制的数据量等。直接输入指令或者不附加选项则可以查看此操作的使用说明。即distcp。具体实现时,distcp操作会被解析为一个MapReduce操作来执行,当没有Reducer操作时,复制操作被作为Map操作并行地在集群节点中运行。因此,每个文件都可被当做一个Map操作来执行复制操作。而distcp会通过执行多个文件聚集捆绑操作,尽可能地保证每个Map操作执行相同数量的数据。那么,执行distcp时,Map操作如何确定呢?由于系统需要保证每个Map操作执行的数据量是合理的,来最大化地减少Map执行的开销,而按规定,每个Map最少要执行256MB的数据量(除非复制的全部数据量小于256MB)。比如要复制1GB的数据,那么系统就会分配4个Map任务,当数据量非常大时,就需要限制执行的Map任务数,以限制网络带宽和集群的使用率。默认情况下,每个集群的一个节点最多执行20个Map任务。比如,要复制1000GB数据到100节点的集群中,那么系统就会分配2000个Map任务(每个节点20个),也就是说,每个节点会平均复制512MB。 还可以通过调整distcp的-m参数来减少Map任务量,比如-m 1000就意味着分配1000个Maps,每个节点分配1GB数据量。 如果尝试使用distcp进行HDFS集群间的复制,使用HDFS模式之后,HDFS运行在不同的Hadoop版本之上,复制将会因为RPC系统的不匹配而失败。为了纠正这个错误,可以使用基干HTTP的HFTP进行访问。因为任务要在目标集群中执行,所以HDFS的RPC版本需要匹配,在HFTF模式下运行的代码如下: hadoop distcp hftp://NameNode1:50070/foo hdfs://NameNode2/bar 需要注惫的是,要定义访问源的URI中NameNode的网络接口,这个接口会通过dfs.http.address的属性值设定,默认值为50070. distcp即dist分布式,cp复制。用于在集群内部及集群之间复制数据。即分布式复制!!! 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5140849.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册