shell脚本

linux shell 管道命令(pipe)使用及与shell重定向区别

♀尐吖头ヾ 提交于 2019-12-05 01:54:49
管道命令 操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard error 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入 standard input. 管道命令使用说明: 先看下下面图: command1正确输出,作为command2的输入 然后comand2的输出作为,comand3的输入 ,comand3输出就会直接显示在屏幕上面了。 通过管道之后:comand1,comand2的正确输出不显示在屏幕上面 注意: 1、管道命令只处理前一个命令正确输出,不处理错误输出 2、管道命令右边命令,必须能够接收标准输入流命令才行。 实例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 [chengmo@centos5 shell]$ cat test .sh | grep -n 'echo' 5: echo "very good!" ; 7: echo "good!" ; 9: echo "pass!" ; 11: echo "no pass!" ; #读出test.sh文件内容,通过管道转发给grep 作为输入内容 [chengmo@centos5 shell]$ cat

Shell 注释介绍

大兔子大兔子 提交于 2019-12-05 01:49:27
以 # 开头的行就是注释,会被解释器忽略。 通过每一行加一个 # 号设置多行注释,像这样: #-------------------------------------------- # 这是一个注释 # author:菜鸟教程 # site:www.runoob.com # slogan:学的不仅是技术,更是梦想! #-------------------------------------------- ##### 用户配置区 开始 ##### # # # 这里可以添加 脚本 描述信息 # # ##### 用户配置区 结束 ##### 如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢? 每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。 多行注释 多行注释还可以使用以下格式: :<<EOF 注释内容... 注释内容... 注释内容... EOF EOF 也可以使用其他符号: :<<' 注释内容... 注释内容... 注释内容... ' :<<! 注释内容... 注释内容... 注释内容... ! 本文原创地址: https://www.linuxprobe.com/introduction-to-shell.html 来源: https://my

shell编程之Expect免交互

点点圈 提交于 2019-12-04 23:55:51
shell编程之Expect免交互 一、前言 ​ shell脚本存在的核心意义就在于基于shell命令简化甚至省略可避免的人工操作,通过各种控制流程结构以及正则表达式等方法,逐步实现自动化操作的整个过程,由此也可见,shell并没有面向对象的思想,类似C语言,毕竟C语言是操作系统或者说是内核的核心语言。 ​ 所以,语言并无优劣之分,只是每个人使用的习惯与方式不同,换句话说,难易的不是语言,而是思想与突如其来的灵感。 二、Expect概述与安装 Expect概述 ​ Expect是建立在TCL基础上的一个工具,Expect是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的Linux运维很有帮助。 ​ 在Linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互过程,需要输入yes/no password等信息。为了模拟这种输入,可以使用Expect脚本。 Expect的安装:yum install -y expect 三、基本命令 send:向进程发送字符串,用于模拟用户的输入,但不支持换行 一般需要加上 \r expect:内部命令 ​ 判断上次输出结果里是否包含指定的字符串,有则返回,反之就等待超时时间后返回。 ​ 只能捕捉由spawn启动的进程的输出。 spawn:启动进程,并跟踪后续交互信息。 interact

shell基础

六月ゝ 毕业季﹏ 提交于 2019-12-04 23:31:28
一、shell脚本的执行方式 1. echo 命令 [root@centos2 ~]# echo [选项] [输出内容] 选项 -e:支持反斜线控制的字符装换 -n:取消输出后行末的换行符,就是内容输出后不换行 例 [root@centos2 ~]# echo "hello world" hello world [root@centos2 ~]# echo -n "hello world" hello world[root@centos2 ~]# 在echo命令中使用"-e"选项,可控制以下字符 控制字符 作 用 \\ 输出\本身 \a 输出警告音 \b 退格键,向左删除 \c 取消输出行末的换行符,和"-n"选项作用一致 \e ESCAPE键 \f 换页符 \n 换行符 \r 回车符 \t 制表符,tab键 \v 垂直制表符 \0nnn   按照八进制ASCII码表输出字符。0为数字零,nnn是三位八进制数 \xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 例 [root@centos2 ~]# echo -e "\\ \a" \ #输出\,同时会输出一声提示音 [root@centos2 ~]# echo -e "ab\bc" ac [root@centos2 ~]# echo -e "abc\c" abc[root@centos2 ~]# [root

