Shell脚本基本操作

1 概述

Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell是解释执行的脚本语言,在Shell中可以调用Linux系统命令。

2 shell脚本执行方式

echo命令,是一个输出命令。假如我们现在输出helloworld 可以进行如下操作:
echo "helloworld"
我们就通过一个最简单的shell脚本老看看有哪些执行方式:

  1. 创建一个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中的变量

  1. Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。
  2. 系统变量表示形式:$HOME$PWD$SHELL$USER等等
  3. 显示当前shell中所有变量:set
3.1 定义变量
  1. 基本语法:变量=值
  2. 变量定义规则
    (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
    (2)等号两侧不能有空格
    (3)变量名称一般习惯为大写
    (4)双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意
  3. 案例

(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. 基本语法:
(1)export 变量名=变量值	(功能描述:设置环境变量的值)
(2)echo  $变量名			(功能描述:查询环境变量的值)
(3)source 配置文件			(功能描述:让修改后的配置信息立即生效)
  1. 案例:
    (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 位置参数变量

  1. 基本语法
	$n	(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,
	十以上的参数需要用大括号包含,如${10})
	$*	(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
	$@	(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
	$#	(功能描述:这个变量代表命令行中所有参数的个数)

*注意: 区别 $*$@之间的不同。

a) ∗ 和 *和 @都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2 … 2 … 2n的形式输出所有参数
b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2n”的形式输出所有参数

  1. 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 预定义变量

  1. 基本语法:
$?		(功能描述:最后一次执行的命令的返回状态。
如果这个变量的值为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. 基本语法:
(1)“$((运算式))”或“$[运算式]”
(2)expr m + n  

注意: expr运算符间要有空格

  1. 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 常用判断条件
  1. 两个整数之间比较
符号含义
=字符串比较
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于
  1. 按照文件权限进行判断
符号含义
-r有读的权限
-w有写的权限
-x有执行的权限
  1. 按照文件类型进行判断
符号含义
-f文件存在并且是一个常规的文件
-e文件存在
-d文件存在并是一个目录

6 if判断语句

  1. 基本语法:
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 判断语句

  1. 基本语法:
case $变量名 in 
  "值1") 
    如果变量的值等于值1,则执行程序1 
    ;; 
  "值2") 
    如果变量的值等于值2,则执行程序2 
    ;; 
  …省略其他分支… 
  *) 
    如果变量的值都不是以上的值,则执行此程序 
    ;; 
esac
  1. 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
基本语法1:
for 变量 in 值1 值2 值3… 
  do 
    程序 
  done
  1. 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
  1. 基本语法2
for (( 初始值;循环控制条件;变量变化 )) 
  do 
    程序 
  done
  1. 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 循环

  1. 基本语法
while [ 条件判断式 ] 
  do 
    程序 
  done
  1. 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读取控制台输入

  1. 基本语法
	read(选项)(参数)
	选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数	
	变量:指定读取值的变量名
  1. demo
[hadoop@hadoop shell]$  read -p "please input your name:" NAME
please input your name:hadoop
[hadoop@hadoop shell]$ echo $NAME
hadoop
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值