linux的bash编程基础语法

1.SHELL是什么?

Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell

Shell也是一门编程语言<解释型的编程语言>,即shell脚本

一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell不同的shell可能支持的命令语法是不相同的

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

2 shell脚本的执行方式

第一种:输入脚本的绝对路径或相对路径

首先要赋予+x权限

  /root/helloWorld.sh

  ./helloWorld.sh

或者,不用赋予+x权限,而用解释器解释执行u+x

sh helloworld.sh

第二种:bash或sh +脚本

  sh /root/helloWorld.sh

  sh helloWorld.sh

第三种:在脚本的路径前再加". "

  . /root/helloWorld.sh

  . ./helloWorld.sh

区别:第一种和第二种会新开一个bash,不同bash中的变量无法共享

3.1 系统变量

shell中的变量

1)Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。用$输出变量

2)系统变量:$HOME、

$PWD、

$SHELL、

$USER等等 当前用户

3)显示当前shell中所有变量:set

3.2定义变量

1)基本语法:

       变量=   TT=100    输出变量 echo  $TT

2)变量定义规则

       1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。

       2)等号两侧不能有空格

       3)变量名称一般习惯为大写

       4)双引号和单引号有区别,双引号仅将空格脱意(既字符串之间有空格时要加引号),单引号会将所有特殊字符脱意

       y=bb  echo 'hello $y'----------hello $y 单引号将所有的特殊字符都当做字符串使用,脱意

      echo "hello $y"---------------hello bb 

      字符串之间有空格时,要加引号。

      x=hello word  //报错,不能有空格,不用引号时。x="hello word",ok

3)案例

STR=“hello world”

A=8               定义变量A

unset A       撤销变量A

readonly B=2  声明静态的变量B=2,不能unset

export变量名  可把变量提升为全局环境变量,可供其他shell程序使用

这也是环境变量要加export的原因,这样所有的用户都可以使用这个变量

export JAVA_HOME=/opt/home/jdk-7.01

export A=1 定义的变量,会对自己(当前用户)所在的shell进程及其子进程生效

B=1 定义的变量,只对自己的所在的shell进程生效

4.将命令的返回值赋值给变量(特别重要)

     •A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A

     •A=$(ls -la) 等价于反引号

           A=`pwd`  & echo $A    ----------/home/hello

           A=$(pwd)  $ echo $A------------/home/hello             

•$? 表示上一个命令退出的状态

•$$ 表示当前进程编号

•$0 表示当前脚本名称

•$n 表示n位置的输入参数(n代表数字,n>=1)

•$# 表示参数的个数,常用于循环

•$*和$@ 都表示参数列表

•$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数

•当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

5.echo输出命令

       (1)基本语法:

              echo [选项] [输出内容]

选项:  echo  -e  支持反斜线控制的字符转换

控制字符 

       

\\ 

输出\本身

\a 

输出警告音

\b 

退格键,也就是向左删除键

\c 

取消输出行末的换行符。和“-n”选项一致

\e 

ESCAPE

\f 

换页符

\n 

换行符

\r 

回车键

\t 

制表符,也就是Tab

\v 

垂直制表符

\0nnn

按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数

\xhh

按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

7. 设置环境变量

1.基本语法:

        export 变量名=变量值         (功能描述:设置环境变量的值)

        echo $变量名                      (功能描述:查询环境变量的值)

        source配置文件                 (功能描述:让修改后的配置信息立即生效)

2.位置参数变量

1)基本语法

       $n    (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

       $*    (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

       $@  (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

       $#    (功能描述:这个变量代表命令行中所有参数的个数)

2)案例

       1)计算输入的参数1和参数2的两个数的和,并输出到控制台

#!/bin/bash

num1=$1

num2=$2

sum=$(( $num1 + $num2))

#变量sum的和是num1num2

echo $sum

#打印变量sum的值

       2)打印输入的参数总数、所有参数

#!/bin/bash

echo "A total of $# parameters"

#使用$#代表所有参数的个数

echo "The parameters is: $*"

#使用$*代表所有的参数

echo "The parameters is: $@"

#使用$@也代表所有参数

       3$*$@的区别

#!/bin/bash

for i in "$*"

#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次

        do

                echo "The parameters is: $i"

        done

x=1

for y in "$@"

#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次

        do

                echo "The parameter$x is: $y"

                x=$(( $x +1 ))

        done

a$*$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数

b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数

注意:脚本可以嵌套。

9预定义变量

1)基本语法:

       $ (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

      $$    (功能描述:当前进程的进程号(PID))

      $!     (功能描述:后台运行的最后一个进程的进程号(PID))

2)案例

#!/bin/bash

