Shell语法:概述、注释、变量、字符串、数组
shell 语法
学习技巧 : 站在岸上永远学不会游泳,不要死记硬背,要落手实践,遇到含糊不清的地方,敲一遍。
【 概述 🍃 】
shell 是通过命令行与操作系统进行交互的一门语言。其既是一种脚本编程语言,也是一个连接内核和用户的软件。shell脚本可直接在命令行中执行,可以将\({\color{Maroon}一套逻辑组织成一个文件}\),方便脚本复用。
- 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。
变量类型:
- 自定义变量(局部变量):子进程不能访问的变量。
- 环境变量(全局变量):子进程可以访问的变量。
\(\lceil\)转换方法\(\rfloor\):
-
自定义变量改成环境变量
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[*]} # 第二种写法

浙公网安备 33010602011771号