shell是一个命令行解析器,它接收应用程序/用户命令,然后调用操作系统内核.
shell还是一个功能相当强大的编程语音,易编写,易调试,灵活性强.
shell命令,在linux终端能够被解析出来的命令,shell脚本就是由多个shell命令的集合,逻辑判断,循环,函数,变量
bash解析过程:
监测终端输入,有回车的时候输入完成,bash检测环境变量 path -> 有个路径,bash从前往后衣服遍历每个路径,检测各个路径中有没有用户输入的命令,如果找到了,执行该路径下的命令,如果没有找到,找下一个,最后还是没有找到,则提示这个命令无法解析.
![](https://img.haomeiwen.com/i15724863/f6abb389a429c5c7.png)
脚本格式以#!/bin/bash开头(指定解析器,这行可以省略不写)
#!/bin/bash
echo "honghonghuohuo"
运行脚本文件
$ sh helloworld.sh
$ bash helloworld.sh
添加执行权限:
普通目录的权限是:775.普通文件是:664
$ chmod 777 helloworld.sh
自己调用自己
$ ./helloworld.sh
变量
$HOME 家目录路径
$PWD 当前所在路径
$SHELL 默认解析器
$USER 当前用户
自定义变量(声明时,等号两侧不能有空格)
$ A=1
$ D="banzhuang love mm" (如果有空格,可以用引号括起来)
撤销定义过的变量
$ unset A
声明静态变量
$ readonly B=3 (不能unset)
提升为全局变量
$ export D
$ set D
特殊变量
$0-$9
可以获取外部传入的参数作为输出
Bryme-2:datas bryme$ cat teshu.sh
#!/bin/bash
echo "$0 $1 $2 $3"
$0代表该脚本的名称,$1-$9代表第一到第九个参数,当参数个数到达10个以上时用大括号包裹起来,如${10}
$#
获取输入参数的个数,用于循环
$ cat teshu.sh
#!/bin/bash
echo "$0 $1 $2 $3"
echo $#
用来获取当前传入参数的个数
$ bash teshu.sh banzhang
teshu.sh banzhang
1
$*
代表命令行中所有的参数,把所有的参数看成一个整体
$@
这个变量也代表命令行中所有的参数,不过吧每个参数区分对待
这两个的实际效果是一样的
$ bash teshu.sh banzhang mm
teshu.sh banzhang mm
2
banzhang mm
banzhang mm
$?
用来提示最后一次执行命令的返回状态,如果这个变量的值为0,证明上一个命令正确的执行了.如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了,
$ ./helloworld.sh
honghonghuohuo
banzhuang love mm
Bryme-2:datas bryme$ echo $?
0
"0"代表执行成功,非"0"值代表执行失败
$$
脚本执行之后的进程ID
运算符
$ expr 3 + 2
5
$ expr `expr 3 + 2` \* 4
20
$ s=$[(2+3)*4]
$ echo $s
20
expr方式运算符左右要有空格,连续运算时要用反单引号括起来
$(())方式不能有空格
条件判断
[ condition ]
condition的前后必须有空格,条件非空即为true,[ ]返回false
成立为0,不成立为1
$ [ 23 -gt 22 ]
$ echo $?
0
$ [ 23 -le 22 ]
$ echo $?
1
$ [ -w helloworld.sh ]
$ echo $?
0
常用判断条件>>>>>>>>>>>>>>
两个整数之间比较------------------
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
按照文件权限进行判断--------------------
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
按照文件类型进行判断----------------------
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
if判断>>>>>>>>>>>>>>>>>>>>>>
$ cat if.sh
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "wangbaduzi"
elif [ $1 -eq 2 ]
then
echo "dashabi"
fi
[ 条件判断式 ],中括号和条件判断之间必须有空格
if后面必须加空格
case 语句
$ cat case.sh
#!/bin/bash
case $1 in
1)
echo "nibaba"
;;
2)
echo "nimama"
;;
*)
echo "ninainani"
;;
esac
case行尾必须为单词"in",每一个模式匹配必须以右括号")"结束
双分号";;"表示命令序列结束,相当于golang中的break
最后后的"*)"表示默认迷失,相当于golang中的default
网友评论