shell脚本

shell 基础

て烟熏妆下的殇ゞ 提交于 2019-12-09 21:09:51
1.开头:#!/bin/sh或#!/bin/bash 一 定义变量 1.全局变量 局部变量 在脚本或者直接在目录下调用的定义的变量是局部变量 2.查看 变量 用echo 调用变量要用 $ 3.只读变量 readonly 删除变量 unset 4.查看所有环境变量 env 5."" 和 ‘’ 的变量的区别在于 “” : 内可以识别变量 和转义字符 二 变量的使用 1.获取字符串的长度 str=“abcd” echo ${#str} 2.输出字符串或者提取 echo $name echo ${name:1:3} 1 代表从第一个开始截取 3 代表截取个数 3.数组 定义数组 name=(1111 2222 333) 读取数组 echo ${name[0]} 读取下标为0的 echo ${name[@]} 读取所有 echo ${#name[@]} 获取数组的长度 三 运算符的使用 1.+ - * / % = == != expr 10 + 20 echo $((10+20)) let n++ 2.[] 和 [[]] 的区别 可以虚拟匹配 if [[ $a =~ "x" ]]; then echo "包含" else echo "不包含" fi 2.关系运算符 man test 里面会有解释 -eq 是否相等 -ne 是否不相等 -gt 大于 -lt 小于 -ge 大于等于 -le

shell函数介绍及使用

