[命令] Linux 命令 eval (执行变量里的命令或实现指针)

内容目录:

内容一:eval 命令的作用

内容二:eval 直接执行命令的案例
2.1 设置变量
2.2 显示变量里内容

内容三:eval 将变量转换成命令后执行的案例
3.1 将命令设置成变量
3.2 显示变量里的命令
3.3 执行变量里的命令

内容四:eval 显示脚本里最后 1 个位置变量的内容
4.1 创建显示最后 1 个位置变量的脚本
4.2 带位置变量执行脚本

内容五:eval 实现指针
5.1 设置变量
5.2 设置指针
5.3 显示指针指向的变量
5.4 显示指针最终指向的内容

具体的内容:

内容一:eval 命令的作用

对将要执行的命令进行 2 次扫描,第 1 次扫描时把扫描的内容替换成命令,第 2 次扫描时执行扫描到的命令

内容二:eval 直接执行命令的案例
2.1 设置变量

# url=eternalcenter.com

(补充:这里以将内容 eternalcenter.com 赋值给变量 url 为例)

2.2 显示变量里内容

# echo $url
eternalcenter.com

或者:

# eval echo $url
eternalcenter.com

(补充:这里以显示变量 url 里的内容 eternalcenter.com 为例)

内容三:eval 将变量转换成命令后执行的案例
3.1 将命令设置成变量

# command=pwd

(补充:这里以将命令 pwd 赋值给变量 command 为例)

3.2 显示变量里的命令

# echo $command
pwd

(补充:这里以显示变量 command 里的 pwd 命令为例)

3.3 执行变量里的命令

# eval $command
/root

(补充:这里以执行变量 command 里的 pwd 命令为例)

内容四:eval 显示脚本里最后 1 个位置变量的内容
4.1 创建显示最后 1 个位置变量的脚本

# vim test.sh

创建以下内容:

#!/bin/bash
eval echo \$$#

(补充:这里创建名为 test.sh 的脚本为例)

4.2 带位置变量执行脚本

# . test.txt a b c d e
e

(补充:这里执行名为 test.sh 的脚本并附带 a b c d e 5 个位置变量为例)

内容五:eval 实现指针
5.1 设置变量

# url=eternalcenter.com

(补充:这里以将内容 eternalcenter.com 赋值给变量 url 为例)

5.2 设置指针

# pointer=url

(补充:这里以让指针 pointer 指向 url 变量为例)

5.3 显示指针指向的变量

# echo $pointer
url

(补充:这里以显示指针 pointer 指向的变量 url 为例)

5.4 显示指针最终指向的内容

# eval echo \$$pointer
eternalcenter.com

(补充:这里以显示指针 pointer 指向的最终内容 eternalcenter.com 为例)

[命令] Linux 变量替换

内容目录:

案例一:当要替换的变量未定义或为空时则给予其一个默认值

案例二:当要替换的变量已定义且不为空时则给予其一个默认值

案例三:当要替换的变量已定义且不为空时则替换此变量的前一部分
3.1 当要替换的变量已定义且不为空时则替换此变量的前一部分
3.2 当要替换的变量已定义且不为空时则替换此变量的某一部分

案例四:当要替换的变量已定义且不为空时则替换此变量去除前一部分的值
4.1 去除变量左数第一个某一个符号前面的所有值
4.2 去除变量左数最后某一个符号前面的所有值
4.3 去除前面一部分值

案例五:当要替换的变量已定义且不为空时则替换此变量去除后一部分的值
5.1 去除变量右数第一个某一个符号前面的所有值
5.2 去除变量右数最后某一个符号前面的所有值
5.3 去除后面一部分值

案例六:当要替换的变量已定义且不为空时则替换此变量替换一部分后的值

具体的内容:

案例一:当要替换的变量未定义或为空时则给予其一个默认值

# value=
# newvalue=${value:-eternalcenter}
# echo $newvalue
eternalcenter
# value=mingyuzhu
# newvalue=${value:-eternalcenter}
# echo $newvalue
mingyuzhu

或者:

# value=
# newvalue=${value:=eternalcenter}
# echo $newvalue
eternalcenter
# value=mingyuzhu
# newvalue=${value:=eternalcenter}
# echo $newvalue
mingyuzhu

(补充:这里以当变量 value 存在且为空时则变量 newvalue 的值为 eternalcenter 为例)

案例二:当要替换的变量已定义且不为空时则给予其一个默认值

# value=
# newvalue=${value:+eternalcenter}
# echo $newvalue
# value=mingyuzhu
# newvalue=${value:+eternalcenter}
# echo $newvalue
eternalcenter

(补充:这里以当变量 value 存在且不为空时则变量 newvalue 的值为 eternalcenter 为例)

案例三:当要替换的变量已定义且不为空时则替换此变量的前一部分
3.1 当要替换的变量已定义且不为空时则替换此变量的前一部分

# value=mingyuzhu
# newvalue=${value:offset:4}
# echo $newvalue
ming

