Linux shell编程学习

Linux shell编程学习

shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。这点与Windows的命令提示符类似,但Linux shell的功能更加强大,我们可以使用 <和>对输入输出进行重定向使用|在同时执行的程序之间实现数据的管道传递使用$(n)获取子进程的参数

重定向:
以b.txt为例: ll > b.txt
Linux shell编程学习_第1张图片
ll显示的东西 在b.txt显示了

管道传递: ll |grep “s”
在这里插入图片描述
在ll中 查找带s的文件

Linux脚本编写基础

执行shell脚本的方法:1.sh 文件名,2.bash 文件名 ,3. source 文件名

1.脚本开头

程序的开头必须为 #!/bin/sh(放在文件的第一行)
shell编程是以“#” 为注释,但对 #!/bin/sh 却不是, #!/bin/sh是对shell的声明,说明你所用的是那种类型的shell及其路径

2.注释

在进行shell编程的时候,以#开头的句子表示注释,直到这一行结束,C语言中是以// /**/表示注释

3. 简单shell书写

#!/bin/sh
A="hello world"
echo "A is"
echo $A

在这里插入图片描述
注意:shell在解释命令时的原则是第一个符号标记只能是程序或者命令,有空格的时候第一个符号标记就是“A”,当然就不成立了,
而没有空格的时候,第一个标记是“A=“hello world””,shell将解释为变量赋值指令,因此可以通过。

4.环境变量

Linux shell编程学习_第2张图片

5.系统变量

Linux shell编程学习_第3张图片
代码演示d.sh:

#!/bin/sh
echo $0
echo $#
echo $1
echo $2
echo $3

运行结果:
Linux shell编程学习_第4张图片

6. shell使用一些Linux的指令

Linux shell编程学习_第5张图片
以cp拷贝为例:

#!/bin/sh
cp a.sh t.sh

结果:
Linux shell编程学习_第6张图片
在shell中实现键盘输入:用read

#!/bin/sh
A=10
echo $A
read A
echo $A

运行结果:
在这里插入图片描述

7.shell的语法及控制结构

7.1条件(if else elif)

检查文件是否存在,test用法,
代码演示:

#!/bin/sh
#if test -f b.txt
if [ -f b.txt ]
then
echo "success"
else
echo "failed"
fi

在这里插入图片描述
注意:使用[]时,必须要在[符号和被检查的条件之间留出空格,可以把符号看作和test样,test和后面的条件之间总是有一个空格。

代码最后不要忘了写fi来结束这个判断
Linux shell编程学习_第7张图片
字符串测试:
Linux shell编程学习_第8张图片

#!/bin/sh
echo "this is morning,yes or no"
read today
if [ $today = "yes" ]
then
echo "good morning"
#else
elif [ $today = "no" ]
echo "good afternoon"
fi

Linux shell编程学习_第9张图片
整数测试:
Linux shell编程学习_第10张图片
测试是否相等为例:

#!/bin/sh
if [ 3 -eq 4 ]
then
echo "yes"
else
echo "no"
fi

在这里插入图片描述
文件测试:
Linux shell编程学习_第11张图片
测试文件是否为一个目录:

#!/bin/sh
if [ -d b.txt ]
then
echo "yes"
else
echo "no"
fi

在这里插入图片描述

7.2 for语句

Linux shell编程学习_第12张图片
代码演示:

#!/bin/sh
for food in 1 5 7 9
do
echo $food  #输出结果
done

结果:
Linux shell编程学习_第13张图片
在默认情况下. shell的变量都是当作字符串来处理的,所以for在适合于对一系列字符串进行循环处理时使用,但需要执行特定次数时,for就不怎么适用了。

7.3 while语句

代码演示:

#!/bin/sh
echo "please password"
read passwd  #输入数字

while [ "$passwd" != "6" ]  #判断条件是否满足
do
echo "try again"  
read passwd
done
exit 0

结果:
Linux shell编程学习_第14张图片
while语句与整数结合用:

#!/bin/sh
food=1
while [ $food -le 20 ]
do
echo $food
food=$(($food+1)) #注意要用两个括号 不然food=$food+1 编译不通过

done
exit 0

Linux shell编程学习_第15张图片

7.4 until语句

Linux shell编程学习_第16张图片
代码演示:

#!/bin/sh
food=1
until [ $food -le 20 ]
do
echo $food
food=$(($food+1)) #注意要用两个括号 不然food=$food+1 编译不通过

done
exit 0

结果:啥都没有
在这里插入图片描述
until与while循环很相似,只不过while循环是条件满足时,循环继续,而until是条件满足时跳出循环

7.5 case语句

Linux shell编程学习_第17张图片
代码演示:

#!/bin/sh
echo "this is morning,please yes or no"
read today  #键盘输入

case "$today" in  #判断
yes) echo "good morning";;
no) echo "good afternoon";;
y  ) echo "good morning";;
n  ) echo "good afternoon";;
*  ) echo "answer not recognzed";;

