一、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. OracleXETNSListener无法启动或启动停止

    一.修改配置文件 1. 打开oracle的安装目录,找到下述文件"listener.ora" 2. 用文本编辑器打开“listener.ora”文件,找到下图所示位置:(HOST ...

  2. Vue命名规范

    views 命名 views 文件夹下面是由 以页面为单位的vue文件 或者 模块文件夹 组成的,放在 src 目录之下,与 components.assets 同级. views 下的文件夹命名 v ...

  3. Gorgeous Sequence(HDU5360+线段树)

    题目链接 传送门 题面 思路 对于线段树的每个结点我们存这个区间的最大值\(mx\).最大值个数\(cnt\).严格第二大数\(se\),操作\(0\): 如果\(mx\leq val\)则不需要更新 ...

  4. The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple (Mirror)

    B题 思路 因为 \[ x=\sum\limits_{k=1}^{n}ka_k\\ y=\sum\limits_{k=1}^{n}ka_{k}^{2} \] 我们设交换前和交换后的这两个等式的值设为\ ...

  5. Python学习进阶

    阅读目录 一.python基础 二.python高级 三.python网络 四.python算法与数据结构 一.python基础 人生苦短,我用Python(1) 工欲善其事,必先利其器(2) pyt ...

  6. 通过iptables限制docker容器端口

    如何限制docker暴露的对外访问端口 docker 会在iptables上加上自己的转发规则,如果直接在input链上限制端口是没有效果的.这就需要限制docker的转发链上的DOCKER表. # ...

  7. reshape()函数

    """ 1.当原始数组A[4,6]为二维数组,代表4行6列. A.reshape(-1,8):表示将数组转换成8列的数组,具体多少行我们不知道,所以参数设为-1.用我们的 ...

  8. 域权限维持:Ptk(Pass The Ticket)

    Kerberos协议传送门:https://www.cnblogs.com/zpchcbd/p/11707302.html 1.黄金票据 2.白银票据

  9. ztree异步加载---------补发周日内容

    上周六老师要求和大三的进行JAVA知识交流,总体来说就是给大三学长做的东西打分,然后大三学长再教我们如果构建ztree.毕竟第一次接触ztree,所以有很多不了解,但通过周六日努力,还是做出来了.现在 ...

  10. pgloader 学习(九) pg 2 pg 使用with 参数控制同步逻辑

    pgloader 支持比较丰富的配置参数,同时默认数据在同步的时候是会进行索.schema 以及数据的同步对于实际我们可能存在需要进行控制,我们可以通过with 参数方便的处理 参考配置 load 文 ...