for循环


常用语法:

  1. #!/bin/bash
  2. #1.for循环遍历数组
  3. array=(1 2 3)
  4. for var in ${array[*]}
  5. do
  6. echo $var
  7. done
  8. for var in ${array[*]}; do echo $var; done;

注: for命令支持break和continue,语法与其它脚本一致

读取列表中的复杂值


for test in I don't konow if this'll work ; do
    echo "word:$test"
done
# 输出
# I
# dont know if thisll
# work

解决方法:

  • 转义字符
  • 双引号来定义
  • 包含空格的数据使用双引号包含

更改字段分隔符


for读取列表进行分隔时根据默认分隔符IFS进行分隔:

  • 空格
  • 制表符
  • 换行符
#设置分隔符为换行符
IFS=$'\n'

#设置多个分隔符
IFS=$'\n':;

注意还原换行符 IFS_OLD=$IFS IFS=$’\n’ do IFS=$IFS_OLD

使用通配符读取目录


for file in /home/rich/test/* 
do 
 if [ -d "$file" ] 
 then 
 echo "$file is a directory" 
 elif [ -f "$file" ] 
 then 
 echo "$file is a file" 
 fi

C语言风格的for命令


for (( i=1; i<=10; i++ )); do
    echo "$i"
done

for (( a=1, b=10; a<=10; a++, b--)); do
    echo "$a - $b"
done

if-then


一般语法:

if command
then
    commands
fi

常用语法:

#!/bin/bash

# condition=false
condition=1

if [ $condition == 1 ]
then
echo 1
elif [ $condition == 2 ]
then
echo 2
else
echo 3
fi

解释: 当if语句后面的命令的退出状态码为0(成功运行), 位于then部分的命令会被执行 注意 [ command ]是test命令测试的另一种方法

复合条件测试:

[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]

高级特性 (( )) [[ ]]


(( expression ))
支持的算术运算如下:

符号 描述
val++
val—
! 逻辑求反
- 位求反
** 幂运算
<<
&
||

[[ expression ]]
支持高级字符串运算 - 模式匹配

#!/bin/bash 
# using pattern matching 
# 
if [[ $USER == r* ]] 
then 
 echo "Hello $USER" 
else 
 echo "Sorry, I do not know you" 
fi

test命令


语法: test condition

于是if命令可以这样写:

if test condition
then
    commands
fi

# 等价于
if [ condition ]
then
    commands
fi

test命令可以判断三类条件:

  • 数值比较
  • 字符串比较
  • 文件比较

数值比较


语法:

n1 option n2 
# option
# -eq n1与n2是否相等
# -ge n1是否大于等于n2
# -gt -le -lt -ne

缺点:

  • test不能比较浮点值

字符串比较


比较 描述
str1 = str2 str1是否与str2相等
str1 != str2 str1是否与str2不等
str1 < str2 str1是否比str2小
str1 > str2 str1是否比str2大
-n str1 str1长度是否非0
-z str1 str1 长度是否为0

注意:

  • 和<号必须转义,否则当做重定向

  • 大于和小于顺序和sort命令采用不同
    • 大写子母小于小写子母, 采用标准ASCII顺序排序
  • 未定义的变量的长度为0

case命令


语法:

case variable in
pattern1 | pattern2) command1;;
pattern3) command2;;
*) default command3;;
esac

while命令


while命令是if-then和for的结合. while命令需要测试命令并进行循环处理.

语法:

while test command
do
    other commands
done

特点:

  • while可以使用多个测试命令, 多个测试命令都会执行, 且最后一个测试命令决定语句是否执行

until命令


while命令的取反

循环的输出


循环的输出可以使用管道或重定向:

for file in /home/rich/* 
 do 
 if [ -d "$file" ] 
 then 
 echo "$file is a directory" 
 elif 
 echo "$file is a file" 
 fi 
done > output.txt