一篇文章学会shell脚本
一、Shell传递参数
#!/bin/bash # 假设在脚本运行时写了三个参数 、、,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "" "" ""(传递了三个参数)。 echo "-- \$* 演示 --"
for i in "$*"; do
echo $i
done echo "-- \$@ 演示 --"
for i in "$@"; do
echo $i
done
运行:
$ sh shell.sh
-- $* 演示 -- -- $@ 演示 --
二、Shell数组
#!/bin/bash
my_array=(A B "C" D)
echo "第一个元素:${my_array[0]}"
echo "第二个元素:${my_array[1]}"
echo "第三个元素:${my_array[2]}"
echo "第四个元素:${my_array[3]}"
echo "数组的元素为:${my_array[*]}" # 获取数组中的所有元素
echo "数组的元素为:${my_array[@]}" # 获取数组中的所有元素
echo "数组元素个数为:${#my_array[*]}" # 获取数组的长度
echo "数组元素个数为:${#my_array[@]}" # 获取数组的长度
运行:
第一个元素:A
第二个元素:B
第三个元素:C
第四个元素:D
数组的元素为:A B C D
数组的元素为:A B C D
数组元素个数为:
数组元素个数为:
三、Shell运算符
1、算术运算符
#!/bin/bash
a=
b= val=`expr $a + $b`
echo "a + b = $val" val=`expr $a - $b`
echo "a - b = $val" val=`expr $a \* $b`
echo "a * b = $val" val=`expr $b / $a`
echo "b / a = $val" val=`expr $b % $a`
echo "b % a = $val" if [ $a == $b ]
then echo "a==b"
fi if [ $a != $b ]
then echo "a!=b"
fi
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
- 乘号(*)前边必须加反斜杠(\)才能实现乘法运算;
运行:
a + b =
a - b = -
a * b =
b / a =
b % a =
a!=b
2、关系运算符
#!/bin/bash a=
b= if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b : a 不等于 b"
fi if [ $a -ne $b ]
then
echo "$a -ne $b : a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于等于 b"
else
echo "$a -ge $b: a 小于 b"
fi if [ $a -le $b ]
then
echo "$a -le $b: a 小于等于 b"
else
echo "$a -le $b: a 大于 b"
fi
运行:
-eq : a 不等于 b
-ne : a 不等于 b
-gt : a 不大于 b
-lt : a 小于 b
-ge : a 小于 b
-le : a 小于等于 b
3、布尔运算符
#!/bin/bash a=
b= if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b : a 等于 b"
fi if [ $a -lt -a $b -gt ]
then
echo "$a 小于100 且 $b 大于 15 : 返回true"
else
echo "$a 小于100 且 $b 大于 15 : 返回false"
fi
if [ $a -lt -o $b -gt ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt -o $b -gt ]
then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
运行:
!= : a 不等于 b
小于100 且 大于 : 返回true
小于 或 大于 : 返回 true
小于 或 大于 : 返回 false
4、逻辑运算符
#!/bin/bash a=
b= if [[ $a -lt && $b -gt ]]
then
echo "返回 true"
else
echo "返回 false"
fi if [[ $a -lt || $b -gt ]]
then
echo "返回 true"
else
echo "返回 false"
fi
运行:
返回 false
返回 true
5、字符串运算符
#!/bin/bash a="abc"
b="efg" if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
运行:
abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为
-n abc : 字符串长度不为
abc : 字符串不为空
6、文件测试运算符
#!/bin/bash file="/doc/shell-operator.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi if [ -d $file ]
then
echo "文件为目录"
else
echo "文件为非目录"
fi if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
运行:
文件可读
文件可写
文件不可执行
文件为普通文件
文件为非目录
文件不为空
文件存在
四、Shell echo
#!/bin/bash echo "\"It is a test\"" # 显示转义字符 echo -e "OK! \n" # -e 开启转义
echo "It is a test" #!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test" echo '$name\"' # 原样输出字符串,不进行转义或取变量(用单引号) echo `date` # 显示命令执行结果
运行:
"It is a test"
-e OK! It is a test
-e OK! It is a test
$name\"
2019年 7月24日 星期三 21时01分00秒 CST
五、Shell printf
#!/bin/bash # %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
# %-4.2f 指格式化为小数,其中.2指保留2位小数。
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 # format-string为双引号
printf "%d %s\n" "abc" # 单引号与双引号效果一样
printf '%d %s\n' "abc" # 没有引号也可以输出
printf %s abcdef # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 如果没有 arguments,那么 %s 用NULL代替,%d 用 代替
printf "%s and %d \n"
运行:
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
abc
abc
abcdefabcdefabc
def
a b c
d e f
g h i
j
and
六、Shell test
#!/bin/bash num1=
num2=
if test $[num1] -eq $[num2]
then
echo "两个数相等"
else
echo "两个数不相等"
fi a=
b= result=$[a+b] # 代码中的 [] 执行基本的算数运算
echo "result为:$result" num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
运行:
两个数相等
result为:
两个字符串不相等!
七、Shell 流程控制
#!/bin/bash # if else a=
b=
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi # for 循环
for loop in
do
echo "The value is: $loop"
done # while语句
# 以下是一个基本的while循环,测试条件是:如果int小于等于5,那么条件返回真。int从0开始,每次循环处理时,int加1。运行上述脚本,返回数字1到5,然后终止。
int=
while(( $int<= ))
do
echo $int
let "int++" # 使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
done
运行:
a 小于 b
The value is:
The value is:
The value is:
The value is:
The value is:
八、函数
#!/bin/bash # 最简单的函数及调用
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----" # 带return的函数
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" # 带参数的函数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !" # 注意,$ 不能获取第十个参数,获取第十个参数需要${}。当n>=10时,需要使用${n}来获取参数。
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam
运行:
-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----
这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 输入第二个数字: 两个数字分别为 和 !
输入的两个数字之和为 !
第一个参数为 !
第二个参数为 !
第十个参数为 !
第十个参数为 !
第十一个参数为 !
参数总数有 个!
作为一个字符串输出所有参数 !
九、输入、输出重定向
| 命令 | 说明 |
|---|---|
| command > file | 将输出重定向到 file。 |
| command < file | 将输入重定向到 file。 |
| command >> file | 将输出以追加的方式重定向到 file。 |
| n > file | 将文件描述符为 n 的文件重定向到 file。 |
| n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
| n >& m | 将输出文件 m 和 n 合并。 |
| n <& m | 将输入文件 m 和 n 合并。 |
| << tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
首先新建users文件
$ cat users
_mbsetupuser console Oct :
user console Oct :
user2 console Dec :
1、输出重定向
输出重定向会覆盖文件内容:
$ echo "测试输出重定向" > users
$ cat users
测试输出重定向
$
如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾:
$ echo "测试输出重定向" >> users
$ cat users
测试输出重定向
测试输出重定向
$
2、输入重定向
现需要统计 users 文件的行数,执行以下命令:
$ wc -l users
users
将输入重定向到 users 文件:
$ wc -l < users
注意:结果不同原因:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。
3、/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
十、文件包含
语法:
. filename # 注意点号(.)和文件名中间有一空格 或 source filename
使用 . 或者 source来包含文件即可。
一篇文章学会shell脚本的更多相关文章
- 一篇文章学会shell工具篇之sed
sed工具执行原理; 有关sed的参数及action的常见操作方法; 定址; 模式空间和保持空间; 使用标签 1.首先先来了解一下什么是sed? sed叫做流编辑器,在shell脚本和Makefile ...
- 让你快速学会Shell脚本
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合.Shell可以直接使用在win/Unix/Linux上面, ...
- 第十二章 学习 shell脚本之前的基础知识
http://www.92csz.com/study/linux/12.htm [什么是shell] 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和 ...
- 第一章:shell脚本初入门
1.shell脚本中的source或者.空格再加上文件,表示加载文件中的命令及语句(困惑多时终于解开^-^) 2.脚本开头书写好作者版本等信息,方便维护:流程语句提前把格式写好,防止遗漏 3.定义字符 ...
- 【干货】一篇文章学会Gulp(Getting started with Gulp)
抛开Grunt,又有一个新的自动化构建系统成为新的领跑者.那就是Gulp. Gulp是一种直观.自动化构建的工具. 为什么前端er会这么感兴趣Gulp?我相信大家都有个思想:要么不做事,要做事就要把事 ...
- 一篇文章学会Docker命令
目录 简介 镜像仓库 login pull push search 本地镜像管理 images rmi tag build history save load import 容器操作 ps inspe ...
- 一篇文章学会Spring4.0
spring概述 spring 是一个开源框架. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是 ...
- 一篇文章学会springMVC(转)
说在前面 本文只是入门 为什么用springMVC?springMVC有什么有缺点?springMVC和Struts有什么区别?等等这些问题可以参考网路上资源,本文的重点是快速带入,让大家了解熟悉sp ...
- 一篇文章学会spark-streaming
版权申明:转载请注明出处.文章来源:bigdataer.net 1.什么是spark-streaming? 实际生产中会有许多应用到实时处理的场景,比如:实时监测页面点击,实时监测系统异常,实时监测来 ...
随机推荐
- Linux-普通用户切换为root身份
Linux 下普通用户免密码切换 root 用户 具体步骤: 1)编辑 su 文件打开第四行注释 # vim /etc/pam.d/su 2)将用户添加到 wheel 组 # usermod -G w ...
- NGINX并发量优化
NGINX并发量优化 一.压力测试 命令:ab -c 2000 -n 2000 web服务器的地址 ab:压力测试工具 -c:client缩写,客户端的数量 -n:总的访问量,所有客户端总共的访问量. ...
- struct并不报错
struct { int item; struct list* next; }list; 如果结构体定义如上,使用下面的代码,将会报错 //添加元素,由于我们实现的是单向链表,所以使用从尾部添加 bo ...
- Qualification Rounds(Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)+状态压缩)
题目链接 传送门 题意 现总共有\(n\)个题目\(k\)支参赛队伍,已知每个题目各队伍是否会写,现问你能否从题目中选出一个子序列使得每支队伍最多只会写一半的题目. 思路 对于每个题目我们用二进制压缩 ...
- 微信小程序~页面跳转和路由
一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面,如图3-6所示,在首页使用2次wx.navigateTo后,页面层级会有三层,我们把这样的一个页面层级称为页面栈.
- 补充拓展:CSS权重值叠加
都知道CSS选择器有权重优先级,权重大的优先展示. 但部分人可能不清楚,权重值也是可以叠加计算的 <!DOCTYPE html> <html> <head> < ...
- 与你一起学习MS Project——基础篇:Project基础应用
为了更清晰容易地熟悉掌握Project的基础应用,我们在基础篇中一起来学习掌握在Project中如何做进度计划.资源计划.成本计划以及跟踪项目的执行情况并生成所需的项目报表. 一.进度计划 这里,首先 ...
- linux添加用户adduser出现 useradd:cannot lock /etc/passwd; try again
找一下有个叫/etc/passwd.lock的文件,找到,给它用root删掉就好了,可能是上次使用到这个文件没有正常关闭.具体操作:切换到root用户,用cd etc到etc目录下,rm .pwd.l ...
- 优雅关闭web服务的方式
优雅关闭web服务 DBHelper, err = gorm.Open("mysql", "root:root@(115.159.59.129:3306)/test?ch ...
- S1_搭建分布式OpenStack集群_09 cinder 控制节点配置
一.创建数据库创建数据库以及用户:# mysql -uroot -p12345678MariaDB [(none)]> CREATE DATABASE cinder;MariaDB [(none ...