Shell学习笔记
Shell 学习
Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。
Shell既是一种命令语言,又是一种程序设计语言。
Shell也是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本(shell script),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为**#!/bin/bash**。#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。
变量
your_name="jacky"
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号$即可
1 | your_name="hello world" |
字符串
字符串是shell编程中最常用最有用的数据类型
单引号
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
双引号
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
拼接字符
1 | your_name="jacky" |
获取字符串长度
${#string}
提取子字符串
${string:1:4}
查找子字符串
???
数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
1 | # 定义 |
传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:**$n**
1 | $# # 参数个数 |
运算符
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
算数运算符
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
- 完整的表达式要被 ` ` 包含
+ - * / % = == !==, 其中条件表达式要放进[]中:[$a == $b] #mac系统用(($a == $b))
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
1 | a=10, b=20 |
布尔运算符
! -o -a 非,或(一个true则true),与(两个true则true)
逻辑运算符
1 | a=10, b=20 |
字符运算符
1 | a="abc", b="efg" |
文件检查符
1 | -b #是否块设备文件 |
echo命令
执行:echo string
- 普通字符可省略引号
\转义字符read name; echo $nameread 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量\n换行- 显示不换行
-e \c - 重定向
> - 单引号不转义
echo '$name\"'输出$name\" - 显示执行结果``
printf命令
printf 命令模仿 C 程序库(library)里的 printf() 程序。
标准所定义,因此使用printf的脚本比使用echo移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf format-string [arguments...]
格式替代符
- %s 宽度,%-10s宽度为10个字符(-表示左对齐,没有则表示右对齐)
- %c
- %d
- %f 指格式化为小数,%-4.2f 表示4位数其中2位小数,左对齐
转义序列
1 | \a |
test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
流程控制
if-else
1 | if [condition] |
for 循环
1 | for var in item1 item2 ... itemN |
while 循环
1 | while condition |
until 循环
until循环执行一系列命令直至条件为真时停止。
until循环与while循环在处理方式上刚好相反。
一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。
条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次
1 | until condition |
case
类似JS switch
1 | case var in |
跳出循环
break continue
esac
case语法需要一个esac作为结束标记,每一个分支用右圆括号,两个分号表示break
函数
1 | [function] funcName [()] # 可以用function funcName(),也可以 funcName() |
函数返回值在调用该函数后通过 $? 来获得。
所有函数在使用前必须定义。
参数
1 | $n ${n>=10} # 第n个参数$# # 参数个数$* # 所有参数用$@ # 所有参数分割表示$$ # 当前进程号$! # 后台运行的最后一个进程号$- # 显示Shell使用的当前选项$? # 退出状态,正常为0 |
输入/输出重定向
一个命令通常从标准输入(一般是终端)读取,处理后输出到标准输出(一般是终端)。
1 | command > filecommand < file # 输入重定向到filecommand >> file # 追加重定向输出n > file # 将文件描述符为 n 的文件重定向到 file。n >> file # 0 通常是标准输入(STDIN), # 1 是标准输出(STDOUT), # 2 是标准错误输出(STDERR)n >& m # 将输出文件 m 和 n 合并n <& m # 将输入文件 m 和 n 合并<< tag # 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
输入重定向
command < file1 > file2
如果想输出错误(stderr)到文件 command 2 > file # 2表示标准错误文件(stderr)
如果希望将 stdout 和 stderr 合并后重定向到 file command > file > 2 &> 1
Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
1 | wc -l << EOF 文本文本 文本文本EOF |
/dev/null
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null
如果希望屏蔽 stdout 和 stderr command > /dev/null 2>&1
文件包含
. filename 或者 source filename
1 | # test1.shurl="https://www.bing.com"# test2.sh. ./test1.sh #或者 source ./test1.shecho "Welcome to visit $url" |