linux shell编程之小白入门

本文详细介绍Linux Shell的基础概念和语法,包括数据类型、变量、脚本执行、参数传递、流程控制等内容,适合Shell初学者快速掌握核心技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       shell其实是相对于系统内核而言的,其是内核外层的一层“壳”,作用在于提供一个用户图形界面让使用者可以通过一些命令和操作系统进行交互,从而完成一些动作。linux shell自然就是Linux系统的那一层“壳”,同样的还有windows shell。因为在shell上和os进行交互操作,需要输入特定的命令,shell语言就是这些命令的集合以及一些额外的语法抽象层。笔者作为一个linux shell的小白,本文将记录一下关于linux shell的基于概念和语法,作为一次简单的linux shell入门。

       本文中的shell将特指可以在图形界面内访问内核服务的一种命令集合,所以linux系统下具有多种不同的shell,即多种不同的命令集可以和linux系统的内核服务进行交互,常见的有以下几种:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

本文将只针对Bourne Again Shell,也就是bash。

目录

数据类型

赋值和变量引用

获取变量长度

脚本的执行

脚本参数传递以及参数获取

变量

表达式

流程控制

 shell函数

IO重定向

导入外部文件

参考


 

数据类型

       shell语言里面的基本数据类型有整数、布尔变量(true和fasle),字符串和数组,下面主要讲一下字符串和数组。

字符串:可以使用单引号,或者双引号,甚至不适用引号。区别在于,当使用单引号时,该字符串中不可出现变量和转义,即使出现也会被认为字面意思,即不会进行特殊处理;但是对于双引号字符串,可以通过${var}的形式来引用变量var,同时也可以出现换行\n等转义字符。无论是单引还是双引,都可以通过连续多个字符串进行拼接,字符串之间无需任何连接标志符。

数组:shell中数组的定义和python中的元组类似,都是使用圆括号,但是shell中圆括号的值使用空格符分隔,而python中则使用逗号分隔。shell中的元组还可以直接使用变量下标的方式定义,并且下标可以任意指定,如下所示。

#通过圆括号定义
arrayname=(1 2 3)

#直接通过变量和下标定义
arrname[0]=1
arrname[2]=3

赋值和变量引用

       shell中使用等号=赋值,但是要注意的是,等号两侧的变量和值之间不能有空格。对此,可以这样去记忆,对于shell中的语句,=或者其他符合两侧不能有空格,但是对于表达式,=或者其他运算符之间需要有空格隔开。

       如果定义了一个变量,在后面如果要引用改变量,则需要通过${var}的形式来对变量var进行引用。

var=2
echo "the value of var is ${var}"

#output: the value of var is 2

