shell函数

shell 第五章 函数应用

坚强是说给别人听的谎言 提交于 2019-12-01 18:27:18
第五章 Shell函数应用 1. 函数基本概述 2. 函数基本使用 3. 函数参数传递 4. 函数状态返回 5. 函数场景示例 1. 函数基本概述 01. 什么是函数? 函数其实就是一堆命令的合集,用来完成特定功能的代码块,你可以对它进行自定义命令,并且可以在脚本中任意位置使用这个函数,要使用定义的函数,只需要填写函数名称就可以了。 02. 函数的作用 1.使用函数可以让代码模块化,便于代码的复用,同时增加脚本的可读性。 2.函数和变量类似,必须先定义才可使用,如果定义不调用则不会被执行。 2. 函数基本使用 01. 如何定义Shell函数,可以通过如下两种方式进行定义。 #方式一 函数名() { command1 command2 ... commandN } #方式二 function 函数名 { command1 command2 ... commandN } 02. 如何调用Shell函数,直接使用函数名调用即可。在函数内部也可以使用$1、$2..$n的方式传递参数。 #1.命令行定义函数 [root@rlb /scripts]# fun1() { echo "hello world"; } #2.命令行调用函数 [root@rlb /scripts]# fun1 hello world #给函数传递参数 [root@rlb /scripts]# fun2() { echo

shell编程

亡梦爱人 提交于 2019-12-01 17:48:16
shell特殊变量: $0 当前脚本的文件名 $n 传递给脚本或函数的参数; n 是一个数字,表示第几个参数;也可以用于函数的参数 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本或函数的所有参数 $? 上个命令的退出状态,或函数的返回值 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID $* 和 $@ 的区别: $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号""包含时,都以"$1" "$2" … "$n" 的形式输出所有参数 当它们被双引号""包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数 运算符: 算术运算符:+ - * / % =(赋值) == != 关系运算符:-ne -eq -gt -lt -ge -le 布尔运算符:!(非) -o(或) -a(与) 字符串运算符:== != -z(空) -n(非空) 文件测试操作: -e 文件是否存在 -f 是否为普通文件 -d 是否为目录 -w 是否具有写权限 -x 是否具有执行权限 条件语句: if <condition> then   <statement> fi if <condition> then   

6条shell小技巧,让脚本显得不再业余【转】

99封情书 提交于 2019-12-01 16:31:53
如何能让自己的shell显得不那么业余? 下面6点实践一定有用。 画外音:本篇文章源自Google的一篇实践,抽取了部分1分钟能读完的内容,加入了一些分析。 一、以下面的语句开场 set -o nounset 在默认情况下,遇到不存在的变量,会忽略并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的执行。 画外音:有些变量名的手误,会让人崩溃的调试半天,通过这个方式,这类手误秒发现。 set -o errexit 在默认情况下,遇到执行出错,会跳过并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的执行。 画外音:有些Linux命令,例如rm的-f参数可以强制忽略错误,此时脚本便无法捕捉到errexit,这样的参数在脚本里是不推荐使用的。 这两个选项,都符合fail fast设计理念。 二、封装函数有必要 别光顾着一溜往下写,封装可以提高复用。 如上例: log() 简单封装,能够省去很多 [$(date +%Y/%m/%d\ %H:%M:%S)] 的重复代码。 画外音:这个log()有点意思,学到了吗? 同时,封装还能提高代码的可读性。 如上例: ExtractBashComments 比 egrep "^#" 的可读性就高很多。 画外音:有些抬杠的朋友会说,不认识英文。 三、使用readonly和local修饰变量 readonly

shell命令执行结果$?

人走茶凉 提交于 2019-12-01 09:39:35
shell命令执行结果 $? 20190929 例子 在shell中,有时我们需要知道上调命令(或者上条函数)是否执行成功,可以用 $? 命令 #!/bin/bash # 无参 num1=3 num2=4 sql="select ${num1} * ${num2};" sss=`hive -e "${sql}" | grep -v "WARN"` let flag=$? echo $flag if [[ $flag = 0 ]] then echo "succeed!" echo "${sss}" else echo "filed!" fi 输出 0 succeed! 12 注意:在shell中,成功返回的是 0 参考 参考1-shell中的 $0 $n $# $* $@ $? $$ 参考2-shell脚本中判断上一个命令是否执行成功 来源: https://www.cnblogs.com/damahuhu/p/11675525.html

shell 参数个数

拥有回忆 提交于 2019-12-01 09:39:12
shell 参数个数 20190904 参数个数 在写shell脚本的时候,会有这样的需求:根据传入的参数个数来选择相应的操作。 命令 $# 返回出入的参数,但要注意对 $# 的引用范围 测试代码 #!/bin/bash #参数个数命令 $# #date:2018-08-08 date1=$1 date2=$2 let nump1=$# echo "---函数外---"$nump1 function main(){ let nump2=$# echo "---函数内---"$nump2 if [[ $nump1 = 1 ]] then let date2int="${date1:0:4}${date1:5:2}${date1:8:2}" echo $date2int exit fi echo $date1 } main 1、条件判断为: if [[ $nump1 = 1 ]] $ sh test_num_parameter.sh 2018-08-09 输出 ---函数外---1 ---函数内---0 20180809 2、条件判断为: if [[ $nump2 = 1 ]] $ sh test_num_parameter.sh 2019-01-01 输出 ---函数外---1 ---函数内---0 2019-01-01 $# 的作用域只在最外层 参考 博客园-参考1 博客园-参考2

