概述

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. Qt工程管理

    Qt Creator工程管理Qt Creator以工程项目的方式对源码进行管理一个Qt Creator工程包含不同类型的文件 .pro项目描述文件.pro.user用户配置描述文件 //由Qt Cre ...

  2. 防止ARP欺骗

    前言: 曾经因为宿舍里面的同学经常熬夜打游戏,好言相劝不管用,无奈之下使用arp欺骗他们的主机,使之晚上11点之后游戏延迟,掉线,最后,一到11点同学们就都上床睡觉了. 防止arp欺骗的三种思路: 在 ...

  3. centos 下 gradle 编译打包 apk

    由于Jenkins 装在centos环境下,想实现Android程序的编译,只能通过gradle 命令去打包版本apk,以下记录了如何在centos下使用gradle 打包apk 一.安装 gradl ...

  4. Provider和Consumer的搭建(六)

    创建三个Maven Project: dubbo-service:公共模块,包括服务接口(packaging:jar) dubbo-service-impl:服务提供方,提供服务接口的具体实现,需要依 ...

  5. zz姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖

    姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖 近日,美国艾尔弗·斯隆基金会(The Alfred P. Sloan Foundation)公布了2019年斯隆研究奖(Sloan Research ...

  6. 论文阅读笔记六十二:RePr: Improved Training of Convolutional Filters(CVPR2019)

    论文原址:https://arxiv.org/abs/1811.07275 摘要 一个训练好的网络模型由于其模型捕捉的特征中存在大量的重叠,可以在不过多的降低其性能的条件下进行压缩剪枝.一些skip/ ...

  7. Nginx主配置文件说明

    #运行用户 user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes ; #全局错误日志及PID文件 #error_log logs/error.log; ...

  8. 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像

    Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...

  9. SWIG 3 中文手册——4. 脚本语言

    目录 4 脚本语言 4.1 两种语言的概览 4.2 脚本语言如何调用 C? 4.2.1 包装器函数 4.2.2 变量链接 4.2.3 常量 4.2.4 结构体与类 4.2.5 代理类 4.3 构建脚本 ...

  10. CAS5单点登录

    看这篇文章即可:https://www.jianshu.com/p/c1273d81c4e4>https://www.jianshu.com/p/c1273d81c4e4