获取变量长度

       当我们想要获取一个变量的长度时,可以使用${#var}。要注意的是,对于#,其也是单行注释符,并且在一行的最开始位置使用以引出注释。

var="abc"
echo "the length of var is ${#var}"

#output: the length of var is 3

脚本的执行

       对于bash脚本的执行有两种主要的方式,第一种是直接在linux命令使用bash命令,即bash script.sh,这样可以直接执行脚本;第二种方式可以不显示使用bash命令,但是需要在脚本内部的首行告诉系统使用哪个解释器来执行该脚本,具体方式是在脚本首行输入#!/bin/bash,然后再在命令行通过chmod +x script.sh将脚本赋予可执行权限,然后输入该脚本回车即可,这样linux系统就可以通过第一行知道使用bash解释器来执行该脚本了,这有点类似于python2在首行声明指定脚本编码。第二种方式要注意的是,在输入脚本回车时,脚本使用的路径需要完整,系统并不会默认现在当前目录下寻找该脚本,而是会在环境变量中去寻找,如果没有输入完整路径的话。

var="abc"
echo "the length of var is ${#var}"

#假设一个shell脚本只有上述语句,名为script.sh,那么在linux命令中要执行该脚本可使用以下两种方式
#方式一:
$ bash srcipt.sh
$ the length of var is 3

#方式二,注意当前工作目录是脚本所在目录,所以使用.表示当前目录以完整脚本目录
$ chmod +x script.sh
$ ./script.sh
$ the length of var is 3

脚本参数传递以及参数获取

       在执行shell脚本时,可以直接在脚本后面以空格分隔参数,以将参数传给脚本。在脚本内部,可以通过$n的方式获取命令行中传给脚本的第n个参数,其中第0个参数,即$0指的脚本名。要注意的是,当n>=10时,需要用${n}的方式获取参数。同时,还可以通过$#来获取除了脚本自身外的参数的个数;$*来一次性获取除脚本外的所有参数,并以单个字符串的形式返回;$@也是获取所有参数,但是是以多个字符串的形式返回,其中一个参数对应一个字符串。

变量

       shell语言的变量可以分为脚本自定义变量和预定义变量,自定义变量由字母、数字和下划线组成,并且不能以数字开头。可以通过readonly关键字将变量声明为只读,这样后面便无法更改该变量;通过unset var可以删除var变量,将其设为空值。

表达式

       shell中,可以将表达式分为一般表达式和条件测试表达式。所谓表达式是和语句相对应的,表达式是有结果返回的,而语句只是一个动作,比如赋值语句,没有结果返回。对于一般表达式,比如使用`expr expression`,即通过expr来声明;而条件测试表达式通过[]方括号声明,方括号中的表达式返回bool变量,往往用在if条件测试中,同test。shell中表达式相比于语句的一个特点就是表达式的操作符和变量之间都有空格分隔,而语句则没有分隔。

流程控制

       shell中的流动控制有if条件语句,for循环,while循环,until语句,case语句,其格式分别如下所示。各个循环都支持break和continue。

#if语句
if condition;
then
    action
fi

#if else语句
if condition1
then
    action1
elif condition2
then
    action1
else
    action3
fi

#for循环
for v in v1 v2 v2 ...
do
    actions
done

#while循环
while condition
do
   actions
done

#while死循环
while true
do 
    actions
done
#或者
while :
do
    actions
done

#untile循环
until condition
do
    actions
done

 shell函数

       shell语言中,可以通过如下方式定义函数。其中[]的内容表示是可选的,写不写都不影响函数的构造。

[function] func[()]
{    
    actions;
    [return int;]
}

#[]内容表示可选,所以最简单的一个函数形式为
func
{
    action;
}

对于函数,要注意的是对于函数值的返回以及对函数参数的捕获。首先对于函数的返回,通过紧接着在函数调用语句的下一条语句写入$?来捕获函数返回值,如果函数没有return,则返回最后一条语句的结果被捕获,并且还将返回一个函数是否正常结束的标志,正常结束返回0,抛出错误返回1,这个0或1标志不会被捕获;对于函数参数,和脚本传参一致,只是函数参数是在调用函数的时候紧接着传入,而脚本传参则是在命令行紧接着传入。

IO重定向

expression > file:将expression的结果写入file,并覆盖file原有的内容;

expression >> file:将expression的结果写入file,但是在file原有的内容的基础上追加;

var < file:从file中获取内容。

此外,可以通过脚本中read var中的read关键词,从标准输入流中输入内容,即从命令行中输入内容,并通过定义变量var捕获。

导入外部文件

       shell语言可以类比python,导入其他的外部脚本模块,并且直接在脚本中引用被导入的脚本文件中的变量。具体的方式有两种,第一种是通过. script.sh的形式,注意点号;第二种是通过source script.sh。如下所示。

#假设script1.sh如下
var1="test"


#script2.sh内容如下
. ./script1.sh
#或者
#source ./script1.sh
echo "the value of script1 is ${var1}"


#执行script2.sh脚本,输入的内容为:
$ the value of script1 is test

 

参考

Shell 教程 | 菜鸟教程:https://www.runoob.com/linux/linux-shell.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值