概述

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. python requests访问https的链接,不打开fiddler的情况下不报错;若是打开fiddler则报ssl错误,请求中添加verify=False,会报警告;若不想看到警告,有3种方式;

    import requests# import warnings# warnings.filterwarnings("ignore") #方法一#requests.packages ...

  2. 201871010104-陈园园 《面向对象程序设计(java)》第十四周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第十四周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  3. (translation.E004) You have provided a value for the LANGUAGE_CODE setting that is not in the LANGUAGES setting.

    django3.0开始LANGUAGE_CODE前面必须配相应的LANGUAGES配置如下: from django.utils.translation import gettext_lazy as ...

  4. 测试脚本中的等待方法 alter对话框处理

    测试脚本中的等待方法 等待是为了使脚本执行更加稳定 1. 常用的休眠方式:time模块的sleep方法 2. selenium模块中的等待方法 等待查找5s 查找不到就报错 对登录测试py进行修改 a ...

  5. zz扔掉anchor!真正的CenterNet——Objects as Points论文解读

    首发于深度学习那些事 已关注写文章   扔掉anchor!真正的CenterNet——Objects as Points论文解读 OLDPAN 不明觉厉的人工智障程序员 ​关注他 JustDoIT 等 ...

  6. Sublime Text 3安装GoSublime

      GoLand IDE工具虽然在编程时很好用,但是在使用中也有个问题,有时我们可能只是写一个简单的脚本来测试,对于我而言在打开IDE太重量级了,所以捣鼓了GoSublime工具来满足平时最基本的需求 ...

  7. 创建vector<T>容器

    vector<T> 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自动增长,从而可以包含任意数 ...

  8. ASP.NET Core 进程内(InProcess)托管

    ASP.NET Core 进程内(InProcess)托管 在 ASP.NET Core 中的进程内(InProcess)托管模型 什么是 Kestrel 服务器 当一个 ASP.NET Core 应 ...

  9. cf1039D 分块

    cf1039D 链接 cf 思路 一次k可以贪心O(n)算. 对于\(≤\sqrt{n}\)的k,暴力算. 对于\(>\sqrt{n}\)的k,最多会有\(\sqrt{n}\)种答案,而且答案单 ...

  10. 【UVA1303】Wall(凸包)

    点此看题面 大致题意: 给你一个多边形,要求建一面墙使得墙上的点至少离多边形每个顶点\(R\)的距离,求最短的墙长. 考虑\(R=0\) 考虑当\(R=0\)时,所求的答案显然就是求得的凸包的周长. ...