孤街浪徒 提交于 2019-12-09 20:18:44
一、什么是函数? 在shell脚本中,函数类似Linux系统中的命令别名,可以简化程序的代码量,让程序 更易读、易改、易用。 简单地说,函数的作用就是将程序里多次被调用的相同代码组合起来(函数体),并为其取一个名字(即函数名),其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分重复代码时,只需要改变函数体内的一份代码即可实现对所有调用的修改,也可以把函数独立地写到文件里,当需要调用函数时,再加载进来使用。 使用shell函数的优势如下: 把相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率; 增加程序的可读性、易读性,提升管理效率; 可以实现程序功能模块化,使得程序具备通用性(可移植性)。 二、shell函数的语法 (1)标准写法如下: function 函数名 ( ) { #推荐使用此格式,花括号里面写入的就是要执行的命令 return n } 2)简化写法如下: 函数名 ( ) { #不用function的方法 指令 .. . return n } 在shell函数的语法中,function表示声明一个函数,这部分可以省略不写。 三、shell函数的执行 shell的函数分为最基本的函数和可以传参的函数两种,其执行方式分别如下: (1)执行不带参数的函数时,直接输入函数名即可(注意不带小括号),格式如下: 函数名 有关执行函数的重要说明

Flask 教程 第四章:数据库

て烟熏妆下的殇ゞ 提交于 2019-12-09 19:31:49
本文翻译自 The Flask Mega-Tutorial Part IV: Database 在Flask Mega-Tutorial系列的第四部分,我将告诉你如何使用 数据库 。 本章的主题是重中之重!大多数应用都需要持久化存储数据,并高效地执行的增删查改的操作, 数据库 为此而生。 本章的GitHub链接为: Browse , Zip , Diff . Flask中的数据库 Flask本身不支持数据库,相信你已经听说过了。 正如表单那样,这也是Flask有意为之。对使用的数据库插件自由选择,岂不是比被迫适应其中之一,更让人拥有主动权吗? 绝大多数的数据库都提供了Python客户端包,它们之中的大部分都被封装成Flask插件以便更好地和Flask应用结合。数据库被划分为两大类,遵循 关系 模型的一类是关系数据库,另外的则是非关系数据库,简称 NoSQL ,表现在它们不支持流行的关系查询语言 SQL (译者注:部分人也宣称NoSQL代表不仅仅只是SQL)。虽然两类数据库都是伟大的产品,但我认为关系数据库更适合具有结构化数据的应用程序,例如用户列表,用户动态等,而NoSQL数据库往往更适合非结构化数据。 本应用可以像大多数其他应用一样,使用任何一种类型的数据库来实现,但是出于上述原因,我将使用关系数据库。 在 第三章 中,我向你展示了第一个Flask扩展,在本章中,我还要用到两个。

SHELL执行的三种模式

我的梦境 提交于 2019-12-09 19:31:17
fork ( /directory/script.sh) fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本. 运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。 sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell exec (exec /directory/script.sh) exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别 source (source /directory/script.sh) 与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用. 在一个脚本中循环调用另一个脚本并且传参数的时候,如果不需要子脚本中声明的变量则使用fork,使用source在循环第十次的时候会报参数过长问题 来源: oschina 链接:

bash shell的内建命令

假如想象 提交于 2019-12-09 19:24:59
内建命令是在当前bash下执行的,会对当前环境和subshell产生影响,而不是内建命令,bash会fork一个subshell来执行,为什么要内建命令,因为bash的subshell不会对父shell产生影响,这样造成的结果是如cd命令,如果执行cd命令是在bash的subshell中执行,那么,并不会改变父shell的目录,这就不能完成切换目录的目的了。 你也可以使用enable命令打开或者关闭内建命令,内建命令总共有50多个,比较常用的有source . read mapfile和readarray(一个命令的两种写法,功能是将一个文本直接变成一个数组,每行作为数组的一个元素) echo printf jobs sleep fg bg disown(使一个jobs作业控制进程脱离jobs的控制,成为一个“野”进程) trap suspend exit exec logout wait 命令行参数的处理getopts,实现如-a、-b、-c n的功能,e:表示这个参数后面是有变量值的,后面的变量用$OPTARG获取。 #!/bin/bash while getopts "abc:de:f" arg do case $arg in a) echo "aaaaaaaaaaaaaaaaaaaaaa" ;; b) echo "bbbbbbbbbbbb" ;; c) echo "c

linux shell中的EOF

十年热恋 提交于 2019-12-09 18:37:58
关键词:EOF 在平时的运维工作中,我们经常会碰到这样一个场景: 执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了! 这个时候,就可以使用EOF结合cat命令进行行内容的追加了。 下面就对EOF的用法进行梳理: EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF. EOF一般会配合cat能够多行文本输出. 其用法如下: <<EOF //开始 .... EOF //结束 还可以自定义,比如自定义: <<BBB //开始 .... BBB //结束 通过cat配合重定向能够生成文件并追加操作,在它之前先熟悉几个特殊符号: < :输入重定向 > :输出重定向 >> :输出重定向,进行追加,不会覆盖之前内容 << :标准输入来自命令行的一对分隔号的中间内容. 先举一个简单的例子,例1: # cat << EOF 在出现输入提示符">",输入以下内容: > Hello > EOF 输入结束后,在终端显示以下内容: Hello 思考: 我们可以从cat命令的说明中知道,cat的操作对象是文件,但是例1中cat的操作对象不是文件,而是用户输入。 那么我们可以这样理解例1

shell 点命令和source指令

与世无争的帅哥 提交于 2019-12-09 16:41:07
1 shell脚本执行方法 有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不再启用其他shell。 新产生一个shell然后再执行scripts的方法是在scripts文件开头加入语句:#!/bin/sh。一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。 另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。source: source命令即点(.)命令。在 bash下输入man source,找到source命令解释处,可以看到解释"Read and execute commands from filename in the current shell environment and ..."。从中可以知道,source命令是在当前进程中执行参数文件中的各个命令,而不是另起子进程(或sub-shell)。 2 source与点命令 source 命令是 bash shell 的内置命令,从 C Shell 而来。 source 命令的另一种写法是点符号,用法和 source 相同,从Bourne Shell而来。 source 命令可以强行让一个脚本去立即影响当前的环境

shell 命令综合实战

浪子不回头ぞ 提交于 2019-12-09 13:44:34
此篇为运维人员(开发)经常使用的查看系统状态的相关命令,主要综合了awk,grep ,sed等文本处理命令,能够大大提高工作效率,在此做个简单分享,也便于自己以后查找,毕竟好记性不如烂笔头。 获取etho网卡的ip: ifconfig eth0 |grep "inet" |awk '{print $2}' 获取cpu信息 cat /proc/cpuinfo|grep "model name"|tail -l |cut -d: -f 2 |sed 's/^//g'|awk '{print $1,$3,$4,$NF}' cut -d: -f 2 以冒号分割,截取第二列 sed 's/^ //g' 将行首的空格去掉 awk '{print $1,$3,$4,$NF}' 默认以空格分隔,打印第1,3,4及最后一列 获取cpu 个数 physical id cat /proc/cpuinfo|grep "physical id"|sort|uniq -c|wc -l sort|uniq -c 统计不同行的个数 wc -l 一共有多少行 获取磁盘信息 fdisk -l|grep "Disk"|grep -v "identifier"|awk '{print $2,$3,$4}'|sed 's/,//g' grep -v "identifier" 不取含有“identifer”的一列 sed

通过shell脚本 批量添加用户

北城以北 提交于 2019-12-09 13:34:15
有一个朋友问我如何批量创建用户和设置密码 ,我就简单给他写了两个 脚本 ,让他自己参考下并自己根据实际情况进行修改,毕竟他需要的用户名和密码都是实际生产环境的。 这里分两种情况,一种是测试for循环批量添加用户,一个是根据实际生产环境进行批量添加。分别写一下案例如下: for添加指定类型用户以及设置随机密码 脚本 作用:批量添加user1-10用户并设置随机8位数随机密码 #!/bin/bash #test add user and set passwd for n in `seq 10` do useradd user$n; echo user$n |passwd `echo user$n |md5sum |cut -c1-8` done 实际生产环境批量添加用户和设置对应密码 脚本作用:在生产环境中批量添加指定用户、设置对应密码,并禁止sudo -s、sudo -i切换到root。 思路:将所有要添加的用户名和密码放到一个数组中,设置一个函数进行截取用户名和密码并进行添加用户、设置密码。最后用一个循环调用这个函数即可添加。 #!/bin/bash #adduser and set passwd userlist=( user21:123456 user22:456789 user23:876543 ) function adduser_setpasswd_sudo(){

shell 随笔

╄→尐↘猪︶ㄣ 提交于 2019-12-09 12:26:05
Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号。 不能使用bash里的关键字(可用help命令查看保留关键字)。 有效的 Shell 变量名示例如下: RUNOOB LD_LIBRARY_PATH _var var2 无效的变量命名: ?var=123 user*name=runoob 除了显式地直接赋值,还可以用语句给变量赋值,如: for file in `ls /etc` 或 for file in $(ls /etc) 以上语句将 /etc 下目录的文件名循环出来。 使用变量 使用一个定义过的变量,只要在变量名前面加美元符号即可,如: your_name="qinjx" echo $your_name echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况: for skill in Ada Coffe Action Java; do echo "I am good at ${skill