概述

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

Linux 的 Shell 种类众多,其中Bourne Again Shell(Bash),由于易用和免费,在日常工作中被广泛使用,同时也是大多数Linux 系统默认的 Shell。

基础

#!/bin/bash #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

新建一个文件*.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。

查看当前系统中可以shell程序:cat /etc/shells

查看当前系统中Shell程序的pid:$$

查看当前系统中Shell程序:$SHELL

运行 Shell 脚本有两种方法:1、chmod +x ./test.sh   ./test.sh 2、/bin/bash test.sh

变量

定义变量:YOURPATH=””, 变量名和等号之间不能有空格

使用变量:$ YOURPATH${YOURPATH}

变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。

推荐给所有变量加上花括号,这是个好的编程习惯。

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

如:myUrl=http://www.google.com   readonly myUrl

使用 unset 命令可以删除变量,变量被删除后不能再次使用。

unset 命令不能删除只读变量。

运行shell时,会同时存在三种变量:1) 局部变量 2) 环境变量 3) shell变量

获取变量字符串长度:string="abcd"  echo ${#string}  #输出 4

提取子字符串:string="runoob"   echo ${string:1:4}   #输出 unoo

定义数组:array_name=(value0 value1 value2 value3)

读取数组:valuen=${array_name[n]}

获取数组的长度:length=${#array_name[@或*]}

反引号[`]用于命令替换,如`pwd`将pwd命令的输出展开使用

包含外部脚本:. 空格 *.sh

以 # 开头的行就是注释,会被解释器忽略。

多行注释还可以使用以下格式:

:<<EOF               EOF

:<<'                     '

:<<!                      !

Shell 传递参数

$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

$#   传递到脚本的参数个数

$*    以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$$    脚本运行的当前进程ID号

$!    后台运行的最后一个进程的ID号

$@  与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。

$-    显示Shell使用的当前选项,与set命令功能相同。

$?    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

各种运算符

Shell 和其他编程语言一样,支持多种运算符,包括:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符。

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

val=`expr 2 + 2`
echo "两数之和为 : $val"

-eq  检测两个数是否相等,相等返回 true。

-ne  检测两个数是否不相等,不相等返回 true。

-gt   检测左边的数是否大于右边的,如果是,则返回
true。

-lt    检测左边的数是否小于右边的,如果是,则返回 true。

-ge  检测左边的数是否大于等于右边的,如果是,则返回 true。

-le   检测左边的数是否小于等于右边的,如果是,则返回 true。

!      非运算,表达式为 true 则返回 false,否则返回 true。

-o    或运算,有一个表达式为 true 则返回 true。

-a    与运算,两个表达式都为 true 才返回 true。

&&  逻辑的 AND

||      逻辑的 OR

=     检测两个字符串是否相等,相等返回
true。

!=    检测两个字符串是否相等,不相等返回
true。

-z    检测字符串长度是否为0,为0返回 true。

-n    检测字符串长度是否为0,不为0返回 true。

$      检测字符串是否为空,不为空返回
true。

-b file     检测文件是否是块设备文件,如果是,则返回 true。

-c file      检测文件是否是字符设备文件,如果是,则返回 true。

-d file     检测文件是否是目录,如果是,则返回
true。

-f file      检测文件是否是普通文件(不是目录,也不是设备文件),Yes,则返回 true。      -g file     检测文件是否设置了 SGID 位,如果是,则返回 true。

-k file      检测文件是否设置了粘着位(Sticky
Bit),如果是,则返回 true。

-p file     检测文件是否是有名管道,如果是,则返回
true。

-u file     检测文件是否设置了 SUID 位,如果是,则返回 true。

-r file      检测文件是否可读,如果是,则返回
true。

-w file     检测文件是否可写,如果是,则返回
true。

-x file      检测文件是否可执行,如果是,则返回
true。

-s file      检测文件是否为空(文件大小是否大于0),不为空返回 true。

-e file      检测文件(包括目录)是否存在,如果是,则返回 true。

输出

Shell 的 echo 指令常用,都是用于字符串的输出。

echo "It is
a test"

echo
"\"It is a test\""

echo "$name
It is a test"

echo -e
"OK! \n"                        #
-e 开启转义

echo -e
"OK! \c"                        #
-e 开启转义 \c 不换行

echo "It is
a test" > myfile           # 显示结果定向至文件

echo `date`                                 # 显示命令执行结果

printf 命令模仿 C 程序库(library)里的
printf() 程序。

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

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

流程控制

if condition1

then

command1

elif condition2

then

command2

else

commandN

fi

 

for var in item1 item2 ... itemN

do

command1

command2

...

commandN

done

 

while condition

do

command

done

 

until condition

do

    command

done

 

casein

模式1)

command1

command2

...

commandN

;;

模式2)

command1

command2

...

commandN

;;

Esac

可以使用break跳出循环,使用continue继续下一次循环

函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

demoFun(){

echo "这是我的第一个
shell 函数!"

}

echo "-----函数开始执行-----"

demoFun

echo "-----函数执行完毕-----"

funWithParam(){

echo "第一个参数为
$1 !"

echo "第二个参数为
$2 !"

echo "第十个参数为
$10 !"

echo "第十个参数为
${10} !"

echo "第十一个参数为
${11} !"

echo "参数总数有 $#
个!"

echo "作为一个字符串输出所有参数 $* !"

}

funWithParam 1 2
3 4 5 6 7 8 9 34 73

 

重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端

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 之间的内容作为输入。

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

总结

Shell脚本需要多多实战练习,可以实现众多复杂的功能,提高办事效率。

参考

https://www.runoob.com/linux/linux-shell.html

https://devhints.io/bash

shell脚本初学者笔记的更多相关文章

  1. shell 脚本实战笔记(10)--spark集群脚本片段念念碎

    前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd &quo ...

  2. shell脚本编写笔记

    包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...

  3. Shell 脚本编程笔记(一) Hello Shell

    最近不断在接触Linux操作系统,对它一个终端走天下的特性感到十分新奇和伟大.同时也被各种命令折磨的死去活来...公司的一个老同事给我讲,在公司的极品geek宅都是只用一个黑黑的框完成一切的.结果我一 ...

  4. shell脚本学习笔记(符号)

    shell脚本的学习: 1.Shell的作用是解释运行用户的命令,用户输入一条命令,Shell就解释运行一条,这样的方式称为交互式(Interactive),Shell还有 一种运行命令的方式称为批处 ...

  5. linux shell脚本编程笔记(二): 分支结构

    1.if if command then commands fi if command then commands else commands fi if command1 then command ...

  6. shell脚本学习笔记 (流编辑器sed)

    sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不 ...

  7. shell脚本入门笔记

    转载:http://mp.weixin.qq.com/s?__biz=MzA3MTIxNzkyNg==&mid=204081791&idx=1&sn=27bb1d827e0f8 ...

  8. shell脚本自学笔记

    一. 什么是Shell脚本 shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本.事实上,shell脚本就是一些命令的集合. 假如完成某个需求需要一 ...

  9. Shell脚本学习笔记之(自动填充函数模板)

    其实,vii 就是写的一个脚本,跟 vi 没半毛钱关系,只不过借用一下这个名字而已.那这个脚本长什么样呢?look: 下面来详细的解析上面的代码,来看第1行: #!/bin/bash 这是Shell脚 ...

随机推荐

  1. Git 创建点开头的文件和目录

    Git 创建点开头的文件和目录 # 创建 .gitignore 文件 1@DESKTOP-3H9092J MINGW64 /e/x1/x1/demo1 (master) $ echo .idea &g ...

  2. NOIP 2006 金明的预算方案

    洛谷 P1064 金明的预算方案 https://www.luogu.org/problem/P1064 JDOJ 1420: [NOIP2006]金明的预算方案 T2 https://neooj.c ...

  3. LG2053/BZOJ1070 「SCOI2007」修车 费用流

    问题描述 LG2053 BZOJ1070 题解 将\(m\)个修理工拆为\(n \times m\)个,将修理工和车辆看做二分图,连出一个完全二分图. 边流量为\(1\),费用为时间,费用流即可. \ ...

  4. 集合(List、Set、Map)

    一.集合与数组 数组:长度固定,数组元素可以是基本类型,也可以是对象.不适合在对象数量未知的情况下使用. 集合:(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. Java集合类存放 ...

  5. Codeforces Round #507 (Div. 2, based on Olympiad of Metropolises) D mt19937

    https://codeforces.com/contest/1040/problem/D 用法 mt19937 g(种子); //种子:time(0) mt19937_64 g(); //long ...

  6. 牛客CSP-S提高组赛前集训营2 ———— 2019.10.31

    比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa  cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostrea ...

  7. [LeetCode] 29. Divide Two Integers 两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  8. 命令行编译带外部包依赖的java源文件 [以JDBC MySQL8为例]

    环境: MySQL8 JDK11(SE) 首先下载MySQL8的JDBC驱动 https://dev.mysql.com/downloads/connector/j/选 PlatForm Indepe ...

  9. 多模态数据联合Embedding的方法小结

    当模型需要接受多个模态的数据时,往往需要设计合适的方法让他们能进行信息的融合,Joint embedding是一种较为普遍的思路,即将他们映射到同一个向量空间中,再进行融合. 向量拼接.元素级相乘.做 ...

  10. 好用的低延迟vps

    ZeptoVM是一个俄罗斯的云提供商, 由于提供了黑龙江北边的机房, 所以延迟比较低 注意一定要选Khabarovsk节点, 这个节点延迟很低, 我在上海延迟大约有70ms 缺点就是比较贵, 按照年付 ...