可以理解为终端是一个容器或环境,而 Shell 是在这个环境中运行的一个工具。命令提示符是 Windows 系统中的一种终端实现。
shell本身是C开发的程序,用来方便用户和系统交互。shell脚本缀为.sh。如果用 php 写 shell 脚本,扩展名就用 php 。
运行shell的两种方法:
1.作为可执行程序
需要给用户执行权限才可以。这种方法运行的shell在第一行需要输入#! bin/bash这样的代码用来告诉系统用什么解释器运行。然后直接运行shell即可。例如:
./test.sh
2.作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh /bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
shell的变量
shell赋值等号两边不要加空格。例如a = 1就是错的,应该是a=1。
shell变量的命名方式和C++差不多。
使用一个定义过的变量时,只需要在变量名字前面加$。数字4上方对应的符号。
使用readonly可以指定一个变量为只读。等想修改它的内容,只能是报错。
unset则是删除变量。使用readonly和unset的时候就不用加$。
变量类型
1.字符串,可以使用"或者'。但是单引号内的内容会原样输出,也不能使用转义字符。单引号成对出现,可以字符串拼接。与之相反,双引号可以用转义字符,而且可以打印变量。
单引号包裹的字符串中换行,这个字符串在实际使用时是不会换行的。可以用双引号转义字符实现换行。
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
获取字符串长度:echo ${#string},#代表获取长度
截取字符串${string:1:4}(从第二个字符串到第四个,有点像python的切片)
查找指定字符的索引 :expr index 字符串 要查的
命令替换(反引号实现):例如
echo `expr index "$string" io` ,就是把expr index的输出作为echo的参数。
2.数组
shell可以实现数组嵌套,但是没有二维数组。
创建数组的语法:array_name=(value1 value2 ... valuen)
也可以采取直接索引赋值,和python的字典有点类似。
可以通过索引值访问元素。${array_name[12334]}
假如[]里面是@或者*,意思是全部,前面加#就会输出长度,否则就会输出里面所有的值。、
3.关联数组
有点像py字典的阉割版,只支持字符串。
#可以直接定义
declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")
#可以先声明后定义
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"
如果要访问他,索引值改为【】内的字符即可。
在使用数组时。数组前加一个感叹号 ! 可以获取数组的所有键,例如:
注释
shell的注释非常简单,就是#。
多行注释的实现方法有两种,一种为定义一个函数,里面写注释,但是从来不调用它。
第二种是使用here文档,:命令是一个空命令。我们可以使用here文档的方式多行注释。
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
here文档本来是重定向使用的,用来提供多项输入输出,用来这里恰好。
不只是用EOF 可以用
: <<'COMMENT'
这是注释的部分。
可以有多行内容。
COMMENT
:<<'
注释内容...
注释内容...
注释内容...
'
:<<!
注释内容...
注释内容...
注释内容...
!
还可以直接使用冒号:
: '
这是注释的部分。
可以有多行内容。
'
获取参数
给shell脚本传参,也就是运行的时候直接在后面写上参数。平时运行的命令后面跟的,实际上也是参数,类似于ls -a后面跟的参数。
" * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)
可以使用 $1、$2 等来引用传递给脚本的参数。
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
其他特殊的以后再学习、补充。
(感谢菜鸟教程的教学)