代码的运行结果
p1.sh代码:
echo $# $1 $2 $3 $4
shift
echo $# $1 $2 $3 $4
shift
echo $# $1 $2 $3 $4
set aa bb cc
echo $# $1 $2 $3 $4
[root@red ~]# bash p1.sh 10 20 30 40 50
运行结果:
5 10 20 30 40
4 20 30 40 50
3 30 40 50
3 aa bb cc
- 初始状态
$#=5(参数个数),$1=10, $2=20, $3=30, $4=40→ 输出:5 10 20 30 40 - 第一次 shift
左移参数:丢弃$1(10),剩余参数变为$1=20, $2=30, $3=40, $4=50,$#=4
→ 输出:4 20 30 40 50 - 第二次 shift
再次左移:丢弃$1(20),剩余$1=30, $2=40, $3=50,$#=3
关键点:此时只有3个参数,$4未定义(输出为空)
→ 输出:3 30 40 50 - 执行 set aa bb cc
重置位置参数:$#=3,$1=aa, $2=bb, $3=cc,$4未定义
→ 输出:3 aa bb cc
代码:
st=(123 456 abc)
for s in "${st[*]}" ; do
echo $s
done
for x in "${st[@]}" ; do
echo $x
done
运行结果
123 456 abc
123
456
abc
"${st[*]}"将整个数组合并为单个字符串(元素间用空格连接)
→ 等效于s="123 456 abc"
→ 只循环1次,输出:123 456 abc
第二个循环:for x in "${st[@]}"
"${st[@]}"将每个元素作为独立字符串处理
→ 循环3次,依次输出:
123
456
abc
代码:
[root@red ~]# str="axxyycd"
[root@red ~]# [[ $str == a?b ]]; echo $?
[root@red ~]# [[ $str == a*b ]]; echo $?
[root@red ~]# str="abcabcabcabcd"
[root@red ~]# [[ $str =~ a ]];echo $?
[root@red ~]# [[ $str =~ abc ]] **;** echo $?
[root@red ~]# [[ $str =~ (abc)+ ]]; echo $?
[root@red ~]# [[ $str =~ ^(abc)+$ ]]; echo $?
[root@red ~]# [[ $str =~ ^(abc)+d$ ]]; echo $?
运行结果
1
1
0
0
0
1
0
| 操作符 | 匹配类型 | 关键区别 |
|---|---|---|
== | 通配符模式 | ?匹配单字符,*匹配任意 |
=~ | 正则表达式 | 支持分组()和量词+ |
^ | 锚定行首 | 必须从开头匹配 |
$ | 锚定行尾 | 必须到结尾结束 |
1. [[ $str == a?b ]]; echo $? → 1
==进行通配符匹配(非正则)a?b匹配规则:以a开头 + 单个任意字符 +b结尾- 实际字符串
axxyycd长度>3且结尾是d→ 不匹配
→ 返回状态码 1
2. [[ $str == a*b ]]; echo $? → 1
a*b匹配规则:以a开头 + 任意数量字符 +b结尾- 字符串结尾是
d而非b→ 不匹配
→ 返回状态码 1
3. [[ $str =~ a ]]; echo $? → 0
=~进行正则匹配- 正则
a:包含字母a即可 - 字符串含多个
a→ 匹配
→ 返回状态码 0
4. [[ $str =~ abc ]]; echo $? → 0
- 正则
abc:包含连续子串abc - 字符串含多个
abc→ 匹配
→ 返回状态码 0
5. [[ $str =~ (abc)+ ]]; echo $? → 0
- 正则
(abc)+:一个以上连续"abc" - 字符串开头有4个连续
abc→ 匹配
→ 返回状态码 0
6. [[ $str =~ ^(abc)+$ ]]; echo $? → 1
- 正则
^(abc)+$:整个字符串必须由1个以上"abc"组成 - 字符串结尾有额外字符
d→ 不匹配
→ 返回状态码 1
7. [[ $str =~ ^(abc)+d$ ]]; echo $? → 0
- 正则
^(abc)+d$:以1个以上"abc"开头 + 结尾是单个"d" - 字符串结构:
abcabcabcabc(4组) +d→ 精确匹配
→ 返回状态码 0
代码:
rm –r da
touch b.txt
if [ -f b.txt ] && echo "file" && [ -d da ] && echo " directory" then
echo "one"
else
echo "two"
fi
运行结果
file
two
rm –r da
- 尝试删除不存在的目录
da→ 失败(但脚本会继续执行)
touch b.txt
- 成功创建文件
b.txt
- 条件判断
if [...]
[ -f b.txt ]→ 检查文件存在 → 真(返回 0)&& echo "file"→ 执行成功 → 输出file&& [ -d da ]→ 检查目录da存在 → 假(目录不存在,返回非 0)&& echo " directory"→ 因前一条件失败,不再执行
- 条件结果
&&链遇到第一个假值后即终止 → 整个条件判断为假- 因此执行
else分支 → 输出two