shell脚本

642 阅读2分钟

示例

test.sh 文件

#!/bin/bash  表示是哪一种脚本
echo "Hello World !"

运行

/bin/sh test.sh
./test.sh

变量

命名

yourName="aaa" 
echo $yourName
echo ${yourName}
  • 变量名和等号之间不能有空格
  • 命名只能使用英文数字下划线
  • 不能以数字打头
  • 不能使用bash里关键字

只读变量 readonly

yourName="aaa" 
readonly yourName

删除变量(不能删除只读变量)

unset yourName

字符串

单引号

  • 单引号中的变量无效
  • 单引号可以用于拼接
yourName='aaa'
echo 'bb${yourName}cc'
bb${yourName}cc
echo 'bb'$yourName'cc'
bbaaacc
echo 'bb'${yourName}'cc'
bbaaacc

双引号

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
yourName="aaa"
echo "bb${yourName}cc"
bbaaacc
echo "bb"$yourName"cc"
bbaaacc
echo "bb\"${yourName}\"cc"
bb"aaa"cc

获取字符串长度

yourName="aaa"
echo ${#yourName}

提取子字符串

${string:index:leng}

aa="abcd"
echo ${aa:1:2} bc

查找子字符串

aa="abcdef"
echo `expr index "$aa" f`
6 查找f在字符串中位置(index+1)

数组

定义数组

arr=(1 2 3 4)
arr[6]=6
echo ${arr[6]}
6
echo ${arr[@]} 所有元素
1 2 3 4

数组长度

arr=(1 2 3 4)
echo ${#arr[@]}
4
echo ${#arr[*]}
4

注释

单行注释

# 单行注释

多行注释

:<<EOF
多行注释
EOF

:<<'
多行注释
'

:<<!
注释内容...
!

参数传递

/bin/sh test.sh 1 2 3
$0 test.sh 文件名
$1 1 第一个参数
$2 2 第二个参数
$3 3 第三个参数
$# 3 参数个数
$* 1 2 3 所有参数
$@ 1 2 3 所有参数
$$ 单前脚本进程号
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

运算符

算术运算

# 表达式与运算符之间要有空格
a=10
b=20
+  echo `expr $a + $b`  //30
-  echo `expr $b - $a`  //10
*  echo `expr $b \* $a` //300
/  echo `expr $b / $a`  //2
%  echo `expr $b % $a`  //0
== echo `expr $b == $a` //0
!= echo `expr $b != $a` //1
=  赋值 a=$b

关系运算

# 只支持数字,或全数字的字符串
a=10
b=20
-eq	[ $a -eq $b ] 两个数是否相等 false
-ne	[ $a -ne $b ] 两个数是否不相等 true
-gt	[ $a -gt $b ] 左边 > 右边 false
-lt	[ $a -lt $b ] 左边 < 右边 true
-ge	[ $a -ge $b ] 左边 >= 右边 false
-le	[ $a -le $b ] 左边 <= 右边 true

布尔运算

a=10
b=20
!   非运算 [ ! false ] true。
-o	或运算 [ $a -lt 20 -o $b -gt 100 ] true
-a	与运算	[ $a -lt 20 -a $b -gt 100 ] false

逻辑运算

&&	逻辑的 AND	[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||	逻辑的 OR	[[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串运算

a="aa" b="bb"
=	字符串是否相等	   [ $a = $b ] false
!=	字符串是否不相等  [ $a != $b ] true
-z	字符串长度是否为0 [ -z $a ] false
-n	字符串长度是否不为 0 [ -n "$a" ] true
$	字符串是否为空	[ $a ] 不为空true

文件检测运算

-f file 检测文件是否是普通文件
-r file 检测文件是否可读
-w file 检测文件是否可写
-s file 检测文件是否为空
-x file 检测文件是否可执行

echo

  • 输出到文件
echo "It is a test" > myfile 
  • 显示执行结果
echo `date`

流程控制

if

if [ 10 == 20 ]
then 
  echo 1
elif [ 20 == 20 ]
then
  echo 2
else 
  echo 3
fi

for

for a in a b c
do 
  echo $a
done

while

i=3
while (($i<=5))
do
  echo $i
  let i++
done

until (true停止)

i=8
until  (($i<=5))
do
  echo $i
  let i--
done

case...esac

i=2
case $i in
  1) echo 1
  ;; #表示 break,即执行结束,跳出整个 case ... esac 语句
  2) echo 2
  ;;
  3) echo 3
esac #结束标记

跳出循环:
break跳出所有循环
continue跳出当前循环

函数

function fun(){ # 定义函数
  echo "函数1"
  echo $1 #1 参数1
  return 1 #返回值只能是0-255
}

fun1 (){ # 定义函数
# 无return 返回最后一条语句的执行结果
}
fun 1
echo $? #1 函数的返回值

引入其他文件

# test1.sh
echo "test1"

# test.sh
./test1.sh
echo "test"
# test1 test