shell脚本的执行方式
echo输出内容到控制台
-e: 支持反斜线控制的字符转换
控制字符 作 用
\\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符。和“-n”选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数
[root@hadoop101 sbin]$ echo "helloworld"
helloworld
[root@hadoop101 /]# echo -e "helloworld\n"
helloworld
[root@hadoop101 /]# echo -e \\
\
[root@hadoop101 Packages]# echo -e "hello\tworld"
hello world
2)脚本格式
脚本以 #!/bin/bash 开头
[atguigu@hadoop101 datas]$ touch helloworld.sh
[atguigu@hadoop101 datas]$ vi helloworld.sh
在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"
bash或sh+脚本(不用赋予脚本+x权限)
sh /root/helloWorld.sh
sh helloWorld.sh
定义变量
(1)定义变量A
A=8
(2)撤销变量A
unset A
(3)声明静态的变量B=2,不能unset
readonly B=2
(4)可把变量提升为全局环境变量,可供其他shell程序使用
export 变量名
将命令的返回值赋给变量
(1)A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
(2)A=$(ls -la) 等价于反引号
设置环境变量
(1)在/etc/profile文件中定义JAVA_HOME环境变量
export JAVA_HOME=/opt/module/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin
(2)查看环境变量JAVA_HOME的值
[root@hadoop101 datas]$ echo $JAVA_HOME
/opt/module/jdk1.7.0_79
(3)让修改后的配置信息立即生效
source /etc/profile
位置参数变量
$n (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)
#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "$#"
预定义变量
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
#!/bin/bash
echo "$$"
./helloworld.sh &
echo "$!"
echo "$?"
运算符
(1)“$((运算式))”或“$[运算式]”
(2)expr m + n (注意expr运算符间要有空格)
(3)expr m - n
(4)expr \*, /, %(乘,除,取余)
案例:计算(2+3)X4的值
(1)采用$[运算式]方式
[root@hadoop101 datas]# S=$[(2+3)*4]
[root@hadoop101 datas]# echo $S
(2)expr分布计算
S=`expr 2 + 3`
expr $S \* 4
(3)expr一步完成计算
expr `expr 2 + 3` \* 4
条件判断
1 判断语句
[ condition ](注意condition前后要有空格)
[ condition ] && echo OK || echo notok 条件满足,执行后面的语句
2 常用判断条件
1)两个整数之间比较
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
2)按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
4)案例
(1)23是否大于等于22
[ 23 -ge 22 ]
(2)student.txt是否具有写权限
[ -w student.txt ]
(3)/root/install.log目录中的文件是否存在
[ -e /root/install.log ]
流程控制
if判断
1)基本语法:
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
fi
判断输入的数是否等于123,是否等于456
#!/bin/bash
if [ $1 -eq "123" ]
then
echo "123"
elif [ $1 -eq "456" ]
then
echo "456"
fi
case语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
输入1,输出1;输入2,输出2;输入其他,输出other
!/bin/bash
case $1 in
"1")
echo "1"
;;
"2")
echo "2"
;;
*)
echo "other"
;;
esac
for循环
(1)从1加到100
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo "$s"
read读取控制台输入
#!/bin/bash
read -t 7 -p "please 7 miao input your name " NAME
echo $NAME
函数
自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
funname
(1)计算输入参数的和
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;