SHELL编程——基础部分

SHELL编程

一、快速入门

  • 脚本以 #!/bin/bash 开头:告诉解释器以bash来解析脚本;

    编写myshell.sh文件:

    #!/bin/bash
    
    echo "Hello World"      /*输出结果是     Hello World 
    
    chmod a+x myshell.sh     /*用来给脚本添加权限
    

二、SHELL变量

  • 变量分类:

    1.自定义变量:A="Hello World"等等;

    2.系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER 等等;

  • 自定义变量:

    1.定义变量:变量=值 注意:等号两边没有空格;(变量的设置 一般采用大写)

    2.引用变量:$变量 或者 ${变量}

    3.撤销变量:unset 变量

    4.生命静态变量readonly:readonly 变量 注意:静态变量不能unset;

    A="Hello"
        
    echo "A=${A}"      /* 输出结果是            A=Hello
    unset A            /* 撤销变量 A
    echo "A=${A}"      /* 输出结果是           A=
    
  • 将命令的返回值赋给变量

    1.变量名=命令:运行反引号里面的命令,并将结果赋值给变量;

    2.变量名= ( 命 令 ) : 反 引 号 可 以 用 (命令):反引号可以用 ()代替

    RESULT='ll -a'               /*将Linux指令(列出所有文件,包含隐藏文件)交给变量RESULT
    
    echo "RESULT=${RESULT}"       /*输出结果是  
    
    #注意:这里的命令一定要用   反引号    
    
DATE=$(date)               /*查看系统当前的时间

echo $DATE                 /* 系统会输出当前的时间
  • 设置环境变量

    1.export 变量名=变量值 (功能描述:将shell变量输出为环境变量);

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

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

  • 位置参数变量

    作用:当我们执行一个shell脚本时,如果想要获取到命令行的参数信息,就可以使用位置参数变量;

语法:

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

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

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

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

echo "输入的命令: $0 ; 参数是: $1 "
echo "输入的命令行中所有的参数是: $*"
echo "输入的命令行  的所有参数: $@"
echo "输入的命令行的参数个数: $#"
  • 预定义变量

    介绍:shell设计者预先定义好的变量,可以直接在shell脚本中使用;

    语法:

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

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

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

三、运算符

​ 1." ( ( 运 算 式 ) ) " 或 " ((运算式))" 或 " (())""[运算式]";

​ 2.expr m + n:加法 注意:expr运算符间要有空格,并且整条语句要在反引号内;

​ 3.expr m - n:减法

​ 4.expr *, /, %:乘 除 取余

  1. ( ) 与 ()与 (){}的区别 $( )的用途和反引号``一样,用来表示优先执行的命令 eg: echo $(ls /root)
    ${ } 就是取变量了 eg:echo ${PATH}
    $((运算内容)) 适用于数值运算 eg: echo $((3+1*4))
A=${((3+2)*2)}        /*用于计算 (3+2)*2
echo "A计算的结果是:$A"
B=`expr 2 + 4`
echo "B计算的结果是:$B"
C=`expr $B / 3`
echo "C计算的结果是:$C"

四、字符串

  • 字符串不能单独,必须要配合变量。

  • 字符串可以使用单引号[’ '],也可以使用双引号[" "],也可以不用引号

  • 单引号内的任何字符没有任何意义,都会原样输出,

  • 单引号内使用变量是无效的,单引号内不能出现单引号

  • 双引号内可以使用变量

  • 双引号内可以使用转义字符

  • 在字符串拼接操作时,我们可以进行无缝拼接,或者是在双引号里使用变量

    ################注意:::以上是单引号和双引号的区别:::###############

五、数组

  • 在/bin/bash这个shell中,只有一维数组的概念,并且不限定数组的长度。
  • 数组的元素下标是从0开始的,
  • 获取数组的元素要使用下标
  • 下标使用不当,会报错
  1. 定义格式: variable=(值1 值2 … 值n) 注意:元素之间除了使用空格作为分隔符,还可以使用

  2. ${variable[index]}: 读取index索引上的元素

  3. v a r i a b l e [ ∗ ] 或 者 {variable[ * ]}或者 variable[]{variable[@]}:读取所有元素*

  4. KaTeX parse error: Expected '}', got '#' at position 2: {#̲variable[*]}或者{#variable[@]} : 读取数组的长度

    #!/bin/bash
    citys=(cc sh bj sd hlj)
    hobby[0]=book
    hobby[1]=film
    hobby[2]=music
    echo ${citys[0]} <==cc
    echo ${hobby[*]} <==book film music
    echo ${#hobby[@]} <==3
    

六、条件判断

  • 整数比较:
操作符作用
=比较两个字符串
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于
  • 按照文件权限比较
操作符作用
-r有读的权限
-w有写的权限
-x有执行的权限
  • 按照文件类型比较
操作符作用
-f文件存在并且是一个常规文件
-e文件存在
-d文件存在并且是一个目录
  • 通常test命令不单独使用,而是与if语句连用,或者是放在循环结构中。

  • 判断符号[] 除了好用的test外,我们还可以使用中括号来进行检测条件是否成立。

    if 条件语句-单分支

if [ 条件判断式 ]
	then
		程序
	fi
--------------------------------------------------------------------------------	
!#/bin/sh
if [ -x /etc/rc.d/init.d/httpd ]
	then
		/etc/rc.d/init.d/httpd restart
	fi
	

if条件语句-多分枝

if [ 条件判断式1]
	then
		当条件判断式1成立时,执行程序1
	elif [ 条件判断式2 ]
	then
		当条件判断式2成立时,执行程序2
		...省略更多条件
	else
		当所有条件都不成立时,最后执行此程序
	fi
	
	
	-----------------------------------------------------------------------------
#!/bin/bash
	read -p "please input your name:" NAME
	echo $NAME
		if [ “$NAME” == root ]
		then
			echo "hello ${NAME}, welcome !"
		elif [ $NAME == tom ]
		then
			echo "hello ${NAME}, welcome !"
		else
			echo "SB, get out here !"
		fi

case

CMD=$1
case $CMD in
start)
	echo "starting"
	;;
stop)
	echo "stoping"
	;;
test)
	echo “I’m testing”
	;;
*)
	echo "Usage: {start|stop} "
	;;
esac

七、循环

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 N in 1 2 3; 
do 
    echo $N; 
done

以上均为 for 循环的第一种书写方式

for ((i = 0; i <= 5; i++))
do
	echo "welcome $i times"
done
for ((i = 0; i <= 5; i++));
do 
    echo "welcome $i times"; 
done

以上是for 循环的第二种书写方式

while循环

  • 注意:until循环与while正好相反,即:while是条件成立循环执行;until是条件不成立循环执行

    while命令根据紧跟其后的命令(command)来判断是否执行while循环,

    当command执行后的返回值(exitstatus)为0时,则执行while循环语句块,直到遇到done语句,然后再返回

    到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。

    while [ expression ]
    do
    	command
    	…
    done
    
    while (( expression ))
    do
    	command
    	…
    done
    

    八、函数

  • 函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
    以下是关于函数的一些重要说明:

    1. 在shell中,函数必须先定义,再调用
    2. 使用return value来获取函数的返回值
    3. 函数在当前shell中执行,可以使用脚本中的变量。
      函数的格式如下:
    函数名()
    {
    命令1..
    命令2.
    return 返回值变量
    }
    
    
    [ function ] funname [()]
    {
    	action;
    	[return int;]
    }
    function start() / function start / start()
    

    注意:

    1. 如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
    2. 函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值
    3. 如果不加return,将以最后一条命令的运行结果,作为返回值。
    4. return后的内容以字符串的形式写入,但是执行时会自动转成数值型,范围:数值n(0-255)
#!/bin/bash

function sum(){
A=$1
B=$2
C=$3
return $[ A + B +C ]
}

sum $1 $2 $3
SUM=$?
echo $SUM

注意:

  1. 如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
  2. 函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值
  3. 如果不加return,将以最后一条命令的运行结果,作为返回值。
  4. return后的内容以字符串的形式写入,但是执行时会自动转成数值型,范围:数值n(0-255)
#!/bin/bash

function sum(){
A=$1
B=$2
C=$3
return $[ A + B +C ]
}

sum $1 $2 $3
SUM=$?
echo $SUM

在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页