Shell编程详细教程:从基础语法到实践

目录

shell是什么

快速入门

shell变量

设置环境变量

位置参数变量

预定义变量

运算符

条件判断

IO流程控制

read读取控制台输入

函数


shell是什么

 

 

 

 

 

 

 

 

 

 

shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。


快速入门

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

编写myshell.sh文件:

#!/bin/bash

echo "This my first shell script"

给脚本添加执行权限

chmod +x myshell.sh


shell变量

  • 变量分类:

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

2.系统变量:$HOME、$PWD、$SHELL、$USER 等等;

  • 自定义变量:

1.定义变量:变量=值   注意:等号两边没有空格;

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

3.撤销变量:unset 变量

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

演示:

my_shell="hello" 

echo "mys_shell=${my_shell}"

unset my_shell

echo "mys_shell=${my_shell}"

  • 将命令的返回值赋给变量

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

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

演示:

RESULT=`ls -la`

echo "RESULT=${RESULT}"

echo ""

MY_DATE=$(date)

echo "MY_DATE=${MY_DATE}"


设置环境变量

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

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

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


位置参数变量

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

语法:

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

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

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

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

演示:

echo "输入的命令是:$0;参数是: $1 $2"

echo "输入的命令行中的所有参数:$*"

echo "输入的命令行的所有参数:$@"

echo "输入的命令行的参数个数:$#"


预定义变量

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

语法:

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

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

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


运算符

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

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

3.expr m - n:减法

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

演示:

RESULT=$(((3+2)*3))

echo "(3+2)*3=${RESULT}"

TEMP=`expr 2 + 4`

echo "TEMP=${TEMP}"

NUM=`expr ${TEMP} / 2`

echo "TEMP/2=${NUM}"

 

 

 


条件判断

  • 整数比较:

操作符

作用
= 比较两个字符串
-lt 小于
-le

小于等于

-eq 等于
-gt 大于
-ge

大于等于

-ne 不等于
  • 按照文件权限比较

操作符

作用
-r 有读的权限
-w 有写的权限
-x 有执行的权限
  • 按照文件类型比较

操作符

作用
-f 文件存在并且是一个常规文件
-e 文件存在
-d 文件存在并且是一个目录

IO流程控制

  • if判断

语法: if [ 条件判断式 ]

            then     程序

               elif [ 条件判断式 ]

                  then  程序

       fi

注意:[ 条件判断式 ],中括号与条件判断式之间必须与空格;

练习:编写一个shell程序,如果输入的参数,大于等于60,则输出及格,如果小于60则输出不及格;

f [ $1 -ge 60 ]

   then  echo "及格了"

elif [ $1 -lt 60 ]

   then echo "不及格"

fi

  •  
  •  
  •  
  • case语句

语法:case $变量名 in

'"值1")

      执行程序1;;

'"值2")

      执行程序2;;

*)

    以上值都不是执行此程序;;

esac

 

练习:当命令行参数是 1 时,输出 "周一", 是 2 时,就输出"周二", 其它情况输出"other";

case $1 in
   "1")
      echo "周一";;
   "2")
      echo "周二";;
   *)
      echo "others";;
esac

  •  
  •  
  •  
  •  
  • for循环

语法1:for 变量 in 值1 值2 值3....

do   

     程序

done

练习:打印命令行输入的参数【会使用到$* $@】;

# 使用 $*
for i in "$*"
  do
    echo "the nums are $i"
done

echo "====================="

# 使用 $@

INDEX=0

for j in "$@"
  do
    INDEX=$[$INDEX + 1]
    echo "the num of $INDEX is $j"
done

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

    do  

       程序

done

练习:从1加到100的值输出显示;

SUM=0;
for((i=1;i<=100;i++))
 do
   SUM=$[$SUM + $i]
done
  echo "从1加到100的和为:$SUM"
  • while循环

语法: while [条件判断式]

     do

        程序

   done

练习:从命令行输入一个数 n,统计从 1+..+ n 的值是多少?

SUM=0
i=0

while [ $i -le $1 ]
  do
    SUM=$[$SUM+$i]
    #i=$[$i+1]
    i=$[$i + 1]
done

echo "从1加到$1的总和为:$SUM"

 

 

 


read读取控制台输入

语法:read(选项)(参数)

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

                 -t:指定读取时等待的时间(秒),如果没有在指定的时间内输入,就不在等待;

    参数: 变量,指定读取的变量名,将读取到的内容赋值给变量;

练习:读取控制台输入的一个num值;

# !/bin/bash

# 从控制台读取输入内容

read -t 5 -p "请输入一个数字num:" NUM1
echo "您输入的数字为:$NUM1"

 

 


函数

  • 系统函数

basename:  返回完整路径最后 / 的部分,常用于获取文件名;

basename  [pathname] [suffix]:功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 中的 suffix 去掉。

dirname:  返回完整路径最后 / 的前面的部分,常用于返回路径部分;

dirname  文件绝对路径:功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。

  • 自定义函数

语法:

function functionname(){

     action;

}

方法调用:直接写函数名:functionname 参数

练习:计算输入两个参数的和;

function getSumFromInput(){
     SUM=$[$n1 + $n2]
     echo "输入参数的和为:$SUM"
}

read -p "请输入一个数值:" n1
read -p "请输入一个数值:" n2


getSumFromInput $n1 $n2


看到这里shell的语法和知识点差不多已经全部学完了,剩下的就是不断的实践练习,唯有不断练习方能得心应手,提高工作效,come on~~

 

猜你喜欢

转载自blog.csdn.net/XU906722/article/details/81877562