一、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脚本的更多相关文章

  1. 一篇文章学会shell工具篇之sed

    sed工具执行原理; 有关sed的参数及action的常见操作方法; 定址; 模式空间和保持空间; 使用标签 1.首先先来了解一下什么是sed? sed叫做流编辑器,在shell脚本和Makefile ...

  2. 让你快速学会Shell脚本

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合.Shell可以直接使用在win/Unix/Linux上面, ...

  3. 第十二章 学习 shell脚本之前的基础知识

    http://www.92csz.com/study/linux/12.htm [什么是shell] 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具.实际上,在shell和 ...

  4. 第一章:shell脚本初入门

    1.shell脚本中的source或者.空格再加上文件,表示加载文件中的命令及语句(困惑多时终于解开^-^) 2.脚本开头书写好作者版本等信息,方便维护:流程语句提前把格式写好,防止遗漏 3.定义字符 ...

  5. 【干货】一篇文章学会Gulp(Getting started with Gulp)

    抛开Grunt,又有一个新的自动化构建系统成为新的领跑者.那就是Gulp. Gulp是一种直观.自动化构建的工具. 为什么前端er会这么感兴趣Gulp?我相信大家都有个思想:要么不做事,要做事就要把事 ...

  6. 一篇文章学会Docker命令

    目录 简介 镜像仓库 login pull push search 本地镜像管理 images rmi tag build history save load import 容器操作 ps inspe ...

  7. 一篇文章学会Spring4.0

    spring概述 spring 是一个开源框架. Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. Spring 是 ...

  8. 一篇文章学会springMVC(转)

    说在前面 本文只是入门 为什么用springMVC?springMVC有什么有缺点?springMVC和Struts有什么区别?等等这些问题可以参考网路上资源,本文的重点是快速带入,让大家了解熟悉sp ...

  9. 一篇文章学会spark-streaming

    版权申明:转载请注明出处.文章来源:bigdataer.net 1.什么是spark-streaming? 实际生产中会有许多应用到实时处理的场景,比如:实时监测页面点击,实时监测系统异常,实时监测来 ...

随机推荐

  1. javascript中 typeof和instanceof的区别

    <一> js中typeof的用法进行了详细的汇总介绍 (1)返回一个变量的基本类型 回顾基本类型(number,string,boolean,null,undefined,object) ...

  2. 使用Arduino连接HC-SR04超声波距离传感器的方法

    距离传感器是机器人项目最有用的传感器之一. HC-SR04是一种便宜的超声波距离传感器,可以帮助您的机器人在房间周围导航.通过一些努力和一个额外的组件,它也可以用作测量设备.在这篇文章中,您将学习到通 ...

  3. mysql终止当前正在执行的sql语句

    show processlist;找出你要停止的语句然后找出你要终止的语句的idkill 248

  4. django项目使用layui插件给网站设置一个日历挂件,很简单实用。

    进入https://www.layui.com/首页下载layui文件 下载解压后把文件放在static静态文件中, html页面引入css和js <link rel="stylesh ...

  5. python学习类与方法的调用规则

    1类方法的特点是类方法不属于任何该类的对象,只属于类本身 2类的静态方法类似于全局函数,因为静态方法既没有实例方法的self参数也没有类方法的cls参数,谁都可以调用 3.实例方法只属于实例,是实例化 ...

  6. Apache虚拟主机&伪静态配置

    Apache基本操作 安装:yum install httpd 启动:systemctl start httpd 查看进程:ps -ef | grep httpd 查看端口:sudo netstat ...

  7. 大数据之路week07--day07 (修改mysql默认编码)

    在Sqoop导入或者导出,我们在查看mysql的时候会出现中文乱码大部分乱码会是?这样的问号,那么该怎么处理呢? 1.打开my.cnf文件  vim /etc/my.cnf 2.找到对应需要修改的地方 ...

  8. Linux中的CentOS 6克隆之后修改

    Centos6 克隆后的简单的网络配置 第一步:修改主机名 $ vi /etc/sysconfig/network     第二步: $ vi  /etc/udev/rules.d/70-persis ...

  9. web自动化测试-获得验证信息

    一.概述 1.在编写功能测试用例时,会假定一个预期结果,在执行用例过程中把得到的实际结果与预期结果进行比较,从而判断用例的通过与失败 2.自动化测试用例是由机器去执行,通常机器并不像人一样有思维和判断 ...

  10. LeetCode 1049. Last Stone Weight II

    原题链接在这里:https://leetcode.com/problems/last-stone-weight-ii/ 题目: We have a collection of rocks, each ...