或者:

# value=mingyuzhu
# newvalue=${value:0:4}
# echo $newvalue
ming

(补充:这里以当变量 value 存在且不为空时则变量 newvalue 的值为变量 value 前 4 个字符为例)

3.2 当要替换的变量已定义且不为空时则替换此变量的某一部分

# value=mingyuzhu
# newvalue=${value:4:2}
# echo $newvalue
yu

(补充:这里以当变量 value 存在且不为空时则变量 newvalue 的值为变量 value 从第 4 个字符开始的 2 个字符为例)

案例四:当要替换的变量已定义且不为空时则替换此变量去除前一部分的值
4.1 去除变量左数第一个某一个符号前面的所有值

# value=ming:yu:zhu
# newvalue=${value#*:}
# echo $newvalue
yu:zhu

(补充:这里以去除变量 value 左数第一个冒号 “:” 前面的所有值并赋予给变量 newvalue 为例)

4.2 去除变量左数最后某一个符号前面的所有值

# value=ming:yu:zhu
# newvalue=${value##*:}
# echo $newvalue
zhu

(补充:这里以去除变量 value 左数最后一个冒号 “:” 前面的所有值并赋予给变量 newvalue 为例)

4.3 去除前面一部分值

# value=mingyuzhu
# novalue=ming
# newvalue=${value##$novalue}
# echo $newvalue
yuzhu

(补充:这里以去除变量 value 前面的 ming 值并赋予给变量 newvalue 为例)

案例五:当要替换的变量已定义且不为空时则替换此变量去除后一部分的值
5.1 去除变量右数第一个某一个符号前面的所有值

# value=ming:yu:zhu
# newvalue=${value%:*}
# echo $newvalue
ming:yu

(补充:这里以去除变量 value 右数第一个冒号 “:” 前面的所有值并赋予给变量 newvalue 为例)

5.2 去除变量右数最后某一个符号前面的所有值

# value=ming:yu:zhu
# newvalue=${value%%:*}
# echo $newvalue
ming

(补充:这里以去除变量 value 右数最后一个冒号 “:” 前面的所有并赋予给变量 newvalue 值为例)

5.3 去除后面一部分值

# value=mingyuzhu
# novalue=ming
# newvalue=${value%%$novalue}
# echo $newvalue
mingyu

(补充:这里以去除变量 value 后面的 zhu 值并赋予给变量 newvalue 为例)

案例六:当要替换的变量已定义且不为空时则替换此变量替换一部分后的值

# value=mingyuzhu
# noneedvalue=yu
# needvalue=zhu
# newvalue=${value/$noneedvalue/$needvalue}
# echo $newvalue
mingzhuzhu

(补充:这里以将变量 value 中的 yu 替换成 zhu 并赋予给变量 newvalue 为例)

[命令] Linux 命令 (()) (比较数值文件和字符串)

内容一:(()) 比较符号
1.1 (()) 数值比较符号

1) ==,若两个数值存在且相等,则结果为真
2) !=,若两个数值存在且不相等,则结果为真
3) >,若两个数值存在且前一个数值大于后一个数值,则结果为真
4) <,若两个数值存在且前一个数值小于后一个数值,则结果为真 5) >=,若两个数值存在且前一个数值大于或等于后一个数值,则结果为真
6) <=,若两个数值存在且前一个数值小于或等于后一个数值,则结果为真

1.2 (()) 字符串比较符号

==,若两个字符串存在且一样,则结果为真

内容二:(()) 的数值比较案例
2.1 案例一:对整数进行比较

# (( 0 -ne 1 ))
# echo $?
0

(补充:这里以测试数字 0 是否不等于数字 1 为例)

2.2 案例二:对字符串进行比较

# (( a == a ))
# echo $?
0

(补充:这里以测试字符串 a 是否等于字符串 a 为例)

[命令] Linux 命令 [[]] (比较数值、文件、目录、链接、块、特殊文件、字符串)

内容一:[[]] 比较符号
1.1 [[]] 数值比较符号

1) -eq 或者 ==,若两个数值存在且相等,则结果为真
2) -ne 或者 !=,若两个数值存在且不相等,则结果为真
3) -gt 或者 >,若两个数值存在且前一个数值大于后一个数值,则结果为真
4) -lt 或者 <,若两个数值存在且前一个数值小于后一个数值,则结果为真
5) -ge 或者 >=,若两个数值存在且前一个数值大于或等于后一个数值,则结果为真
6) -le 或者 <=,若两个数值存在且前一个数值小于或等于后一个数值,则结果为真

1.2 [[]] 字符串比较符号

1) -z,如果字符串为空值,则结果为真
2) -n,如果字符串不为空值,则结果为真
3) == 或者 =,若两个字符串存在且一样,则结果为真
4) !=,若两个字符串存在且不一样,则结果为真
5) >,若两个字符串存在且前一个字符串大于后一个字符串(按数字顺序或字母数顺序进行比较,越靠后的值越大),则结果为真
6) <,若两个字符串存在且前一个字符串小于后一个字符串(按数字顺序或字母数顺序进行比较,越靠后的值越大),则结果为真

