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

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。

变量类型

  1. 自定义变量(局部变量):子进程不能访问的变量。
  2. 环境变量(全局变量):子进程可以访问的变量。

转换方法

  • 自定义变量改成环境变量

    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

注意:向脚本传递参数时,参数个数超过一位需要用大括号括起来,如 echo {10}

其他参数相关变量

参数 说明
$# 代表文件传入的参数个数,如上例中值为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[*]} # 第二种写法
posted @   straySheep  阅读(169)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示