shell脚本

Unix系列shell程序编写从入门到精通(上)

心不动则不痛 提交于 2019-12-06 18:31:03
*Shell 是什么 ? 任何发明都具有供用户使用的界面。 UNIX 供用户使用的界面就是 Shell(DOS 的 command 熟悉吧,但 UNIX 的要强大的多 ) 。 Shell 为用户提供了输入命令和参数并可得到命令执行结果的环境。 为了不同的需要, UNIX 提供了不同的 Shell 。现在的 UNIX 大部分都支持 BourneShell ,以下教程就以 BourneShell(Bsh) 为例,一步步的领略 UNIX Shell 的强大功能,占先其强大魅力,达到更方便灵活的管理、应用 UNIX 的目的。 1.UNIX 内核和 Shell 的交互方法 启动 UNIX 时,程序 UNIX( 内核 ) 将被调入计算机内存,并一直保留在内存中直到机器关闭。在引导过程中,程序 init 将进入后台运行一直到机器关闭。该程序查询文件 /etc/inittab ,该文件列出了连接终端的各个端口及其特征。当发现一个活动的终端时, init 程序调用 getty 程序在终端上显示 login 等登陆信息。 (username 和 passwd) ,在输入密码后, getty 调用 login 进程,该进程根据文件 /etc/passwd 的内容来验证用户的身份。若用户通过身份验证, login 进程 把用户的 home 目录设置成当前目录并把控制交给一系列 setup 程序。

shell脚本编程基础之文件测试

旧巷老猫 提交于 2019-12-06 16:43:15
文件测试判断条件 -e FILE:测试文件是否存在 -f FILE:测试文件是否为普通文件 -d FILE:测试指定路径是否为目录 -r FILE:测试当前用户对指定文件是否有读权限 -w FILE:测试当前用户对指定文件是否有写权限 -x FILE:测试当前用户对指定文件是否有执行权限 Example: [ -e /etc/passwd ] [ -x /etc/shadow ] 多分支if语句 if 判断条件1;then statement1 ... elif 判断条件2;then statement2 ... elif 判断条件3;then statement3 ... else statement4 ... fi Example: #!/bin/bash FILES=/etc/ if [ ! -e $FILES ];then echo no such file elif [ -f $FILES ];then echo file elif [ -d $FILES ];then echo "$FILES is directory" else echo unknow fi 首先判断/etc/是否存在,如果不存在则显示no such file,然后退出脚本;如果/etc/存在,第一个判断为假,继续判断/etc/是否为普通文件,是则显示file,退出脚本;不是继续判断/etc

史上最全的用Python操控手机APP攻略!建议收藏!

我的梦境 提交于 2019-12-06 16:38:53
​最近经常看到用Python操作手机APP的项目,例如抖音、闲鱼之类的,看完后发现这些项目无一例外需要部署ADB环境。至于什么是ADB,很多大神都讲过,只是写得比较专业,我等菜鸟看完还是云里雾里。 ​ ​ 为了使没有安卓开发经验的人也能快速学会用Python操作手机APP,我从Android SDK部署、ADB基础应用、Python操作手机等方面入手写了这篇文章,目的是使大家对ADB的使用有一个直观的认识,这样在玩上面提到的这些项目时会更轻松一些。 事先声明:本文涉及的各类操作可能有多种实现方法,我只会提及其中一种,而且我采取的方法很有可能不是最优的方法。 1 Android SDK下载和部署 说起Android SDK工具,那还真是不少,有SDK Tools、SDK、Platform-tools等等,这里我推荐SDK Tools,进入https://www.androiddevtools.cn/这个网站可以看到下图中的界面,选择自己对应的系统版本(zip版)下载。 ​ 将下载后的文件解压缩,运行其中的SDK Manager.exe文件,进入Packages安装管理界面,对于新手朋友们我建议直接使用默认选项,然后点击右下角的 Install XX packages 按钮,整个下载安装过程大概需要几十分钟,具体时间跟个人网速有关。 ​ 接着就是配置环境变量了,把android

shell脚本 基础应用

