shell是一个命令行解析器,它接收应用程序/用户命令,然后调用操作系统内核。同时shell也是一个功能强大的编程语言,易编写,易调试,灵活性强。
[root@node-4 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
# sh 是bash的软连接
[root@node-4 bin]# ll | grep bash
-rwxr-xr-x 1 root root 941880 5月 11 2016 bash
lrwxrwxrwx. 1 root root 4 3月 9 09:20 sh -> bash
[root@node-4 bin]# echo $SHELL
/bin/bash
# 以如下开头,实际上也是指定解析器的过程
#!/bin/bash
vi helloworld.sh
# 输入以下内容
#!/bin/bash
echo "helloworld"
**第一种:**采用bash或sh+路径+文件名的方式(不需要赋予脚本+x权限)
sh+路径
sh helloworld.sh
bash+路径
bash helloworld.sh
**第二种:**输出路径+文件名(需要赋予脚本执行权限+x)
# 赋予执行权限
chmod u+x helloworld.sh
# 执行
./helloworld.sh
注意:
第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。
第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
$HOME
$PWD
$SHELL
$USER
# 查看当前shell中的所有变量
set
定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly 变量,注意静态不能unset,(关闭当前会话,静态变量消失)
变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写
等号两侧不能由空格
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
变量的值如果有空格,需要使用双引号或单引号括起来
1.定义变量
2.给定义的变量重新赋值
3.撤销变量
4.声明静态变量,不能unset
5.在bash中默认的字符类型都是字符串类型,无法直接进行数值运算
6.变量的值如果有空格,需要使用双引号或者单引号括起来
7.可以将变量提升为全局变量,可供其他shell程序使用
$n(功能描述:n为数字,$0代表脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 内 的 参 数 , 十 以 上 的 参 数 需 要 大 括 号 括 起 来 , 如 9代表第一到第九个参数,十以内的参数,十以上的参数需要大括号括起来,如 9代表第一到第九个参数,十以内的参数,十以上的参数需要大括号括起来,如{10})
$# (功能描述:获取所有输入参数个数,常用于循环)
∗ ( 功 能 描 述 : 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * (功能描述:这个变量代表命令行中所有的参数, ∗(功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)
@ ( 功 能 描 述 : 这 个 标 量 代 表 命 令 行 中 所 有 的 参 数 , @ (功能描述:这个标量代表命令行中所有的参数, @(功能描述:这个标量代表命令行中所有的参数,@把每个参数区分对待)
$? (功能描述:最后一次执行命令的返回状态,如果这个返回值为0,代表上一条命令执行成功,返回非0,具体是那个数,由命令自己决定,则证明上一条命令没有正确执行)
$((运算式)) 或 $[运算式]
# expr 运算符间要有空格
expr +,-,\*,/,% 加,减,乘,除,取余
expr `expr 2 + 3` \* 4
# condition前后需有空格
# 条件非空即为true,如 [ string ] 为true, []返回false
[ condition ]
命令 | 解释 |
---|---|
= | 字符串比较 |
-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后面要有空格
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
输入一个数字,如果是1,则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。
#!/bin/bash
if [ $1 -eq '1' ];then
echo 'banzhang zhen shuai'
elif [ $1 -eq '2' ];then
echo 'cls zhen mei'
fi
case $变量名 in
"值1")
如果变量的值为1,则执行程序1
;;
"值2")
如果变量的值为2,则执行程序2
;;
*)
如果变量的值不是以上,则执行此程序
;;
esac
1.case行尾必须为单词in,每个模式匹配必须以括号 “)” 结束
2.双分号 ;; 表示命令结束,相当于java中的break
3.最后的 *) 表示默认模式,详单与java中的default
输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它,输出renyao。
#!/bin/bash
case $1 in
"1")
echo "banzhang"
;;
"2")
echo "cls"
;;
*)
echo "renyao"
;;
esac