shell script:结构化命令

本文介绍了BashShell中的几种控制结构,包括if语句的两种形式,用于复杂条件判断的case命令,以及for和while/until循环的用法。详细讲解了如何读取列表、从变量和命令获取值,更改字段分隔符,以及用通配符操作目录。此外,还提到了break和continue在循环控制中的作用。
摘要由CSDN通过智能技术生成

if语句

  1. 第一种形式
if command1
then
  commands
elif command2  # elif可选,可有多个
then
  commands
else
  commands
fi
  1. 第二种形式
if command; then
  commands
fi

if之后哪个命令的退出状态码为0(0为执行成功的退出码),then部分的命令就会被执行。如果该命令的状态码是其他值,then部分的命令就不会执行

case命令

case命令可以替换冗长的if-elif-then-fi语句,类似编程语言中的switch case

case variable in 
  pattern1 | pattern2) commands1;;
  pattern3) commands2;;
  *) default commmands;;
esac

for命令

for循环是用空格来区分列表中的每个值,如果在单独的数据值中有空格,就必须用双引号将这些值圈起来

读取列表中的值

for var in list
do
  commands
done

或如下:

for var in list; do
  commands
done

示例如下:

# 第一种形式:
for test in Alabama Alaska Arizona Arkansas California Colorado
do
  echo The next state is $test
done
# 输出正常
# 第二种形式:
for test in I don't know if this'll work
do
  echo "word: $test"
done
# 输出:
# word: I
# word: dont know if thisll
# word: work

第二种形式有两个办法解决:

  1. 使用转义字符将单引号转义
  2. 使用双引号来定义用到单引号的值
for test in I don\'t know if "this'll" work

从变量读取列表

用法示例:

list="Alabama Alaska Arizona Arkansas California Colorado"
list=$list" Connecticut"  # 向变量list中添加值
for state in $list
do
  echo "Have you ever visited $state?"
done

从命令读取值

生成列表中所需值的另一个途径就是使用命令的输出。可以用命令替换来执行任何能产生输出的命令,然后在for命令中使用该命令的输出

files="./aaa.txt"
for state in $(cat $files); do
  echo "Visit beautiful $state"
done

输出信息中会以空格、制表符、换行符作为分隔符输出文件aaa.txt中的内容

更改字段分隔符

IFS环境变量定于了bash shell用作字段分隔符的一系列字符。通常情况下,bash shell会将下列字符当作字段分隔符:

  1. 空格
  2. 制表符
  3. 换行符
    如果bash shell在数据中看到了这些字符中的任意一个,就会假定这表明了列表中一个新数据字段的开始。
    如果向改变IFS环境变量,使其只识别换行符,就必须:
IFS=$'\n'

将这句加到脚本中,告诉bash shell在数据值中忽略空格和制表符
如果要指定多个IFS字符,只要将它们的赋值串起来就行:IFS=$'\n':;” 这个赋值会将换行符,冒号,分号,双引号作为字段分隔符

用通配符读取目录

可以用for命令来自动遍历目录中的文件

#! /bin/bash
for file in /home/test/*; do
  echo "$file is a file"
done

可以在for命令中列出多个目录通配符,将目录查找和列表合并进一个for语句

for file in /home/.b* /home/test; do
  commands
done

while命令

while命令允许定义一个要测试的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码0,就会在每次迭代的一开始测试test命令。在test命令返回非零退出状态码时while命令会停止执行那组命令

while test command
do
  commands
done

示例:

var1=10
while [ $var1 -gt 0 ]; do
  echo $var1
  var1=$[ $var1 - 1 ]
done

使用多个测试命令
whilie命令允许你在while语句行定义多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环。需要注意,每一个测试命令都出现在单独的一行上

var1=10
while echo $var1
      [ $var1 -ge 0 ]
do
  echo This is inside the loop
  var1=$[ $var1 - 1 ]
done

until命令

until命令和while命令的工作方式正好相反

循环处理文件数据

控制循环

break:退出任意类型的循环,包括while和until循环。有时在内部循环但需要停止外部循环,使用break n,n指定了要跳出的循环层级,默认情况下n为1,表明跳出的是当前的循环

for (( a = 1; a < 4; a++ ))
do
  echo "Outer loop: $a"
  for (( b = 1; b < 100; b++ ))
  do
    if [ $b -gt 4 ]
    then
      break 2
    fi
    echo " Inner loop: $b"
  done
done

continue:提前中止某次循环中的命令,但并不会完全终止整个循环

处理循环的输出

可以对循环的输出使用管道或重定向。这可以通过在done命令之后添加一个处理命令来实现

for file in /home/abc/*
do
  echo "$file is file"
done > bbb.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值