1.9 Shell 变量的删除、替换和替代
Linux
提供一些可以直接对变量进行操作的符号。通过这些符号,变量中的部分内容可以被删除、替换和替代。在 Shell
中,变量的删除、替换和替代也是非常重要的。通过简单操作修改变量,可以减少代码的行数并提高可读性。
1.9.1 Shell 变量的删除
变量删除的操作方法如下:
格式 | 说明 |
---|---|
${变量名#*关键字符} | 如果变量内容从头开始的数据符合 关键字符 ,则将符合的最短数据删除 |
${变量名##*关键字符} | 如果变量内容从头开始的数据符合 关键字符 ,则将符合的最长数据删除 |
${变量名%关键字符*} | 如果变量内容从尾开始的数据符合 关键字符 ,则将符合的最短数据删除 |
${变量名%%关键字符*} | 如果变量内容从尾开始的数据符合 关键字符 ,则将符合的最长数据删除 |
示例代码如下:
#!/bin/bash# 定义一个示例字符串
str="hello_world_hello_world"# 删除变量内容中从头开始的最短匹配的 'o',结果为 'hell_world_hello_world'
echo "${str#*o}"# 删除变量内容中从头开始的最长匹配的 'o',结果为 '_world_hello_world'
echo "${str##*o}"# 删除变量内容中从尾开始的最短匹配的 'o',结果为 'hello_world_hello_w'
echo "${str%o*}"# 删除变量内容中从尾开始的最长匹配的 'o',结果为 'hello_world_hello_w'
echo "${str%%o*}"
1.9.2 Shell 变量的替换
在日常工作中,常常需要判断某个变量是否存在。若变量存在则使用既有的配置,若变量不存在,则给予一个常用的配置。
变量替换的操作方式如下:
格式 | 说明 |
---|---|
${变量名/旧字符串/新字符串} | 若变量内容符合 旧字符串 ,则第一个 旧字符串 会被 新字符串 替换 |
${变量名//旧字符串/新字符串} | 若变量内容符合 旧字符串 ,则全部 旧字符串 会被 新字符串 替换 |
示例代码如下:
#!/bin/bash# 定义一个示例字符串
str="hello_world_hello_world"# 替换所有的 'o' 为 'x',结果为 'hellx_wxrld_hellx_wxrld'
echo "${str//o/x}"# 替换第一个 'o' 为 'x',结果为 'hellx_world_hello_world'
echo "${str/o/x}"
1.9.3 Shell 变量的自增
Shell
变量的自增运算符是 i++
和 ++i
。
i++
表示先赋值再自加++i
表示先自加再赋值
#!/bin/bash# 定义一个示例变量
i=0# i++ 表示先赋值再自加,所以此时 i 的值为 0,输出 0
echo "i++ returns $((i++))"
# 输出结果为 0# 输出此时 i 的值为 1
echo "After i++, i is $i"
# 输出结果为 1# 重置示例变量
i=0# ++i 表示先自加再赋值,所以此时 i 的值为 1,输出 1
echo "++i returns $((++i))"
# 输出结果为 1# 输出此时 i 的值为 1
echo "After ++i, i is $i"
# 输出结果为 1
1.10 Shell 变量中的特殊符号
在Shell脚本中,有许多特殊符号用于不同的操作和功能。以下是一些常见的Shell变量中的特殊符号及其用途:
基本符号
$
:用于引用变量。例如,$VAR
表示变量VAR
的值。${}
:用于引用变量,尤其是在变量名后面紧跟非变量名字符时。例如,${VAR}123
表示变量VAR
的值加上字符串123
。
特殊变量
$0
:当前脚本的名称。$1
到$9
:传递给脚本或函数的参数。$1
是第一个参数,$2
是第二个参数,依此类推。$#
:传递给脚本或函数的参数个数。$*
:传递给脚本或函数的所有参数,作为一个字符串。"$@"
:传递给脚本或函数的所有参数,每个参数保持独立。$?
:最近一次命令的退出状态,0表示成功,非0表示失败。$$
:当前Shell进程的进程ID(PID)。$_
:最后一个命令的最后一个参数或最后一个命令的结果。
控制字符
;
:命令分隔符,用于在一行中执行多个命令。&&
:逻辑AND,用于连接两个命令,第一个命令成功时才执行第二个命令。||
:逻辑OR,用于连接两个命令,第一个命令失败时才执行第二个命令。&
:将命令放入后台执行。|
:管道符,用于将一个命令的输出作为下一个命令的输入。
引号
"
:双引号,引用字符串,可以包含变量和命令替换。'
:单引号,引用字符串,原样输出其中内容,不进行变量和命令替换。`
:反引号,用于命令替换,执行命令并将结果替换到当前位置。例如,`date`
。
重定向
>
:输出重定向,将命令输出写入文件(覆盖)。>>
:输出重定向,将命令输出追加到文件末尾。<
:输入重定向,从文件读取命令输入。2>
:错误输出重定向,将错误输出写入文件(覆盖)。2>>
:错误输出重定向,将错误输出追加到文件末尾。&>
:将标准输出和错误输出都重定向到同一文件中。
括号
()
:命令组,将一组命令放在子Shell中执行。{}
:命令块,在当前Shell中执行一组命令。
其他
*
:通配符,匹配零个或多个字符。?
:通配符,匹配单个字符。[ ]
:字符集,匹配方括号内的任意一个字符。