1 概述
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell是解释执行的脚本语言,在Shell中可以调用Linux系统命令。
2 shell脚本执行方式
echo命令,是一个输出命令。假如我们现在输出helloworld 可以进行如下操作:
echo "helloworld"
我们就通过一个最简单的shell脚本老看看有哪些执行方式:
- 创建一个hello.sh
vi hello.sh
在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"
注意: 在shell脚本中必须以#!/bin/bash
作为第一行。
2. 修改hello.sh文件为可执行文件
此时创建的hello.sh并没有执行权限,需要加上执行权限,这里为了方便我就直接上777了。。
chmod 777 hello.sh
3.执行shell脚本
方式一: 输入脚本的绝对路径或相对路径
/root/helloWorld.sh
./helloWorld.sh
方式二: bash或sh+脚本(不用赋予脚本+x权限)
sh /root/helloWorld.sh
sh helloWorld.sh
3 shell中的变量
- Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。
- 系统变量表示形式:
$HOME
、$PWD
、$SHELL
、$USER
等等 - 显示当前shell中所有变量:set
3.1 定义变量
- 基本语法:变量=值
- 变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
(2)等号两侧不能有空格
(3)变量名称一般习惯为大写
(4)双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意 - 案例
(1)定义变量A
[hadoop@hadoop shell]$ A=1
[hadoop@hadoop shell]$ echo $A
1
(2)撤销变量A
[hadoop@hadoop shell]$ unset A
(3)声明静态的变量B=2,不能unset
[hadoop@hadoop shell]$ readonly B=2
[hadoop@hadoop shell]$ echo $B
2
[hadoop@hadoop shell]$ unset B
-bash: unset: b: cannot unset: readonly variable
4)可把变量提升为全局环境变量,可供其他shell程序使用
export 变量名
3.2 将命令的返回值赋给变量
A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号
[hadoop@hadoop shell]$ A=`ls -la`
[hadoop@hadoop shell]$ echo $A
total 8 drwxrwxr-x. 2 hadoop hadoop 4096 Apr 29 06:31 . drwx------. 39 hadoop hadoop 4096 Apr 29 06:31 ..
3.3 设置环境变量
- 基本语法:
(1)export 变量名=变量值 (功能描述:设置环境变量的值)
(2)echo $变量名 (功能描述:查询环境变量的值)
(3)source 配置文件 (功能描述:让修改后的配置信息立即生效)
- 案例:
(1)在/etc/profile文件中定义JAVA_HOME环境变量
[hadoop@hadoop shell]$ vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_45
export MAVEN_HOME=/opt/software/apache-maven-3.3.9
export MAVEN_OPTS="-Xms256m -Xmx512m"
(2)查看环境变量JAVA_HOME的值
[hadoop@hadoop shell]$ echo $JAVA_HOME
/usr/java/jdk1.8.0_45
3.4 位置参数变量
- 基本语法
$n (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,
十以上的参数需要用大括号包含,如${10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)
*注意: 区别 $*
和 $@
之间的不同。
a)
∗
和
*和
∗和@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1
2
…
2 …
2…n的形式输出所有参数
b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1
2
…
2 …
2…n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “
2
”
…
”
2”…”
2”…”n”的形式输出所有参数
- demo
1)输入两个数计算两数之和
[hadoop@hadoop shell]$ vi sum.sh
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum
[hadoop@hadoop shell]$ ./sum.sh 2 3
5
2)打印输入的参数总数、所有参数
[hadoop@hadoop shell]$ vi par.sh
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数
[hadoop@hadoop shell]$ ./par.sh 1 2 3 4
A total of 4 parameters
The parameters is: 1 2 3 4
The parameters is: 1 2 3 4
3.5 预定义变量
- 基本语法:
$? (功能描述:最后一次执行的命令的返回状态。
如果这个变量的值为0,证明上一个命令正确执行;
如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
- demo
[hadoop@hadoop shell]$ vi process.sh
#!/bin/bash
echo "the current process is $$"
./helloworld.sh &
echo "the last one Daemon process is $!"
echo "$?"
[hadoop@hadoop shell]$ ./process.sh
the current process is 52891
the last one Daemon process is 52892
0
[hadoop@hadoop shell]$ hello world
4 运算符
- 基本语法:
(1)“$((运算式))”或“$[运算式]”
(2)expr m + n
注意: expr运算符间要有空格
- demo:计算(2+1)X3的值
[hadoop@hadoop shell]$ a=$[(2+1)*4]
[hadoop@hadoop shell]$ echo $a
12
[hadoop@hadoop shell]$ S=`expr 2 + 1`
[hadoop@hadoop shell]$ expr $S \* 4
12
5 条件判断
5.1 判断语句
- 基本语法:[ condition ](注意condition前后要有空格)
非空返回true,可使用$?验证(0为true,>1为false)
5.2 常用判断条件
- 两个整数之间比较
符号 | 含义 |
---|---|
= | 字符串比较 |
-lt | 小于 |
-le | 小于等于 |
-eq | 等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等于 |
- 按照文件权限进行判断
符号 | 含义 |
---|---|
-r | 有读的权限 |
-w | 有写的权限 |
-x | 有执行的权限 |
- 按照文件类型进行判断
符号 | 含义 |
---|---|
-f | 文件存在并且是一个常规的文件 |
-e | 文件存在 |
-d | 文件存在并是一个目录 |
6 if判断语句
- 基本语法:
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
注意:[ 条件判断式 ],中括号和条件判断式之间必须有空格
2. demo
[hadoop@hadoop shell]$ vi if.sh
#!/bin/bash
read -p "plase input your name:" NAME
if [ $NAME = root ]
then
echo "hello ${NAME}"
elif [ $NAME = hadoop ]
then
echo "hello ${NAME}"
else echo "sorry"
fi
- 结果
[hadoop@hadoop shell]$ ./if.sh
plase input your name:root
hello root
[hadoop@hadoop shell]$ ./if.sh
plase input your name:hadoop
hello hadoop
[hadoop@hadoop shell]$ ./if.sh
plase input your name:aaa
sorry
7 case 判断语句
- 基本语法:
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
- demo
[hadoop@hadoop shell]$ vi case.sh
#!/bin/bash
case $1 in
"start")
echo "start"
;;
"stop")
echo "stop"
;;
*)
echo "Usage:{start|stop}"
;;
esac
- 结果
[hadoop@hadoop shell]$ ./case.sh stop
stop
[hadoop@hadoop shell]$ ./case.sh start
start
[hadoop@hadoop shell]$ ./case.sh aaa
Usage:{start|stop}
8 for 循环
- 基本语法1
基本语法1:
for 变量 in 值1 值2 值3…
do
程序
done
- demo 1
[hadoop@hadoop shell]$ vi for.sh
#!/bin/bash
for time in morning noon afternoon evening
do
echo "This time is ${time}"
done
~
- 结果
[hadoop@hadoop shell]$ ./for.sh
This time is morning
This time is noon
This time is afternoon
This time is evening
- 基本语法2
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
- demo2
[hadoop@hadoop shell]$ vi for2.sh
#!/bin/bash
#从1加到100
s=0
for((i=1;i<=100;i=i+1))
do
s=$(($s+$i))
done
echo "the sum is:"$s
- 结果
[hadoop@hadoop shell]$ ./for2.sh
the sum is:5050
9 while 循环
- 基本语法
while [ 条件判断式 ]
do
程序
done
- demo
[hadoop@hadoop shell]$ vi while.sh
#!/bin/bash
#从1加到100
i=1
s=0
while [ $i -le 100 ]
do
s=$(($s+$i))
i=$(($i+1))
done
echo "The sum is:"$s
- 结果
[hadoop@hadoop shell]$ ./while.sh
The sum is:5050
10 read读取控制台输入
- 基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名
- demo
[hadoop@hadoop shell]$ read -p "please input your name:" NAME
please input your name:hadoop
[hadoop@hadoop shell]$ echo $NAME
hadoop