Shell学习笔记

sdjasj

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
2
3
4
your_name="tom" #定义变量 变量名和等号之间不能有空格
echo $your_name# 使用一个定义过的变量,只要在变量名前面加美元符号即可
your_name="alibaba"
echo ${your_name} #花括号是为了帮助解释器识别变量的边界 echo "${your_name}aafaf"

变量类型

运行shell时,会同时存在三种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

5.Shell 数组

定义

1
array_name=(value0 value1 value2 value3)

单独定义数组的各个分量:

1
2
3
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

读取数组

${数组名[下标]}

1
2
3
valuen=${array_name[n]} #取第n位元素
echo ${array_name[@]} #取所有元素
length=${#array_name[@]} # 取得数组元素的个数

6.Shell 传递参数

在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,其中 $0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。$1、$2 … $n"的形式输出所有参数。
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 如@用括起来的情况、以"$1" $2" … “$n” 的形式输出所有参数。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

$* 与 $@ 区别:

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

7.Shell运算

使用expr

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

两点注意:

  • 表达式和运算符之间要有空格,例如 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
2
3
4
5
6
7
8
9
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

8.2 for 循环

1
2
3
4
5
6
7
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

例子

1
2
3
4
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done

8.3 while 语句

1
2
3
4
while condition
do
command
done

8.4 跳出循环

break跳出所有循环

continue跳出当前循环

9.Shell 函数

格式

1
2
3
4
5
6
7
8
9
[ function ] funname [()]

{

action;

[return int;]

}

说明:

  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过$n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数,当n>=10时,需要使用${n}来获取参数

例子
1
2
3
4
5
6
7
8
9
10
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
  • 標題: 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 进行许可。
 留言