esac  #这个必须加
exit 0

Linux shell编程学习_第18张图片
注意每个模式都以双分号(;;)结尾,因为你可以在前后模式之间放置多条语句,所以需要使用一一个双分号来标记前一个语句的结束和后一个语句的开始

7.6 函数

Linux shell编程学习_第19张图片
代码演示:

#!/bin/sh
food()
{
echo "ni zhen de henshuai"
}
echo "ni zhen sha"
food
echo "ni shi shazi"

Linux shell编程学习_第20张图片

如果要在shell函数中声明局部变量,则要使用local关键字,局部变量的作用域则局限在函数范围内。此外,函数还可访问全局作用范围内的其他shell变量。如果全局变量和局部变量出现了同名,则局部变量会覆盖全

使用局部变量的时候:
代码演示:

#!/bin/sh
sample_name="ni hao shuai"

food()
{
local sample_name="local ni hao shuai"
echo "ni zhen de henshuai"
echo $sample_name
}
echo "ni zhen sha"
food
echo $sample_name
echo "ni shi shazi"
exit 0


运行结果:
Linux shell编程学习_第21张图片

在这里插入图片描述
下列代码演示函数是如何传递参数,及如何返回一个值的:

#!/bin/sh
yes_or_no()
{
 echo "is your name $*?"
 while true
 do
  echo "please enter yes or no"
  read a
  case "$a" in
  y|yes) return 0;;
  n|no) return 1;;
  *  ) echo "error"
  esac
  done
}

echo "original parameters are $*"
 if yes_or_no "$1 " # shell脚本编程中,注意:Linux中返回0表示成功
then
   echo "hi$1"
else
  echo "never mind"
fi
exit 0

Linux shell编程学习_第22张图片

7.7 (:)命令

冒号(:)是一个空命令,它偶尔会被用于逻辑简化,相当于true的一个别名,由于它是内置命令,所以它的运行效率要比true高
while:相当于while true

代码演示:

#!/bin/sh
fun()
{
while :
do
echo "jingjing"
done
}
fun
exit 0

结果:无限循环下去 Ctrl+c终止程序了
Linux shell编程学习_第23张图片

7.8 break 命令

这个命令在控制条件未满足之前,跳出for/while/unti循环。另外还可以为break提供一个参数,表明要跳出的循环的层数,这点跟我们在c语言中的break不一样。不过一般情况下,我们不会这么做,因为它降低了程序的可读性。

代码演示:

#!/bin/sh
rm -rf fred*
echo > fred1   #创建3个文件 和一个目录
echo > fred2
mkdir fred3
echo > fred4
for file in fred*
do
if [ -d "$file" ]  #如果是目录,就退出
then
break;  # ;可有可无
fi
done
echo first direcyory starting fred was $file
rm -rf fred*

在这里插入图片描述

7.9 continue 命令

类似于C中的continue,使for/while/until循 环跳到下一次循环继续执行,continue也可以附带一个参数,表示希望继续执行的循环嵌套if的层数,同样,这个参数也很少用,它会降低th程序的可诗性

代码演示:

#!/bin/sh
rm -rf fred*
echo > fred1
echo > fred2
mkdir fred3
echo > fred4
for file in fred*
do
if [ -d "$file" ]
then
echo skipping the directory $file
continue
fi
done
echo first direcyory starting fred was $file
rm -rf fred*

在这里插入图片描述

7.10 exec 命令

将当前的shell替换为一一个不同的程序
exec wall"hello world"
将当前的shell替换为执行wall,exec后面的语句都不会执行了,因为当前的shell已经不复存在了

代码演示 :

#!/bin/sh
echo "lulu"
exec echo "hengheng"
echo "aa"
echo "bb"

在这里插入图片描述

你可能感兴趣的:(Linux系统编程)