1.3 [[]] 文件、目录、链接、块、特殊文件比较符号

1) -e,若文件或目录或链接存在,则结果为真
2) -d,若目录存在,则结果为真
3) -f,若文件存在,则结果为真
4) -L,若链接存在,则结果为真
5) -b,若块文件存在,则结果为真
6) -c,若字符型特殊文件存在,则结果为真
7) -s,若文件存在且里面有内容,则结果为真
8) -r,若文件且可读,则结果为真
9) -w,若文件且可写,则结果为真
10) -x,若文件且可执行,则结果为真
11) -nt,若两个文件存在且前一个文件比后一个文件新,则结果为真
12) -ot,若两个文件存在且前一个文件比后一个文件新,则结果为真

1.4 [[]] 逻辑符号

1) &&,和
2) ||,或
3) !,非

1.5 [[]] 运算符号

1) +,若两个数值存在,则相加
2) -,若两个数值存在,则相减
3) *,若两个数值存在,则相乘
4) /,若两个数值存在,则相除
5) %,若两个数值存在,则取余

1.6 [[]] 其他符号

1) =~,两个字符串或数值存在且后一个字符串或数值匹配正则表达式后一样,则结果为真
2) [0-9] 等所有 Linux 正则表达式
3) * 等所有 Linux 通配符

内容二:[[]] 的数值比较案例
2.1 案例一:对整数进行比较

# [[ 0 -ne 1 ]]
# echo $?
0

(补充:这里以测试数字 0 是否不等于数字 1 为例)

2.2 案例二:对字符串进行比较

# [[ a == a ]]
# echo $?
0

(补充:这里以测试字符串 a 是否等于字符串 a 为例)

2.3 案例三:对文件进行比较

# [[ -f test.txt ]]
# echo $?
0

(补充:这里以测试文件 test.txt 是否存在为例)

2.4 案例四:对变量进行比较

# a=1
# [[ $a == 1 ]]
# echo $?
0

(补充:这里以测试变量 a 是否等于数字 1 为例)

2.5 案例五:对数值运算后进行比较

# a=2
# b=3
# c=5
# [[ $a+$b -eq $c ]]
# echo $?
0

(补充:这里以测试变量 a 加变量 b 是否等于变量 c 为例)

(注意: [[]] 数值运算后需要使用 -eq、-ne、-gt、-lt、-ge、-le 进行比较而不是使用 ==、!=、>、<、>=、<=)

2.6 案例六:使用逻辑符号对多个变量进行比较

# a=eternalcenter
# b=eternalcenter
# c=eternalcentre
# [[ $a == $b && $b != $c ]]
# echo $?
# 0

(补充:这里以测试变量 a 是否等于变量 b 且变量 b 是否不等于变量 c 为例)

2.7 案例七:使用通配符对字符串进行比较

# [[ eternalcenter = eternalcen??? ]]
# echo $?
# 0

或者:

# [[ eternalcenter = e*r ]]
# echo $?
# 0

(补充:这里以测试字符串 eternalcenter 是否等于字符串加通配符 eternalcen??? 或字符串加通配符 e*r 为例)

2.8 案例八:使用正则表达式对字符串进行比较

# [[ 10 =~ [0-9]{2} ]]
# echo $?
# 0

(补充:这里以测试数字 10 是否是每位数是 0 到 9 的两位数为例)

[命令] Linux 命令 set (设置 Shell 里的位置变量或者 Shell 的执行方式)

内容一:set 命令的格式
1.1 设置 Shell 的位置变量的格式

# set <Value of the first position variable> <Value of the second location variable> ......

1.2 设置 Shell 的执行方式

# set <parameter>

或者:

# set <parameter> +o

或者:

# set <parameter> -o

(补充:+o 代表打开特殊属性,-o 代表结束特殊属性)

内容二: set 的常用参数

1) -a 将已修改的变量进行标记,为将其输出至环境变量做准备
2) -b 让被中止的后台进程立刻显示退出状态代码
3) -d 取消使用杂凑表记忆中使用过的指令
4) -e 若退出状态代码不为 0 (正常退出)则立即退出,并显示错误原因
5) -f 取消通配符
6) -h 默认自动记录函数位置
7) -k 让命令的参数为此命令的环境变量
8) -l 默认自动记录 for 循环变量名
9) -m 监视模式
10) -n 测试模式(只读取不执行)
11) -p 优先顺序模式
12) -P 让文件或目录代替符号链接
13) -t 让随后的命令执行后立即退出
14) -u 使用未定义的变量时显示错误信息
15) -v 显示输入值
16) -H shell 使用感叹号 “!” + 号码的方式调用 history 命令中的历史命令
17) -x 命令指向前先显示此命令的参数或变量

(补充:将以上参数前面的 – 换成 + 则会变成相反的效果)