Shell语法:概述、注释、变量、字符串、数组
shell 语法
学习技巧 : 站在岸上永远学不会游泳,不要死记硬背,要落手实践,遇到含糊不清的地方,敲一遍。
【 概述 🍃 】
shell 是通过命令行与操作系统进行交互的一门语言。其既是一种脚本编程语言,也是一个连接内核和用户的软件。shell脚本可直接在命令行中执行,可以将
- Linux 的脚本解释器/编程语言有很多种,常见的有:
- Bourne Shell (
/usr/bin/sh
或/bin/sh
) - Bourne Again Shell (
/bin/bash
) - C Shell (
/usr/bin/csh
) - K Shell (
/usr/bin/ksh
) - zsh
- …
- Bourne Shell (
Linux 系统中一般默认使用bash,所以这里默认讲解bash语法。
注意:在脚本文件的开头,注释写上 #! /bin/bash
,指明当前使用的解释器(interpretor)为bash。
实例:
#! bin/bash echo "Hello world!"
运行方式
(1)使脚本获得可执行权限: chmod + x test.sh
- 当前路径下执行: ./test.sh
- 绝对路径下执行:/home/../test.sh
- 家目录下执行: ~/test.sh
(2)用解释器执行: bash test.sh
获取命令来源:type 命令,可以解释该命令的来源(内嵌命令。第三方命令等)
【 注释 🍃】
单行注释: 用 #
进行注释。
# 这是注释 echo "Hello world!" #这也是注释
多行注释: 位移后的字符串对可任意选择。
:<<EOF 第一行注释 第二行注释 第三行注释 EOF
【 变量 🍃】
定义变量:不需要加 $
符号,例如:
str1='Hello world!' #单引号定义字符串 str2="Hello world!" #双引号定义字符串 str3=Hello\ world! #也可以不加引号,同样表示字符串,但注意空格需要转义
注意:等号两边不要加空格。
使用变量:使用变量,需要加上$
,或者${}
(限定作用域)。花括号是可选的,推荐后一种,主要是为了帮助解释器识别变量边界。
str="Hello world!" echo $str #输出Hello world! echo ${str} #输出Hello world! echo ${str}\ I\'m\ designer #输出Hello world! I'm designer
只读变量:使用readonly
或者 declare
可以将变量变为只读。
str="Hello world!" readonly str declare -r str #两种写法均可 #若尝试修改只读变量 str="I'm designer" #会报错,因为此时str只能读,不能写
删除变量: unset
可以删除变量。
str="Hello world!" unset str echo ${str} #会输出空行
注意:被声明只读的变量,无法unset。
变量类型:
- 自定义变量(局部变量):子进程不能访问的变量。
- 环境变量(全局变量):子进程可以访问的变量。
-
自定义变量改成环境变量
str="Hello world!" #定义变量 export str #第一种方法 declare -x str #第二种方法 -
环境变量改成自定义变量
export str="Hello world!" #定义环境变量 declare +x str #改成自定义变量
字符串:字符串可以是单引号,也可以用双引号,也可以不用引号。
单引号和双引号的区别:
-
单引号的内容会原样输出
-
双引号的内容可以展开执行,取变量值输出
str="Hello world!" echo '${str}' #输出 ${str} echo "${str}" #输出 Hello world!
获取字符串长度:使用#
号
str="Hello world!" echo ${#str} #输出12
提取子串:指定 begin
:length
str="Hello world!" echo ${str:0:5} #提取从0开的5个字符
【 默认变量 🍃】
文件参数变量:在执行shell脚本时,可以向脚本传参数。$1
是第一个参数,$2
是第二个参数,以此类推。特殊的,$0
是文件名(包含路径)。例如,创建脚本 test.sh
:
#! bin/bash echo "文件名 :"$0 echo "第一个参数 :"$1 echo "第二个参数 :"$2 echo "第三个参数 :"$3 echo "第四个参数 :"$4
执行该脚本:
server@....:~$ chomod +x test.sh server@....:~$ ./test.sh 1 2 3 4 # 终端输出 文件名:./test.sh 第一个参数:1 第二个参数:2 第三个参数:3 第四个参数:4
注意:向脚本传递参数时,参数个数超过一位需要用大括号括起来,如
其他参数相关变量
参数 | 说明 |
---|---|
$# |
代表文件传入的参数个数,如上例中值为4 |
$* |
由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4" |
$@ |
每个参数分别用双引号括起来的字符串,如上例中值为"$1" "$2" "$3" "$4" |
$$ |
脚本当前运行的进程ID |
$? |
上一条命令的退出状态(注意不是stdout,而是exit code【操作系统返回值】)。0表示正常退出,其他值表示错误 |
$(command) |
返回command 这条命令的stdout(可嵌套) |
`command` | 返回command 这条命令的stdout(不可嵌套) |
【 数组 🍃】
数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。数组下标从0开始。
定义:数组用小括号表示,元素之间用空格隔开。例如:
array=(1 abc "def" Hello)
也可以直接定义数组中某个元素的值:
array[0]=1 array[1]=abc array[2]="def" array[3]=Hello
读取数组中某个元素的值
格式:
${array[index]}
例如:
array=(1 abc "def" Hello) echo ${array[0]} echo ${array[1]} echo ${array[2]} echo ${array[3]}
读取整个数组
格式:
${array[@]} #第一种写法 ${array[*]} #第二种写法
例如:
array=(1 abc "def" Hello) echo ${array[@]} # 第一种写法 echo ${array[*]} # 第二种写法
数组长度
类似字符串
${#array[@]} #第一种写法 ${#array[*]} #第二种写法
例如:
array=(1 abc "def" Hello) echo ${#array[@]} # 第一种写法 echo ${#array[*]} # 第二种写法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App