linux期末复习四(shell编程运行结果)

127 阅读2分钟

代码的运行结果

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
  1. 初始状态
    $#=5(参数个数),$1=10, $2=20, $3=30, $4=40 → 输出:5 10 20 30 40
  2. 第一次 shift
    左移参数:丢弃$1(10),剩余参数变为 $1=20, $2=30, $3=40, $4=50$#=4
    → 输出:4 20 30 40 50
  3. 第二次 shift
    再次左移:丢弃$1(20),剩余 $1=30, $2=40, $3=50$#=3
    关键点:此时只有3个参数,$4未定义(输出为空)
    → 输出:3 30 40 50
  4. 执行 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
  1. rm –r da
  • 尝试删除不存在的目录 da → 失败(但脚本会继续执行)
  1. touch b.txt
  • 成功创建文件 b.txt
  1. 条件判断 if [...]
  • [ -f b.txt ] → 检查文件存在 → (返回 0)
  • && echo "file" → 执行成功 → 输出 file
  • && [ -d da ] → 检查目录 da 存在 → (目录不存在,返回非 0)
  • && echo " directory" → 因前一条件失败,不再执行
  1. 条件结果
  • && 链遇到第一个假值后即终止 → 整个条件判断为假
  • 因此执行 else 分支 → 输出 two