shell脚本中的双括号用法

僤鯓⒐⒋嵵緔 提交于 2019-12-04 23:24:13
在刚开始学习inux shell脚本编程时候,对于它的 四则运算以及逻辑运算。估计很多朋友都感觉比较难以接受。特变逻辑运算符”[]”使用时候,必须保证运算符与算数 之间有空格。 四则运算也只能借助:let,expr等命令完成。 今天讲的双括号”(())”结构语句,就是对shell中算数及赋值运算的扩展。 使用方法: 语法: ((表达式1,表达式2…)) 特点: 1、在双括号结构中,所有表达式可以 像c语言一样 ,如:a++,b--等。 2、在双括号结构中,所有变量可以不加入:“$”符号前缀。 3、双括号可以进行逻辑运算,四则运算 4、双括号结构 扩展了for,while,if条件测试运算 5、支持多个表达式运算,各个表达式之间用“,”分开 使用实例: 扩展四则运算 1 2 3 4 5 6 7 8 9 10 11 #!/bin/sh a=1; b=2; c=3; ((a=a+1)); echo $a; a=$((a+1,b++,c++)); echo $a,$b,$c 运行结果: sh testsh.sh 2 3,3,4 双括号结构之间支持多个表达式,然后加减乘除等c语言常用运算符都支持。如果双括号带:$,将获得表达式值,赋值给左边变量。 扩展逻辑运算 1 2 3 4 5 6 7 8 9 10 #!/bin/sh a=1; b= "ab" ; echo $((a>1?8:9)); (

shell脚本移植问题(windwos移植到linux)

佐手、 提交于 2019-12-04 23:13:32
1.关于shell脚本移植问题:   从windows 上写的脚本 移植到linux上执行会出现乱码,出现换行符^M 等问题。      出现乱码:       编码问题,windows 编码 为 gb18030            linux   编码为 utf8       解决方案:           windows 下txt编写时,保存时,选择utf-8 即可,   出现换行符^M:       ^M字符的来历和作用:在DOS/Windows里,文本文件的换行符为\r\n,而在 nix系统里则为\n,所以DOS/Windows里编辑过的文本文件到了 nix里,每一行都多了个^M。   问题解决:     网上有不少方法,但是不适用大量服务器。       这里选择 编码 解决(使用notepad):           复制脚本到notepad 上。选择编码为UFT-8-BOM., 即可解决,移植不会出错。                   来源: https://www.cnblogs.com/pangya/p/11887447.html

Java执行Runtime.exec(shell)报Cannot allocate memory

江枫思渺然 提交于 2019-12-04 22:59:53
在Linux下用java的Runtime.getRuntime().exec(cmd)方式,执行shell脚本时,遇到“Cannot allocate memory”的错误。 网上查询资料整理如下: Cannot allocate memory 在Linux上调试一个比较复杂的Java程序,称为JavaA吧,JavaA会频繁的通过Process proc = Runtime.getRuntime().exec(cmd);调用一些外部程序。在系统负载和该程序占用内存都比较大的情况下,会出现调用失败的情况,错误信息是:"Cannot allocate memory"。 overcommit_memory 通过top发现,Java A大部分时间占用的内存实际并不多,但是占用的虚拟内存很大。马上修改该程序启动时的 JVM参数,将最大内存调的小一些,果然就不出错了。由于JavaA必须在内存中处理大量的数据,内存太小了就可 能处理不了,因此这么改是不可行的。 上网查的过程中,发现一些有趣的东西。Linux内核中可以设置内存的overcommit_memory属性( 设置方法:echo 1 > /proc/sys/vm/overcommit_memory ),意思是Linux 内核认为有些程序很保守,总是申请较多的内存,但实际并不使用,因此在设置overcommit后

