一、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. 【笔记】MAML-模型无关元学习算法

    目录 论文信息: Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networ ...

  2. PEP 8016-Python之父重回决策层

      PEP 8016-Python之父重回决策层 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 去年,技术社区里还发生了一件大事:Linux 之父 Linus Torvalds 宣 ...

  3. 矩阵指数 Matrix Exponentials

    转自:https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%98%B5%E6%8C%87%E6%95%B0 其中,X. X2.X3…….Xk 都是n阶矩阵,显然 exp ...

  4. anyproxy学习4-Linux(Centos)搭建anyproxy环境

    前言 anyproxy可以跨平台使用,前面第一篇是搭建在windows机器上,本篇讲如何在linux上搭建anyproxy环境,当然有mac的小伙伴也可以用mac去搭建一个环境. nodejs安装 a ...

  5. 51nod 1115 最大M子段和 V3

    环形最大M子段和,N个整数组成的序列排成一个环,a[1],a[2],a[3],…,a[n](a[n-1], a[n], a[1]也可以算作1段),将这N个数划分为互不相交的M个子段,并且这M个子段的和 ...

  6. C# 保存文件到数据库

    html <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUploa ...

  7. test20190909 Gluttony

    0+0+0+0+0+0=0.毒瘤出题人. BJOI2019 勘破神机 地灾军团的军师黑袍从潜伏在精灵高层的密探手中得知了神杖的情报,他对奥术宝石中蕴含的远古神秘力量十分感兴趣.他设计夺取了数块奥术宝石 ...

  8. LightOJ - 1333 - Grid Coloring

    链接: https://vjudge.net/problem/LightOJ-1333 题意: You have to color an M x N two dimensional grid. You ...

  9. 06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作

    上篇文章中,我们只看到了 dio 的使用方式,但并未跟应用关联起来,所以这一篇将 dio 网络请求与应用界面结合起来,当然这也是为以后的实战作基础准备,基础打牢,我们才能飞速前进. 1.案例说明 我们 ...

  10. Tensorflow细节-P312-PROJECTOR

    首先进行数据预处理,需要生成.tsv..jpg文件 import matplotlib.pyplot as plt import numpy as np import os from tensorfl ...