Shell学习笔记
SHELL编程
零碎知识点
echo -e "lbh666\tyzsb"
-e使字符串可以转义printf
命令类似C语言,printf "%d %d" 1 2
1.输入/输出重定向
命令 | 说明 |
---|---|
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 之间的内容作为输入。 |
文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
如 0 > file就是把标准输入重定向到file
$ gcc m1.c 2> errfile
表示把编译的错误信息重定向到文件errfile中,注意2与定向符">"之间不能有空格
<<tag用法:
1
2
3
4
5
6 $ wc -l << EOF
lbh666
666lbh
lbhlbh
EOF
3 # 输出结果为 3 行
1 | $ command < file1 >file2 |
command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
2.引号
-
双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
-
单引号:由单引号括起来的字符都作为普通字符出现
- 单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
- 单引号字符串的限制:
-
倒引号`
- 括起来的字符串被shell解释为命令行,将命令行执行结果替换原来被括起来的字符串
- 可以嵌套使用,内层的`需要用\转义
3.管道线
定义:管道线是由"|"隔开的若干命令组成的序列,每个命令执行时有独立的进程,前一个命令的输出是下一个命令的输入
例子:
1 | ls | grep m.\.c | wc -l |
统计当前目录中文名以m打头,后随一个字符所有C语言文件的数目
4.变量
变量名和等号之间不能有空格
1 | your_name="tom" #定义变量 变量名和等号之间不能有空格 |
变量类型
运行shell时,会同时存在三种变量:
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
5.Shell 数组
定义
1 | array_name=(value0 value1 value2 value3) |
单独定义数组的各个分量:
1 | array_name[0]=value0 |
读取数组
${数组名[下标]}
1 | valuen=${array_name[n]} #取第n位元素 |
6.Shell 传递参数
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,其中 $0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。$1、$2 … $n"的形式输出所有参数。 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 如@用括起来的情况、以"$1" $2" … “$n” 的形式输出所有参数。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$* 与 $@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
7.Shell运算
使用expr
1 | val=`expr 2 + 2` |
两点注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被 ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
8.Shell 流程控制
条件判断一般用[[]] 如if [[ $a > $b]]
8.1 if else-if else
1 | if condition1 |
8.2 for 循环
1 | for var in item1 item2 ... itemN |
例子
1 | for loop in 1 2 3 4 5 |
8.3 while 语句
1 | while condition |
8.4 跳出循环
break跳出所有循环
continue跳出当前循环
9.Shell 函数
格式
1 | [ function ] funname [()] |
说明:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过$n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数,当n>=10时,需要使用${n}来获取参数
例子
1 | funWithParam(){ |
- 標題: Shell学习笔记
- 作者: sdjasj
- 撰寫于: 2022-03-06 07:25:22
- 更新于: 2022-03-16 22:05:02
- 連結: https://redefine.ohevan.com/2022/03/06/Shell学习笔记/
- 版權宣告: 本作品采用 CC BY-NC-SA 4.0 进行许可。
留言