一、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. Linux标准IO和管道

    Linux标准IO和管道 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.标准输入和输出 程序:指令+数据 读入数据:Input 输出数据:Output 打开的文件都有一个fd: ...

  2. 关于 ES5 & ES6 数组遍历的方法

    ES5 数组遍历方法 1.for 循环 , , , , ] ; i < arr.length; i++) { console.log(arr[i]) } 2.forEach , , , , ] ...

  3. Tulip Festival(线段树+二分+CDQ+带修改莫队+树套树)

    题目链接 传送门 线段树\(+\)二分思路 思路 比赛看到这题时感觉是一棵线段树\(+\)主席树,然后因为不会带修改主席树就放弃了,最后发现还卡了树套树. 由于本题数据保证序列中相同的数字不会超过20 ...

  4. 二维数组中的查找 - Java版 -简单二分查找 -<<剑指Offer>> -水题

    如题 (总结) -认真读题, 还WA了一次, https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&am ...

  5. 【Java】《Java程序设计基础教程》第七、八章学习

    第七章 异常处理 通过try...catch...finally结构来捕获一个或多个异常 第八章 Java的输入与输出及文件操作 8.1 文件 File类常用的方法 1. public boolean ...

  6. test201909027 老Z

    30+100+40=170.数据出锅*2,也是没谁了. 装饰 快要到 Mope 的生日了,Mope 希望举行一场盛大的生日派对. 派对的准备工作中当然有装饰房间啦.Mope 的房间里有按从左到右的顺序 ...

  7. django-登录后得个人信息

    Web请求中的认证:https://yiyibooks.cn/xx/django_182/topics/auth/default.html Django使用会话和中间件来拦截request 对象到认证 ...

  8. LeetCode 1087. Brace Expansion

    原题链接在这里:https://leetcode.com/problems/brace-expansion/ 题目: A string S represents a list of words. Ea ...

  9. Oracle iops测试

    DECLARE  lat  INTEGER;  iops INTEGER;  mbps INTEGER;BEGIN  DBMS_RESOURCE_MANAGER.CALIBRATE_IO(4, 10, ...

  10. c++ 将float 类型转换成string 类型

    string Convert(float Num) { ostringstream oss; oss<<Num; string str(oss.str()); return str; }