获取当前设备信息shell函数

谁都会走 提交于 2019-12-01 08:05:20
作者:邓聪聪 #!/bin/bash PATH=$PATH get_Info(){ IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com ) cname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) cores=$( awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo ) freq=$( awk -F: '/cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) tram=$( free -m | awk '/Mem/ {print $2}' ) swap=$( free -m | awk '/Swap/ {print $2}' ) up=$( awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=$1%60} {printf("%ddays, %d:%d:%d\n",a,b,c,d)}' /proc/uptime ) load=$( w | head -1 |

[转帖]linux bash环境变量简单总结

僤鯓⒐⒋嵵緔 提交于 2019-12-01 05:21:55
linux bash环境变量简单总结 来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 需要简单学习一下. 其实 我都是直接放一个 .sh文件到 /etc/profile.d 的目录下面感觉这样最粗暴有效 虽然也可以放 .bash_rc 或者是 .bash_profile 里面 但是 毕竟是单用户的而且不喜欢改 profile 文件 太复杂了 改坏了很麻烦. 一.环境变量简介 Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都 是相同的,这个默认环境实际上就是一组环境变量的定义。 环境变量是全局的,设置好的环境变量可以被所有当前用户所运行的程序所使用。 用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。 常见的环境变量: PATH: 决定了shell将到哪些目录中寻找命令或程序 ROOTPATH: 这个变量的功能和PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。 HOME: 当前用户主目录 USER: 查看当前的用户 LOGNAME: 查看当前用户的登录名。 UID: 当前用户的识别字,取值是由数位构成的字串。 SHELL: 是指当前用户用的是哪种Shell。 TERM : 终端的类型。 PWD 当前工作目录的绝对路径名

pwn-pwn4

半腔热情 提交于 2019-12-01 01:35:24
依旧是先检查文件的类型和保护 64位没有保护 用IDA看看,read存在溢出,溢出0x18(不懂可以翻阅前面的博客) 函数system可以调用指令 shift+F12看看 $0在Linux中是shell的名称 那么我们可以利用system函数调用$0来getshell,因为是64位,需要用rdi寄存器来给system传值 现在找一下rdi的地址和$0的地址 现在还需要system的地址 现在就可以编写exp from pwn import * r=remote('114.116.54.89',10004) rdi_add=0x4007D3 shell_add=0x60111F sys_add=0x40075A payload='a'*0x18+p64(rdi_add)+p64(shell_add)+p64(sys_add) r.sendline(payload) r.interactive() 来源: https://www.cnblogs.com/gaonuoqi/p/11646005.html

从0开始自己用C语言写个shell__01_整体的框架以及fork和exec族函数的理解

守給你的承諾、 提交于 2019-11-30 22:55:33
最近才忙完了一个操作系统的作业,让我们用C语言实现一个Shell。总的来说,其实就是让我们 对系统调用有比较深的了解。 首先 介绍一下我的Shell 所实现的功能。 1.运行可执行程序 即输入某个 标志符号 使得其能在我的Shell中运行,并且不退出当前shell。 2.获得某个程序的中某个字符串的个数(其实就是调用了/bin/里面的grep) 3.使用管道,实现两个子进程之间的联系,当然不能连shell自己都退出了。。 4.定向输出到某个个文本文件中。 但是在这之前,我想先谈谈我对fork()这个函数的理解。 首先我们把最开始的程序叫做F,然后 我们开始运行这个 程序,让我们一条条指令运行!当我们的运行到fork的时候,我们OS将整个程序 复制出几乎完全一样的一个程序(子程序)!注意在此之前的命令已经执行完了,所有的数据空间中的数据都将被复制一份,供子程序使用( 包括fork()这个函数也会被复制一份 。)。注意是复制一份,并不是让子程序共用父程序的数据空间!(再直白一点就是同一个变量,你在子程序里面调用改变了他,但是当你在父程序里面打印出它时,数值仍然是改变前的)。 前面提到的父子程序,难免会让人产生很多疑惑!有人肯定会问:“你不是说我的父程序 和子程序是完全一样的吗?那我fork出一个子程序有什么用呢?反正都是干的同一件事" 或者问:“那我们怎么区分父子进程呢?”。

[转]ubuntu 环境变量设置方法

孤者浪人 提交于 2019-11-30 22:06:48
环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量 1、/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 2、/etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。 3、~/.bash_profile:在登录时用到的第三个文件是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当 用户登录时,该 文件仅仅执行一次!默认情况下,他设置一些环境变游戏量,执行用户的.bashrc文件。/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. 4、~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。 5. /etc/rc.local:自动执行的脚本 几个环境变量的优先级 1>2>3 设置永久环境变量 1.环境变量配置中,要先删除.bash_profile中的三行关于.bashrc的定义,然后把环境变量配置在.bashrc中 2.选择要使用的java环境:update-alternatives –config java 3