#输出当前进程的PID,这个PID就是当前这个脚本执行时,生成的进程的PID

echo "The current process is $$"

#使用find命令在root目录下查找hello.sh文件,符号&的意思是把命令放入后台执行

find /root -name hello.sh &

echo "The last one Daemon process is $!"

echo "$?"

10.1运算符

1)基本语法:

1$((运算式))”或“$[运算式]

2expr m + n

注意expr运算符间要有空格

2)案例:计算(2+3X4的值

       1)采用$[运算式]方式

       [root@hadoop102 datas]# S=$[(2+3)*4]

      [root@hadoop102 datas]# echo $S

       2expr分布计算

              S=`expr 2 + 3`

              expr $S \* 4

       3expr一步完成计算

              expr `expr 2 + 3` \* 4

              echo `expr \`expr 2 + 3\`\*4`

10.2 条件判断

 判断语句

1)基本语法:

[ condition ]注意condition前后要有空格

#非空返回true,可使用$?验证(0true>1false

2)案例:

[robot]        返回true

[]                   返回false

[condition] && echo OK || echo notok                      条件满足,执行后面的语句

10.3 常用判断条件

1)两个整数之间比较

= 字符串比较

-lt 小于

-le 小于等于

-eq 等于

-gt 大于

-ge 大于等于

-ne 不等于

2)按照文件权限进行判断

-r 有读的权限

-w 有写的权限

-x 有执行的权限

3)按照文件类型进行判断

-f 文件存在并且是一个常规的文件

-e 文件存在

-d 文件存在并是一个目录

4)案例

[root@localhost ~]# [ 23 -ge 22 ]
[root@localhost ~]# [ -w student.txt ]
[root@localhost ~]# [ -e /root/install.log ]

10.4.循环控制 
if判断

1)基本语法:

if [ 条件判断式 ];then

  程序
fi
或者
if [ 条件判断式 ]
  then
    程序
fi

       注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

2)案例
#!/bin/bash
read –p “please input your name:” NAME
#printf ‘%s\n’ $NAME
if[ $NAME = root ]
then
    echo “hello ${NAME}, welcome !”
elif [ $NAME = robot]
    then
        echo “hello ${NAME}, welcome !”
else
    echo “sorry ”
fi
------------------------------------------------------------------------------
#!/bin/bash
read -p "please input your name:" NAME
#printf'%s\n' $NAME
if [ $NAME = root ]
        then
                echo "hello ${NAME},  welcome !"
        elif [ $NAME = itcast ]
                then
                        echo "hello ${NAME},  welcome !"
       else
                echo "SB, get out here !"
fi


10.6.2 case语句

1)基本语法:

case $变量名 in

  "1"

    如果变量的值等于值1,则执行程序1

    ;;

  "2"

    如果变量的值等于值2,则执行程序2

    ;;

  …省略其他分支…

  *

    如果变量的值都不是以上的值,则执行此程序

    ;;

esac

2)案例

case $1 in

start)

  echo “starting”

  ;; 两个分号结束

stop)

  echo “stoping”

  ;;

*) *是通用的通配符

  echo “Usage:{start|stop}”

esac

10.6.3 for循环

•第一种:
for N in 1 2 3
do
  echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done

第二种:
for ((i = 0; i <= 5; i++))
do
  echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

2)案例:

       1)打印时间

#!/bin/bash

#打印时间

for time in morning noon afternoon evening

        do

                echo "This time is $time!"

        done

3)基本语法2

       for (( 初始值;循环控制条件;变量变化 ))

  do

    程序

  done

4)案例

1)从1加到100

#!/bin/bash

#1加到100

s=0

for (( i=1;i<=100;i=i+1 ))

        do

                s=$(( $s+$i ))

        done

echo "The sum is : $s"

10.6.4 while循环

1)基本语法:

while [ 条件判断式 ]   条件判断式都要两边加空格

  do

    程序

  done

2)案例

       1)从1加到100

#!/bin/bash

#1加到100

i=1

s=0

while [ $i -le 100 ]

#如果变量i的值小于等于100,则执行循环

        do

                s=$(( $s+$i ))

                i=$(( $i+1 ))

        done

echo "The sum is: $s"

第二种

  i=1

  s=0

while ((i<=100))

do

  s=$(($i+$s))

  let i++

done

echo $s10.7 read读取控制台输入

1)基本语法:

       read(选项)(参数)

       选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

参数       

       变量:指定读取值的变量名

2)案例

[robot@hadoop101 etc]$ read -p "please input your name:" NAME

please input your name:lilei

[robot@hadoop101 etc]$ echo $NAME

lilei

猜你喜欢

转载自blog.csdn.net/qq_26442553/article/details/92585942