shell 语法介绍(上):变量、字符串、数组、注释、传递参数与特殊字符

一、简介

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Linux 的 Shell 种类众多。Bash 是大多数 Linux 系统默认的 Shell,因为它易用和免费。

 

二、第一个 shell 脚本

1. 新建一个 HelloWorld.sh 如下

#!/bin/bash
echo "Hello World !"

2. 解释

  • #! 是一个约定的标记,告诉系统使用的是哪一种 shell。
  • echo 命令用于向窗口输出文本

3. 运行

  • 作为可执行程序:
chmod 777 ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本
  • 作为解释器参数:
/bin/sh test.sh

 

三、变量

1. 示例

str="Hello World!"

2. 规则

  • 变量名和等号之间不能有空格
  • 命名只能是英文字母、数字和下划线,且数字不能开头
  • 不能使用 bash 的关键字

3. 使用变量

使用 $ 获取变量的值,例如:

str="Hello World!"
echo $str
echo ${str}

这里推荐给所有的变量都加上花括号,帮助编译器识别变量的边界,也更容易阅读。

4. 只读变量

使用 readonly 命令将变量设置为只读,只读变量不可以修改。

str="Hello World!"
readonly str

 

四、字符串

1. 定义

既可以使用单引号也可以使用双引号,如下:

str="Hello World!"
str2='Hello World!'

建议使用双引号,双引号内部可以有变量或转义。对比如下:

  能否引用变量 能否引用转移符 能否引用文本格式符(如:换行符、制表符)
单引号
双引号

2. 字符串拼接

name="afei"
str1="hello, "${name}" !"
str2="hello, ${name} !"
echo ${str1} # 输出 hello, afei !
echo ${str2} # 输出 hello, afei !

3. 字符串长度

string="abcd"
echo ${#string} #输出 4

4. 截取字符串

name="afei"
str=${name:1:3}
echo ${str} # 输出 fei

5. 查找子字符串

name="afei"
echo `expr index "${name}" e` # 输出 e 所在的位置 2

五、数组

1. 定义数组

只支持一维数组,不支持多维数组,使用小括号表示数组,数组元素使用“空格”分开,例如:

strings=("a" "b" "c" "d")
echo ${strings[1]} # 输出 b
echo ${strings[@]} # 输出 a b c d

2. 读取数组

使用 ${数组名[下标]} 读取,使用 @ 符号可以获取数组所有元素,例子见上。

3. 获取字符串长度

strings=("Hello" " " "World" "!")
echo ${#strings[0]} # 获取单个元素(Hello)的长度,输出 5
echo ${#strings[@]} # 获取整个数组(strings)的长度,输出 4

六、注释

1. 单行注释

使用 # 表示单行注释。

2. 多行注释

可以使用如下格式:

:<<EOF
注释内容...
注释内容...
EOF
 
# EOF 也可以使用其他符号
 
:<<'
注释内容...
注释内容...
'
 
:<<!
注释内容...
注释内容...
!

 

七、传递参数

1. 获取参数

使用 $n 获取,n 表示第几个参数。
例子:

echo $0 # 输出第一个参数(第一个参数是文件名)
echo $1 # 输出第二个参数
echo $2 # 输出第三个参数

执行情况:

$ ./test.sh 1 2
./test.sh
1
2

2. 特殊字符

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ $*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示Shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误

例子:

echo "参数个数为: $#"
echo "参数为: $*"
echo "参数为: $@"
echo "进程ID为: $$"
echo "后台运行的最后一个进程ID为: $!"
echo "shell使用的当前选项为: $-"
echo "最后命令的退出状态为: $?"

执行情况:

$ ./test.sh a b c
参数个数为: 3
参数为: a b c
参数为: a b c
进程ID为: 3300
后台运行的最后一个进程ID为: 
shell使用的当前选项为: hB
最后命令的退出状态为: 0

3. $*$@ 的区别

  • 相同点:都是引用所有参数
  • 不同点:* 是将所有参数作为一个参数看待,@ 是每个参数单独看待

示例:

echo "--\$* 演示--"
for i in "$*"; do
    echo $i
done
 
echo "--\$@ 演示--"
for i in "$@"; do
    echo $i
done

执行情况:

$ ./test.sh a b c
--$* 演示--
a b c
--$@ 演示--
a
b
c

猜你喜欢

转载自blog.csdn.net/afei__/article/details/81123352