Linux-基础入门-学习笔记(4):shell编程常用语法演示

Linux-基础入门-学习笔记(4):shell编程常用语法演示

一、shell介绍

在之前的博客中已经对shell进行了简单的介绍,并且搭建了简易的shell框架,详细请参考博客:搭建简单的shell框架

编写shell脚本时使用的语言就是shell语言,又叫脚本语言。shell脚本其实是一类语言而不是一个语言。

常用的shell语言:
sh(dash)、bash、csh、ksh、perl、python等。
linux下最常用的脚本就是sh、bash

shell脚本运行机制:解析运行
C语言(C++)这种编写过程是:编写出源代码(源代码是不能直接运行的)然后编译链接形成可执行二进制程序,然后才能运行;而脚本程序不同,脚本程序编写好后源代码即可直接运行(没有编译链接过程)
shell程序是解释运行的,所谓解释运行就是说当我们执行一个shell程序时,shell解析器会逐行的解释shell程序代码,然后一行一行的去运行。(顺序结构)
CPU实际只认识二进制代码,根本不认识源代码。脚本程序源代码其实也不是二进制代码,CPU也不认识,也不能直接执行。只不过脚本程序的编译链接过程不是以脚本程序源代码为单位进行的,而是在脚本运行过程中逐行的解释执行时才去完成脚本程序源代码转成二进制的过程(不一定是编译链接,因为这行脚本程序可能早就编译连接好了,这里我们只是调用它)的。

二、shell常见用法演示

1. shell程序运行方法

(1)./xx.sh
(2)source xx.sh
(3)bash xx.sh

在这里插入图片描述

2. shell程序输出字符串

#!/bin/sh
#shuchu helloworld
echo "hello world."

#!/bin/sh表示指定shell程序执行时被/bin目录下的sh(dash)解释器解释执行。
# 开头的行是注释行。如果有多行需要注释,每行前面都要加#。(#就相当于是C语言中的//)
echo后面跟的字符串是将来要打印出的。

3. shell配合linux命令使用

#!/bin/sh
#mkdir+touch
mkdir dir
cd dir
touch b.txt
cd ..

PWD=`pwd`
echo $PWD

在这里插入图片描述
(1)直接执行
(2)反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。
实验证明:linux下的操作指令可以在shell脚本文件中使用

4. shell中的变量定义和引用

#!/bin/sh
# variable define & use
#test1:standard format
test1="test1"
#test2:space
test2 ="test2"
echo $test1
echo $test2

var="hello"
echo "${var}you"

在这里插入图片描述
实验证明:在shell中赋值的=两边是不能有空格的
shell中引用一个变量必须使用$ 符号,$符号就是变量解引用符号。

#!/bin/sh
# variable define & use
test1="test1"
#test2:repalce
test1="test2"
echo $test1

在这里插入图片描述
实验证明:变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。

5.shell中无引号、单引号和双引号的区别

#!/bin/sh
#fuhao test
test1=test1
test2='test2'
test3="te\"st3"
test4='te\"st4'
echo $test1
echo $test2
echo $test3
echo $test4

在这里插入图片描述
无引号:
shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出"或者其他转义字符。
在单引号中:
完全字面替换,写什么就输出什么(不可包含单引号本身)。
在双引号中:
$加变量名可以取变量的值
反引号仍表示命令替换
$表示$ 的字面值 输出$符号
`表示`的字面值
"表示"的字面值
\表示\的字面值
除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。

6. shell中选择分支结构

#!/bin/sh
#if the a.txt exist,say yes,if not exist,say no and create
if  [ -f a.txt ]; then
        echo "yes"
else
        echo "no"
        touch a.txt
fi

在这里插入图片描述
在判决表达式中,内容左右各有一个空格
判断文件是否存在:(-f)
判断目录是否存在: (-d)
判断字符串是否相等(“str1” = “str2”),注意用一个等号而不是两个。
判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)。(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)。
判断字符串是否为空(-z)注意-z判断时如果变量本身没定义也是不成立(也就是说-z认为没定义不等于为空)。

#!/bin/sh
if [ "str1"="str1" ];then
        echo "the strings are the same"
else
        echo "the strings are the different"
fi

if [ 1 -lt 2 ];then
        echo "1 is less than 2"
else
        echo "1 is large than 2"
fi

string=""
if [ $string -z ];then
        echo "the string is empty"
else
        echo "the string is not empty"
fi

在这里插入图片描述

7. shell中的循环

#!/bin/sh
# while
i=2
j=6
while [ $i -lt $j ]
do
        echo $i
        i=$(($i + 1))
done
# for
for i in 1 2 3 4 5
do
        echo $i
done

在这里插入图片描述

8. shell中的追加符号

#!/bin/sh
# echo指令创建文件和追加输入文件
echo "#include <stdio.h> 
int main(void)
{ 
	return 0;
}" > a.c

# echo指令向已经存在的文件中追加输入内容
echo "追加的内容" >> a.c

在这里插入图片描述
在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>。
还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。

9. shell中的case语句

#!/bin/sh
var=1
case $var in
1) echo "1" ;;
2) echo "2" ;;
esac

在这里插入图片描述
shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同。shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell中的case语言默认都带了break)。
如果case中带着break,此时的break是用来跳出while循环的,一定是case与while循环配合使用的。

10. shell中的传参与shift指令

#!/bin/sh
# 演示使用$#  $0  $1等传参与shift指令
echo $# $0 $1 $2 $3
shift;
echo $# $0 $1 $2 $3

在这里插入图片描述
./9.shift.sh aa bb cc可知:$# 表示有几个参数(4), $0是执行这个shell程序的解析程序的名字( ./9.shift.sh),$1是第一个有效参数的值(aa),$2是第2个有效参数的值(bb),$3是第3个有效参数的值(cc)。
当经过shift之后: 整个参数像是被进行了左移,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了新的$1,原来的 $#少了1个。

发布了72 篇原创文章 · 获赞 98 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_42826337/article/details/104960061