SHELL基础
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
SHELL脚本
平时所说的 shell 通常都是指 shell 脚本,但是shell 和 shell script 是两个不同的概念。
示例:
vim test.sh
#!/bin/bash #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种shell
echo "this is test" echo 命令用于向窗口输出文本
:wq 保存退出
chmod +x test.sh 赋予执行权限
sh test.sh或./test.sh 执行脚本
SHELL变量
变量类型
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
定义变量
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线 _。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
示例:
your_name="wpc"
your_name="wpc_2"
your_name="wpc_test_bak"
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可。
示例:
your_name="wpc" 定义
echo $your_name或echo ${your_name} 使用
wpc 结果
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
示例:
your_name="wpc" 定义变量
readonly your_name 定义只读
删除变量
使用 unset 命令可以删除变量。
示例:
your_name="wpc" 定义
unset your_name 删除
SHELL符号和字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号
被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
示例:
test='this is test'
双引号
被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
your_name="wpc"
test="Hello, I know you are \"$your_name\"! \n"
echo -e $test
井号
井号出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行
分号
在 shell 中,担任"连续指令"功能的符号就是"分号"。
倒引号
在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行。要处理这种情况,我们得用倒单引号来做。
逗号
这个符号常运用在运算当中当做"区隔"用途。
斜线
在路径表示时,代表目录,在四则运算中,代表除法的符号。
倒斜线
在交互模式下的escape 字元,有几个作用;放在指令前,有取消 aliases的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行。
管道符
pipeline 是 UNIX 系统,基础且重要的观念。连结上个指令的标准输出,做为下个指令的标准输入。
惊叹号
通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于",在规则表达式中担任 “反逻辑” 的角色。
问号
在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元。
星号
相当常用的符号。在文件名扩展(Filename expansion)上,她用来代表任何字元,包含 null 字元,在运算时,它则代表 “乘法”。
次方运算
两个星号在运算时代表 “次方” 的意思。
钱号
变量替换(Variable Substitution)的代表符号,另外,在 Regular Expressions 里被定义为 “行” 的最末端 (end-of-line)。这个常用在grep、sed、awk 以及 vim(vi) 当中。
${} 变量的正规表达式
$* 引用script的执行引用变量,引用参数的算法与一般指令相同,指令本身为0,其后为1,然后依此类推。
$@ 与 $* 具有相同作用的符号,不过她们两者有一个不同点,符号 $* 将所有的引用变量视为一个整体。但符号 $@ 则仍旧保留每个引用变量的区段观念。
$# 这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少。
$? 状态值 ,UNIX(linux) 系统的进程以执行系统调用exit()来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。
大括号
有时候 script 当中会出现,大括号中会夹着一段或几段以"分号"做结尾的指令或变数设定。大括号也被运用在 “函数” 的功能上。广义地说,单纯只使用大括号时,作用就像是个没有指定名称的函数一般。因此,这样写 script也是相当好的一件事。尤其对输出输入的重导向上,这个做法可精简 script 的复杂度。
中括号
常出现在流程控制中,扮演括住判断式的作用,这个符号在正则表达式中担任类似 “范围” 或 “集合” 的角色 。
括号
用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。
双括号
这组符号的作用与 let 指令相似,用在算数运算上,是 bash 的内建功能。
双中括号
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用 || 与&& 逻辑等符号。
& 后台工作
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
^
这个符号在规则表达式中,代表行的 “开头” 位置,在[]中也与"!"(叹号)一样表示“非”
输出/输入重导向
命令 | 说明 |
---|---|
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 之间的内容作为输入。 |
SHELL运算符
算术运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | 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。 |
关系运算符
运算符 | 说明 | 举例 |
---|---|---|
-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。 |
逻辑运算符
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
test命令
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
字符串测试
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
文件测试
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
示例:
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
num1="wpc"
num2="wpc1"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。
echo "It is a test" 显示普通字符
echo "\"It is a test\"" 显示转义字符
#!/bin/sh
name="wpc"
echo "$name It is a test" 显示变量
echo -e "OK! \c" # -e 显示不换行,开启转义 \c 不换行
echo -e "OK! \n" # -e 显示换行,-e 开启转义
echo "It is a test" > wpc 显示结果定向到文件
echo '$name\"' 原样输出字符,不进行转义或取变量
echo `date` 显示命令执行结果
SHELL传递参数
可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
示例:
vim wpc.sh
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
chmod +x wpc.sh
./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3