送分小仙女□ 提交于 2019-12-06 16:14:30
变量分为普通变量可只读变量 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 #普通变量 #!/bin/bash name= "chen" echo "${name}" 下面是执行结果 --------------------------- [root@localhost ~] # sh t1.sh chen #只读变量 只读变量就是只可以阅读,不可以进行二次修改 #!/bin/bash name= "chen" readonly name name= "chenyiyuan" 下面是执行结果 ------------------------------ [root@localhost ~] # sh t1.sh t1.sh:行4: name: 只读变量 #删除变量 #!/bin/bash name= "chen" unset name echo "${name}" 下面是执行效果 执行效果为空 ------------------------------- [root@localhost ~] # sh t1.sh :<<EOF

shell脚本sed的基本用法

瘦欲@ 提交于 2019-12-06 16:12:45
sed 我们首先准备了一个测试文件 1. s 替换 将文件中的This替换cyy 在替换的时候如果加入了 -i 选项就会真的替换,但是只会替换每一行的第一个 -n 和 -p 一起使用表示的是打印那些发生替换的行 加入-g的参数是指全部替换,全局的一个参数 当需要从第N处替换的时候,可以加入Ng:这里的N是具体的数 注意:在以上的命令中的字符 / 在sed中作为定界符使用,当让也可以使用任意的定界符 2.删除操作 可以先修改要测试的文件,在这个文件中又空白行 删除所有的空白行 删除文件中的第二行 删除文件的第2行至末尾的所有行 删除文件中的最后一行(在我的文件中的最后一行是一个空白行) 删除文件中以my开头的行 3.已匹配字符串标记& 正则表达式\w\+匹配每一个单词,使用[&]替换他 ,&对应之前所匹配到的单词 字串匹配标记\1 注意:命令中digit 7 被替换程7 样式匹配到的子串是7,\(...\)用于匹配字串,对于匹配到的第一个子串标记为\1 以此类推匹配到的第二个结果就是\2:例如 组合多个表达式 : sed '表达式' | sed '表达式' 注意:sed表达式可以使用单引号来引用,如果表达式内部包含变量字符串,就需要使用双引号 例子:首先定义一个变量 然后将这个变量替换程大写 选定行的范围: 首先是逗号 (,)

source

扶醉桌前 提交于 2019-12-06 14:25:35
你是否被下面的几个问题困扰过,甚至至今无法真正理解? 什么是 export ,什么时候用export,为什么有时用了export还要 source ? 为什么用 env 来设置环境变量,不用export,有什么好处? source 和 exec 有什么区别? 本文试图通过普及unix进程、环境变量等概念,让读者真真理解这些shell命令的本质,知道这些命令的使用场合。 首先,先对这些命令做一个解释,如果读者能完全理解,那么本文也许对你帮助不大。 set 设置了当前shell进程的 本地变量 ,本地变量只在当前shell的进程内有效,不会被子进程继承和传递。 env 仅为将要执行的子进程设置 环境变量 。 export 将一个shell本地变量提升为当前shell进程的 环境变量 ,从而被子进程自动继承,但是export的变量无法改变父进程的环境变量。 source 运行脚本的时候,不会启用一个新的shell进程,而是在当前shell进程环境中运行脚本。 exec 运行脚本或命令的时候,不会启用一个新的shell进程,并且exec后续的脚本内容不会得到执行,即当前shell进程结束了。 在这些表述中,反复提到 进程 和 环境变量 的概念。如果希望深入理解其中的含义,还必须理解进程的相关概念。 进程和环境变量 进程是一个程序执行的上下文集合,这个集合包括程序代码、数据段、堆栈、环境变量

[学习笔记]C编程执行shell命令

六月ゝ 毕业季﹏ 提交于 2019-12-06 14:15:22
写一些shell脚本个人更喜欢用python或者c,一方面是因为bash掌握不精。。。。另一方面是c中执行shell命令可以快速将结果传回程序中进行后续处理,而python便捷的字符串处理可以让脚本写的更加迅速。 本章先简单介绍一些C的相关内容,从而可以让你快速用C语言写一个调用shell的程序 首先介绍一下C程序如何获取命令行参数 int main(int args,char* argv[]) args就是参数数量,而argv为参数数组 在stdlib.h库中,支持函数 system(command) 该函数会直接执行shell命令,如果有输出则直接打印在bash上,不会返回给我们的程序 第二种常见方法为 FILE * fp; char buffer[256]; fp=popen(“ls”,”r”); fgets(buffer,sizeof(buffer),fp); printf(“%s”,buffer); pclose(fp); 通过popen将输出返回到一个文件指针上,可以通过读取文件的方式获得输出。 来源: https://www.cnblogs.com/trickofjoker/p/11988921.html

