怎么用wordpress修改网站源码,山西省建设厅执业资格注册中心网站,网上商城系统的设计与实现,织梦怎么做中英文网站切换shell 编程
vim-quick-sh
window 下 从零开始——PowerShell应用入门#xff08;全例子入门讲解#xff09;
各种逗比脚本参考
参考代码1
参考代码2
Linux-Shell脚本编程书籍代码
把平时有用的手动操作做成脚本#xff0c;这样可以便捷的使用
awk 与 sed 学习…shell 编程
vim-quick-sh
window 下 从零开始——PowerShell应用入门全例子入门讲解
各种逗比脚本参考
参考代码1
参考代码2
Linux-Shell脚本编程书籍代码
把平时有用的手动操作做成脚本这样可以便捷的使用
awk 与 sed 学习包括了知识点介绍和一些习题练习
三十分钟学会AWK
三十分钟学会SED
Shell脚本学习笔记
LinuxShell命令行及脚本编程实例详解 推荐 百度下载
LinuxShell命令行及脚本编程实例详解 推荐 CSDN下载
expect 用于自动化交互
我们通过Shell可以实现简单的控制流功能如循环、判断等。但是对于需要交互的场合则必须通过人工来干预有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。
Expect是一个免费的编程工具语言用来实现自动和交互式任务进行通信而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入而这些命令和程序是期望从终端terminal得到输入一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。
Expect是不断发展的随着时间的流逝其功能越来越强大已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持要在系统上运行Expect必须首先安装Tcl。
expect的核心是spawn、expect、send、set。1spawn调用要执行的命令2expect监听交互输出3send进行交互输入3set设置变量值4interact交互完后将控制权交给控制台。5expect eof与spawn对应表示捕捉终端输出信息终止类似if...endif
其他设置set timeout -1设置expect永不超时set timeout 300如果300后没有捕捉到expect的监听的内容那么就退出#!/usr/local/tcl/bin/expect
spawn ./a.out # 开启子进程执行a.out
expect input # 监听 input
send xxxx\n
expect input
send xxxx\n
expect input
send xxxx\n
expect input
send xxxx\n
expect eofbrexit#!/usr/local/bin/expect
set user yangxr\n
set passwd yangxr123456\n
set timeout 20
spawn ftp yun.xxx.cn
expect Name* {send $user}
expect Password* {send $passwd}
interactexpect支持if语句
if {条件1} {条件1执行语句
} elif {条件2} {条件2执行语句
} else {其他情况执行语句
}
说明
1.if的条件用{}来包含条件
2.if和后面的{}必须有空格隔开
3.两个花括号之间必须有空格隔开比如if {} {}否则会报错 expect:extra characters after close-brace
3.使用{来衔接下一行所以if的条件后需要加左花括号{
4.else不能单独放一行所以else要跟在}后面expect {}多行期望匹配到哪条执行哪条
背景有时执行shell后预期结果是不固定的有可能是询问是yes/no有可能是去输入密码所以可以用expect{}
花括号内放多行语句从上至下匹配匹配到哪个expect执行哪句。通过expect解决ssh交互问题#!/usr/bin/expect
spawn ssh root192.168.0.111expect {yes/no { send yes\r;exp_continue }password: { send 666666\r };
}
interactspawn expect 内部命令启动一个shell程序。
expect 期望哪些内容
yes/no 就send发送 yes \r 表示回车
password 就send发送 centos
exp_continue跳过循环就继续下一条语句。
interact 允许用户交互expect脚本嵌入到shell脚本#!/bin/bash
#Bash script for...echo Start ...
for i in seq 0 999
do
{
expect EOFputs \rputs Create...$ispawn gaiacli keys add cosmos${i} //要执行的命令expect *passphrase* //触发交互send 1234567890\r //交互send 1234567890\r
EOF
}
done
文件列表生成
# $1指定目录cd $1ls *.jpg img_list_txt.txtsed -i s/jpg/txt/ img_list_txt.txt # 修改ls *.jpg img_list_jpg.txt# 合并
paste -d img_list_jpg.txt img_list_txt.txt img_list.txt命令行参数解析
[helloGit shell]$ bash test.sh -a hello -b
this is -a the arg is ! hello
test.sh: option requires an argument -- b
Invalid option: -[helloGit shell]$ bash test.sh -a hello -b hello -c
this is -a the arg is ! hello
this is -b the arg is ! hello
this is -c the arg is ! [helloGit shell]$ more test.sh
#!/bin/bash
while getopts a:b:cdef opt; docase $opt ina)echo this is -a the arg is ! $OPTARG ;;b)echo this is -b the arg is ! $OPTARG ;;c)echo this is -c the arg is ! $OPTARG ;;\?)echo Invalid option: -$OPTARG ;;esacdone
修改文件编码
find ../code/* -name *.c src.txt # 生成文件列表cat src.txt | while read line
doif [ $line *xxx_wyw.c* -o $line *xxxx-lrh.c* -o $line *xxxx-xxxx.c* ]; thencontinue; # 过滤掉某些文件fiiconv -f gb2312 -t utf8 $line a # 修改编码生成新文件[[ $? -ne 0 ]] {#echo $linecontinue; # 遇到错误跳过}mv a $line # 覆盖源文件echo $line change to utf8
donerm src.txt
jq 解析json文件
获取文件的绝对路径
test.sh
root_path$(readlink -f $(dirname $0)) # $0为脚本名称
echo $root_path 不管在那里运行 test.sh
该脚本打印的都是 test.sh 所在的绝对路径
多行注释
:!
这里是多行注释!
作者poplar
时间2019年5月5日20:53:21
联系xxxitcast.cn
!
:
这里是多行注释!
作者poplar
时间2019年5月5日20:53:21
联系xxxitcast.cn 与脚本文件有关系的变量
$0 获取脚本的名称$# 获取脚本的参数数量
$n 获取指定位置的参数
$? 获取上一个命令执行的返回值变量的默认值
变量为null 或 空字符串时使用默认值${变量名:-默认值}a123
echo test: ${a:-666}
echo test: ${b:-666}# 输出
test: 123
test: 666
变量不为空时使用默认值${变量名:默认值}a123
echo test: ${a:666}
echo test: ${b:666}
# 输出
test: 666
test: Shell数组¶
arr(A B C D)arr[0]A
arr[1]B
arr[2]C
arr[3]D${arr[1]}
echo 数组的所有元素${arr[*]} 长度${#arr[*]}
echo ${arr[]}加元素
arr(666)
arr(123 ddd)删除元素
unset a[2]清空数组
unset arr
数字比较
my_scale0.056
if [ echo ${my_scale} | awk -v tem0 {print($1tem)? 1:0} -eq 1 ] # -gt -lt-eq ,-ne 比较的都是整数数字
then echo my_scale bigger then zero
elseecho my_scale equal to zero
fi算数运算符
原生bash不支持数学运算使用expr完成表达式的求值
valexpr 3 2
echo 计算结果: $valif (( a b )) 如果ab # 直接使用或等符号,需要在数值操作符(())中使用关系 支持数字或内容是数字的字符串
-eq [ $a -eq $b ] 返回 false。 相等
-ne [ $a -ne $b ] 返回 true。 不相等
-gt [ $a -gt $b ] 返回 false。 大于
-lt [ $a -lt $b ] 返回 true。 小于
-ge [ $a -ge $b ] 返回 false。 大于等于
-le [ $a -le $b ] 返回 true。 小于等于逻辑运算符
-a
and 等同于 注意空格if [ $a -gt $b -a $a -lt $c ]-o
or 等同于|| 注意空格if [ $a -gt $b -o $a -lt $c ]
例命令1 命令2执行传递命令1成功才执行命令2两者必须都成功整个表达式才为成功||
例命令1 || 命令2执行传递命令1失败才执行命令2两者只要有一个成功整个表达式即为成功如果使用逻辑判断父判断条件成立每个条件必须使用操作符包裹如果ab且ac
if (( $a $b $a $c ))if (( $a $b )) (( $a $c ))如果ab或ac
if (( a b || a c ))if (( a b )) || (( a c ))如果a100且b100
if [[ $a -lt 100 $b -gt 100 ]]空格敏感如果a100或b100
if [[ $a -lt 100 || $b -ge 100 ]]空格敏感
总结以大于等于、And为例
[ ] 关系运算符-ge逻辑运算符-a空格敏感
(( )) 关系运算符逻辑运算符空格不敏感取变量值可省略$ (推荐)
[[ ]] 关系运算符-ge逻辑运算符空格敏感
文件运算符
-f 判断输入内容是否是文件
-d 判断输入内容是否是目录
-x 判断输入内容是否有执行权限
-e 判断输入的文件或文件夹是否存在
〉 函数使用场景:
执行频繁的命令
执行命令格式相近的命令
Python的函数格式# 定义
def 函数名(参数):函数体# 调用
函数名(参数)
Shell函数格式
参数类似于Shell内置变量中的位置参数# 定义
函数名(){函数体 $n
}# 调用
函数名 参数
函数的返回值
函数返回值在调用该函数后通过 $? 获得hell计算方法 let方式a1
let aa1
$(())方式a1
a$((a1))
$[] 方式a1
a$[$a1]读取用户输入read
等待用户输入内容并将结果赋值给nameread name
提示用户read -p 请输入用户名 uname
隐藏用户输入的内容read -p 请输入密码 -s psw
生成一系列数字seq
# seq [选项]... 尾数
echo $(seq 10) # 1-10
# seq [选项]... 首数 尾数
echo $(seq 2 8) # 2-8
# seq [选项]... 首数 增量 尾数
echo $(seq 1 2 8) # 1 3 5 7列编辑
1.光标定位到要操作的地方。
2.CTRLv 进入可视 块模式上下选取行。
3.SHIFTi 输入要插入的内容。
4.ESC 按两次会在每行的选定的区域出现插入的内容。参数个数判断并打印
#/bin/bash
:!
1.要求用户在执行程序时传入2-5个水果
2.如果参数不符合条件, 提示用户并退出程序.
3.打印这几种水果
!
if [[ $# 2 || $# 5 ]]
thenecho 参数只能有2-5个exit
fifor i in $*;do # $* 脚本的所有参数echo 喜欢吃的水果: ${i}
done打印九九乘法表
#!/bin/bash# 打印多行
for i in $(seq 9); do# 打印每行的内容for j in $(seq $i); do# 不换行输出echo -n ${i}*${j}$((i*j)) doneecho doneLinux定时任务cron
cron服务
在Ubuntu中定时任务cron服务默认被安装。可以通过以下命令操作该服务
service cron status 查看服务运行状态
service cron start 启动服务
service cron stop 停止服务
service cron restart 重启服务crontab命令
crontab -e 编辑crontab文件
crontab -l 显示crontab文件
crontab -ir 提示并删除crontab文件cat /var/spool/cron/crontabs/用户名直接查看crontab文件crontab时间格式
分钟 * 小时 * 几号 * 几月 * 星期几
每分钟获取一次时间, 记录到 /tmp/test-date.log
*/1 * * * * echo date /tmp/test-date.log每周二上午5点备份一次/home/
0 5 * * 2 tar -zcf /var/backups/home.tgz /home/awk 文本分析
awk使用shell变量及shell使用awk中的变量
# cat demo.log
2011-08-23 19:57:00,610 [] INFO bo.CommodityCerOrderBO - 属性订正任务执行开始|每页读取100条数据
2011-08-23 19:57:05,012 [] INFO bo.CommodityCerOrderBO - 当前正在处理页数:1
2011-08-23 19:57:30,688 [] INFO bo.CommodityCerOrderBO - order-fix.curr_id:10117,status:attr_ids不含0跳过 cat demo.log | awk
{for(i1;iNF;i){if($219:57:36,969) print $2;}
} awk 和格式化printf
对于%-Ns (N表示具体的正整数)表示左对齐同时该域的位数至少为N原有的域值不足N位的用空格补齐超过N位的采用原有的域值。
#cat grade.txt
1 2 3 4 5 6 7
Zhao 05/99 48311 Green 8 40 44
Qian 06/99 48317 green 9 24 26
Sun 02/99 48 Yellow 42 35 28
Li 07/99 4842 Brown 12 28 26
#awk {printf %-15s,$1 }{print $2} grade.txt
1 2
Zhao 05/99
Qian 06/99
Sun 02/99
Li 07/99
#awk {printf %-25s,$1 }{print $2} grade.txt
1 2
Zhao 05/99
Qian 06/99
Sun 02/99
Li 07/99#awk {printf %-1s,$1 }{print $2} grade.txt
12
Zhao05/99
Qian06/99
Sun02/99
Li07/99
if 条件语句
# Shell中的条件判断语句
if []; ~ then ~fi # 这种语句可以实现多重判断注意最后一定要以一个else结尾。
if-then-elif-then-elif-then-...-else-fi。#! /bin/sh #输出提示信息
echo Please enter a number:
#从键盘读取用户输入的数字
read num
#如果用户输入的数字大于10
if [ $num -gt 10 ]; then
#输出大于10的提示信息echo The number is greater than 10.
#否则
else
#输出小于或者等于10的提示信息 echo The number is equal to or less than 10.
fi
case 语句
#! /bin/sh
#输出提示信息
echo Hit a key,then hit return.
#读取用户按下的键
read keypress
#case语句开始
case $keypress in #小写字母 [[:lower:]]) # 每个变量情况最后都要有)结尾echo Lowercase letter.;; # 每一个变量内容的程序段最后都需要两个分号 (;;) 来代表该程序段落的结束#大写字母 [[:upper:]]) echo Uppercase letter.;; #单个数字 [0-9]) echo Digit.;; #其他字符 *) # 其余情况用*)来表示echo other letter.;;
esac # 最后要用esac来结束即case反过来。
Shell脚本编程30分钟入门
什么是Shell脚本
示例
看个例子吧
#!/bin/sh
cd ~
mkdir shell_tut
cd shell_tutfor ((i0; i10; i)); dotouch test_$i.txt
done示例解释
第1行指定脚本解释器这里是用/bin/sh做解释器的第2行切换到当前用户的home目录第3行创建一个目录shell_tut第4行切换到shell_tut目录第5行循环条件一共循环10次第6行创建一个test_0…9.txt文件第7行循环体结束
mkdir, touch都是系统自带的程序一般在/bin或者/usr/bin目录下。for, do, done是sh脚本语言的关键字。
shell和shell脚本的概念
shell是指一种应用程序这个应用程序提供了一个界面用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix ShellWindows Explorer是一个典型的图形界面Shell。
shell脚本shell script是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本但读者朋友要知道shell和shell script是两个不同的概念。由于习惯的原因简洁起见本文出现的“shell编程”都是指shell脚本编程不是指开发shell自身如Windows Explorer扩展开发。
环境
shell编程跟java、php编程一样只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
OS
当前主流的操作系统都支持shell编程本文档所述的shell编程是指Linux下的shell讲的基本都是POSIX标准下的功能所以也适用于Unix及BSD如Mac OS。
Linux
Linux默认安装就带了shell解释器。
Mac OS
Mac OS不仅带了sh、bash这两个最基础的解释器还内置了ksh、csh、zsh等不常用的解释器。
Windows上的模拟器
windows出厂时没有内置shell解释器需要自行安装为了同时能用grep, awk, curl等工具最好装一个cygwin或者mingw来模拟linux环境。
cygwinmingw
脚本解释器
sh
即Bourne shellPOSIXPortable Operating System Interface标准的shell解释器它的二进制文件路径通常是/bin/sh由Bell Labs开发。
本文讲的是sh如果你使用其它语言用作shell编程请自行参考相应语言的文档。
bash
Bash是Bourne shell的替代品属GNU Project二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell比如你会经常在招聘运维工程师的文案中见到熟悉Linux Bash编程精通Shell编程。
在CentOS里/bin/sh是一个指向/bin/bash的符号链接:
[rootcentosraw ~]# ls -l /bin/*sh
-rwxr-xr-x. 1 root root 903272 Feb 22 05:09 /bin/bash
-rwxr-xr-x. 1 root root 106216 Oct 17 2012 /bin/dash
lrwxrwxrwx. 1 root root 4 Mar 22 10:22 /bin/sh - bash但在Mac OS上不是/bin/sh和/bin/bash是两个不同的文件尽管它们的大小只相差100字节左右:
iMac:~ wuxiao$ ls -l /bin/*sh
-r-xr-xr-x 1 root wheel 1371648 6 Nov 16:52 /bin/bash
-rwxr-xr-x 2 root wheel 772992 6 Nov 16:52 /bin/csh
-r-xr-xr-x 1 root wheel 2180736 6 Nov 16:52 /bin/ksh
-r-xr-xr-x 1 root wheel 1371712 6 Nov 16:52 /bin/sh
-rwxr-xr-x 2 root wheel 772992 6 Nov 16:52 /bin/tcsh
-rwxr-xr-x 1 root wheel 1103984 6 Nov 16:52 /bin/zsh高级编程语言
理论上讲只要一门语言提供了解释器而不仅是编译器这门语言就可以胜任脚本编程常见的解释型语言都是可以用作脚本编程的如Perl、Tcl、Python、PHP、Ruby。Perl是最老牌的脚本编程语言了Python这些年也成了一些linux发行版的预置解释器。
编译型语言只要有解释器也可以用作脚本编程如C shell是内置的/bin/cshJava有第三方解释器JshellAda有收费的解释器AdaScript。
如下是一个PHP Shell Script示例假设文件名叫test.php
#!/usr/bin/php
?php
for ($i0; $i 10; $i)echo $i . \n;执行
/usr/bin/php test.php或者
chmod x test.php
./test.php如何选择shell编程语言
熟悉 vs 陌生
如果你已经掌握了一门编程语言如PHP、Python、Java、JavaScript建议你就直接使用这门语言编写脚本程序虽然某些地方会有点啰嗦但你能利用在这门语言领域里的经验单元测试、单步调试、IDE、第三方类库。
新增的学习成本很小只要学会怎么使用shell解释器Jshell、AdaScript就可以了。
简单 vs 高级
如果你觉得自己熟悉的语言如Java、C写shell脚本实在太啰嗦你只是想做一些备份文件、安装软件、下载数据之类的事情学着使用shbash会是一个好主意。
shell只定义了一个非常简单的编程语言所以如果你的脚本程序复杂度较高或者要操作的数据结构比较复杂那么还是应该使用Python、Perl这样的脚本语言或者是你本来就已经很擅长的高级语言。因为sh和bash在这方面很弱比如说
它的函数只能返回字串无法返回数组它不支持面向对象你无法实现一些优雅的设计模式它是解释型的一边解释一边执行连PHP那种预编译都不是如果你的脚本包含错误(例如调用了不存在的函数)只要没执行到这一行就不会报错
环境兼容性
如果你的脚本是提供给别的用户使用使用sh或者bash你的脚本将具有最好的环境兼容性perl很早就是linux标配了python这些年也成了一些linux发行版的标配至于mac os它默认安装了perl、python、ruby、php、java等主流编程语言。
第一个shell脚本
编写
打开文本编辑器新建一个文件扩展名为shsh代表shell扩展名并不影响脚本执行见名知意就好如果你用php写shell 脚本扩展名就用php好了。
输入一些代码第一行一般是这样
#!/bin/bash
#!/usr/bin/php“#!”是一个约定的标记它告诉系统这个脚本需要什么解释器来执行。
运行
运行Shell脚本有两种方法
作为可执行程序
chmod x test.sh
./test.sh注意一定要写成./test.sh而不是test.sh运行其它二进制的程序也一样直接写test.shlinux系统会去PATH里寻找有没有叫test.sh的而只有/bin, /sbin, /usr/bin/usr/sbin等在PATH里你的当前目录通常不在PATH里所以写成test.sh是会找不到命令的要用./test.sh告诉系统说就在当前目录找。
通过这种方式运行bash脚本第一行一定要写对好让系统查找到正确的解释器。
这里的系统其实就是shell这个应用程序想象一下Windows Explorer但我故意写成系统是方便理解既然这个系统就是指shell那么一个使用/bin/sh作为解释器的脚本是不是可以省去第一行呢是的。
作为解释器参数
这种运行方式是直接运行解释器其参数就是shell脚本的文件名如
/bin/sh test.sh
/bin/php test.php这种方式运行的脚本不需要在第一行指定解释器信息写了也没用。
变量
定义变量
定义变量时变量名不加美元符号$如
your_nameqinjx注意变量名和等号之间不能有空格这可能和你熟悉的所有编程语言都不一样。
除了显式地直接赋值还可以用语句给变量赋值如
for file in ls /etc使用变量
使用一个定义过的变量只要在变量名前面加美元符号即可如
your_nameqinjx
echo $your_name
echo ${your_name}变量名外面的花括号是可选的加不加都行加花括号是为了帮助解释器识别变量的边界比如下面这种情况
for skill in Ada Coffe Action Java; doecho I am good at ${skill}Script
done如果不给skill变量加花括号写成echo I am good at s k i l l S c r i p t 解释器就会把 skillScript解释器就会把 skillScript解释器就会把skillScript当成一个变量其值为空代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号这是个好的编程习惯。IntelliJ IDEA编写shell script时IDE就会提示加花括号。
重定义变量
已定义的变量可以被重新定义如
your_nameqinjx
echo $your_nameyour_namealibaba
echo $your_name这样写是合法的但注意第二次赋值的时候不能写$your_name“alibaba”使用变量的时候才加美元符。
注释
以“#”开头的行就是注释会被解释器忽略。
多行注释
sh里没有多行注释只能每一行加一个#号。就像这样
#--------------------------------------------
# 这是一个自动打ipa的脚本基于webfrogs的ipa-build书写https://github.com/webfrogs/xcode_shell/blob/master/ipa-build# 功能自动为etao ios app打包产出物为14个渠道的ipa包
# 特色全自动打包不需要输入任何参数
#--------------------------------------------##### 用户配置区 开始 #####
#
#
# 项目根目录推荐将此脚本放在项目的根目录这里就不用改了
# 应用名确保和Xcode里Product下的target_name.app名字一致
#
##### 用户配置区 结束 #####如果在开发过程中遇到大段的代码需要临时注释起来过一会儿又取消注释怎么办呢每一行加个#符号太费力了可以把这一段要注释的代码用一对花括号括起来定义成一个函数没有地方调用这个函数这块代码就不会执行达到了和注释一样的效果。
字符串
字符串是shell编程中最常用最有用的数据类型除了数字和字符串也没啥其它类型好用了哈哈字符串可以用单引号也可以用双引号也可以不用引号。单双引号的区别跟PHP类似。
单引号
strthis is a string单引号字符串的限制
单引号里的任何字符都会原样输出单引号字符串中的变量是无效的单引号字串中不能出现单引号对单引号使用转义符后也不行
双引号
your_nameqinjx
strHello, I know your are \$your_name\! \n双引号里可以有变量双引号里可以出现转义字符
字符串操作
拼接字符串
your_nameqinjx
greetinghello, $your_name !
greeting_1hello, ${your_name} !echo $greeting $greeting_1获取字符串长度
stringabcd
echo ${#string} #输出4提取子字符串
stringalibaba is a great company
echo ${string:1:4} #输出liba查找子字符串
stringalibaba is a great company
echo expr index $string is#输出3这个语句的意思是找出字母i在这名话中的位置要在linux下运行mac下会报错更多
参见本文档末尾的参考资料中Advanced Bash-Scripting Guid Chapter 10.1
数组
管道
条件判断
流程控制
和Java、PHP等语言不一样sh的流程控制不可为空如
?php
if (isset($_GET[q])) {search(q);
}
else {//do nothing
}在sh/bash里可不能这么写如果else分支没有语句执行就不要写这个else。
还要注意sh里的if [ $foo -eq 0 ]这个方括号跟Java/PHP里if后面的圆括号大不相同它是一个可执行程序和ls, grep一样想不到吧在CentOS上它在/usr/bin目录下
ll /usr/bin/[
-rwxr-xr-x. 1 root root 33408 6月 22 2012 /usr/bin/[正因为方括号在这里是一个可执行程序方括号后面必须加空格不能写成if [$foo -eq 0]
if else
if
if condition
thencommand1 command2...commandN
fi写成一行适用于终端命令提示符
if ps -ef | grep ssh; then echo hello; fi末尾的fi就是if倒过来拼写后面还会遇到类似的
if else
if condition
thencommand1 command2...commandN
elsecommand
fiif else-if else
if condition1
thencommand1
elif condition2command2
elsecommandN
fifor while
for
在开篇的示例里演示过了
for var in item1 item2 ... itemN
docommand1command2...commandN
done写成一行
for var in item1 item2 ... itemN; do command1; command2… done;C风格的for
for (( EXP1; EXP2; EXP3 ))
docommand1command2command3
donewhile
while condition
docommand
done无限循环
while :
docommand
done或者
while true
docommand
done或者
for (( ; ; ))until
until condition
docommand
donecase
case ${opt} inInstall-Puppet-Server )install_master $1exit;;Install-Puppet-Client )install_client $1exit;;Config-Puppet-Server )config_puppet_masterexit;;Config-Puppet-Client )config_puppet_clientexit;;Exit )exit;;* ) echo Bad option, please choose again
esaccase的语法和C family语言差别很大它需要一个esac就是case反过来作为结束标记每个case分支用右圆括号用两个分号表示break
函数
定义
调用
文件包含
可以使用source和.关键字如
source ./function.sh
. ./function.sh在bash里source和.是等效的他们都是读入function.sh的内容并执行其内容类似PHP里的include为了更好的可移植性推荐使用第二种写法。
包含一个文件和执行一个文件一样也要写这个文件的路径不能光写文件名比如上述例子中:
. ./function.sh不可以写作
. function.sh如果function.sh是用户传入的参数如何获得它的绝对路径呢方法是
real_pathreadlink -f $1#$1是用户输入的参数如function.sh
. $real_path用户输入
执行脚本时传入
脚本运行中输入
select菜单
stdin和stdout
常用的命令
sh脚本结合系统命令便有了强大的威力在字符处理领域有grep、awk、sed三剑客grep负责找出特定的行awk能将行拆分成多个字段sed则可以实现更新插入删除等写操作。
ps
查看进程列表
grep
排除grep自身
查找与target相邻的结果
awk
sed
插入
替换
删除
xargs
curl
综合案例
参考资料
Advanced Bash-Scripting Guide非常详细非常易读大量example既可以当入门教材也可以当做工具书查阅Unix Shell ProgrammingLinux Shell Scripting Tutorial - A Beginner’s handbook