Shell的简单介绍(一)

最后都变了- 提交于 2019-12-04 22:03:20
shell 的分类 Shell 类别 易学性 可移植性 编辑性 快捷性 Bourne Shell (sh) 容易 好 较差 较差 Korn Shell (ksh) 较难 较好 好 较好 Bourne Again (Bash) 难 较好 好 好 POSIX Shell (psh) 较难 好 好 较好 C Shell (csh) 较难 差 较好 较好 TC Shell (tcsh) 难 差 好 好 Shell 的两种主要语法类型有 Bourne 和 C,这两种语法彼此不兼容。 Bourne 家族主要包括 sh、 ksh、 Bash、 psh、 zsh; C 家族主要包括: csh、 tcsh (Bash 和 zsh 在不同程度上支持 csh 的语法)。 我们可以通过/etc/shells 文件来查询 Linux 支持的 Shell。命令如下 [root@topcheer ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh [root@topcheer ~]# Shell echo命令 在 echo 命令中如果使用了“-e”选项,则可以支持控制字符,如表 所示: 控制字符 作 用 \\ 输出\本身 \a 输出警告音 \b 退格键,也就是向左删除键 \c 取消输出行末的换行符

Shell脚本(1)

好久不见. 提交于 2019-12-04 21:13:46
在创建Shell脚本时,必须在文件的第一行指定要使用的shell。格式为:#!/bin/bash 除了第一行外,在shell脚本中井号(#)用作注释行 若出现错误:command not found    原因是shell脚本文件所处的目录没有添加到PATH环境变量中 解决方法:1.将shell脚本文件所处的目录添加到PATH环境变量中      2.在提示符中使用绝对或相对文件路径来引用shell脚本文件 若出现错误:Permission denied     原因是用户没有执行文件的权限 解决方法:通过chmod命令更改用户执行文件的权限 echo命令相当于C语言的printf,用来打印输出信息 在默认情况下,不需要使用引号将要显示的文本字符串划定出来。但是有时在字符串中出现引号就需要做处理。echo命令可以用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,就需要在文本中使用其中一种引号,而用另外一种来将字符串划定起来 如果想把文本字符串和命令输出显示在同一行中,那么可以用echo -n实现 echo命令中的环境变量会咋爱脚本运行时替换成当前值。当出现下面 情况时,应该加上\ 例如:   错误例子:echo "the cost of the item is $15"     这时输出会是:the cost of the item is 5     可以看到

awk基本用法

我的未来我决定 提交于 2019-12-04 21:13:00
awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。 awk 数据可以来自标准输入、一个或多个文件,或其它命令的输出。 awk 通常是配合脚本进行使用, 是一个强大的文本处理工具。 awk基本知识 awk内部变量 awk模式动作 awk条件判断 awk循环语句 awk数组 toc awk基本知识 awk 的两种形式语法格式 awk [options] 'commands' filenames awk [options] -f awk-script-file filenames options -F 定义输入字段分隔符,默认的分隔符是空格或tab键(就是改变内部变量 FS,FS 来确定字段分隔符) OFS 是另一个内部变量,用来定义输出字段分隔符的。比如 $1,$3 之间有个逗号,之后输出内容之间变为空格,是因为 OFS 默认为空格 command BEGIN{} {} END{} 行处理前 行处理 行处理后 awk命令格式 ## awk 匹配文件带root的行 [root@Shell ~]# awk '/root/' /etc/passwd ## awk 对文件行进行动作处理(以冒号为字段分隔符,打印第一个字段) [root@Shell ~]# awk -F: '{print $1}' /etc/passwd ## awk 匹配文件 + 处理动作