shell 执行方式

落花浮王杯 提交于 2019-12-06 13:12:49
1.source(或者.) 当使用source运行脚本程序时,系统并不会创建子shell,而是将脚本中的命令放到shell父中运行 2.sh or bash 当使用sh或者bash运行shell脚本程序时,系统将创建一个子shell执行脚本中的命令 export 的作用是为当前shell设置环境变量,这样变量在其子shell也可以访问,当然,在其父shell中还是无法访问的 普通的变量只在当前shell中可以访问,在父shell或者子shell中都无法访问 3.后台运行脚本 命令 描述 monitor.sh & --shell终端断掉脚本就停止运行了 nohup command & --不挂断的执行程序 setsid command & --关闭shell终端,命令继续后台运行 (monitor.sh &) --关闭shell终端,命令继续后台运行 disown -h %1 --已经在运行的用户进程不受用户退出限制 4.开机执行脚本 rc.local rc.local是在完成所有初始化之后执行,因此我们可以把启动脚本写到里面 init.d init.d目录下都为可执行程序,他们其实是服务脚本,按照一定格式编写,Linux 在启动时会自动执行,类似Windows下的服务 eg: 1.在/etc/rc.d/init.d/目录下创建启动脚本 #!/bin/bash ### BEGIN

shell执行多线程

被刻印的时光 ゝ 提交于 2019-12-06 13:08:12
#!/bin/bash --login rundateE=$2 rundateStart=$1 rundate=`date -d "$rundateStart" +%s` rundateEnd=`date -d "$rundateE" +%s` # 加入所执行程序所在目录 cd /usr/web/script/sqlserver2hdfs trap "exec 1000>&-;exec 1000<&-;exit 0" 2 mkfifo testfifo exec 1000<>testfifo rm -fr testfifo for ((n=1;n<=20;n++)) do echo >&1000 done start=`date "+%s"` while [ "$rundate" -le "$rundateEnd" ] do run=$(date -d @$rundate +"%Y%m%d") read -u1000 { # 要多进程运行的脚本 $run 为时间 echo pystreaming pianhao $run sleep 3 echo >&1000 }& rundate=$((rundate+86400)) done wait end=`date "+%s"` let return=$end-$start echo "Time: $return" exec 1000>&

shell脚本编程之条件判断

ぐ巨炮叔叔 提交于 2019-12-06 13:03:37
条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式的三种方法: 1、[ expression ] 命令测试 2、[[ expression ]] 关键字测试 3、test expression 整数比较: -eq:测试两个整数是否相等;相等为真,不等为假 -ne:测试两个整数是否不等;不等为真,相等为假 -gt:测试一个数是否大于另一个数;大于为真,否则为假 -lt:测试一个数是否小于另一个数;小于为真,否则为假 -ge:大于或等于 -le:小于或等于 命令间的逻辑关系: !:表示非(取反) 逻辑与:&& 逻辑或:|| CMD1 && CMD2 Example:id aaa && echo "hello aaa" 如果&&前的执行结果是假,总的结果就是假,没必要执行&&后的操作 如果CMD1成功了(真),就可执行CMD2 如果CMD1失败了(假),就不执行CMD2 如果aaa用户存在,则打印hello aaa;如果用户aaa不存在,则不进行打印 CMD1 || CMD2 Example:id aaa || useradd aaa 如果||前的执行结果是真,总的结果就是真,没必要执行||后的操作CMD2 如果CMD1成功了(真),就不执行CMD2 如果CMD1失败了(假),就可执行CMD2 如果用户aaa存在,就不执行创建aaa用户的命令;如果aaa用户不存在