shell脚本语法

简介

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了,很多的动态语言都是如此,其中包括python,不同额shell可以理解为不同的解释器
Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

shell的运行有两种方法

  • ./test.sh
    如果不加./的话系统会从系统变量PATH中找有没有一个叫test.sh的二进制程序,说道这里,其实你可以自己新建一个文件夹,把自己的脚本放在里面,再把这个文件夹的路径添加到PATH,以后就能像运行其他命令一样运行test.sh来运行这个脚本
  • /bin/sh test.sh
    这种方法指定了解释器,用这种方式运行时文件的头部可以不加#!/bin/bash

注意要给脚本添加可执行权限

变量

基本操作

  • 变量的定义
    your_name=“runoob.com” 变量名不能有标点符号和关键字,等号的两边不能有空格
  • 变量的使用
    使用变量只需要在前面加个$,变量名可以用花括号包起来,这样可以识别边界,如下
for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done
  • 只读变量
    用readonly可以声明变量为只读变量
myUrl="http://www.google.com"
readonly myUrl
  • 删除变量
    unset 但是不能删除只读变量

字符串

  • 单引号
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
  • 双引号
    • 双引号里可以有变量
    • 双引号里可以出现转义字符

其实单引号里面也可以引用变量,在偶数重的单引号里面变量符号是可以被引用的。简单来说只要看变量外有几重单引号就行了,奇数个就引用,偶数个就不引用,双引号可以看成两个单引号

#!/bin/bash
name='变量引用成功'

r1='${name}'
r2=''${name}''
r3='''${name}'''
r4=''''${name}''''
r5='''''${name}'''''
r6=''''''${name}''''''

echo -e $r1
echo -e $r2
echo -e $r3
echo -e $r4
echo -e $r5
echo -e $r6

运行结果

${name}
变量引用成功
${name}
变量引用成功
${name}
变量引用成功
  • 获取字符串的长度
string="abcd"
echo ${#string} #输出 4
  • 提取字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

传递参数

参数说明
$nn从1开始,代表运行脚本时传入的第n个参数
$0执行的文件名
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

数组

  • 定义 array_name=(value1 … valuen)
  • 读取数组 ${array_name[index]}
  • 读取数组所有元素 ${my_array[@] ${my_array[*]}
  • 获取数组的长度 ${#my_array[*]} ${#my_array[@]}

基本运算符

运算命令expr

注意引号不是单引号,是反引号。表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2

val=`expr 2 + 2`
echo "两数之和为 : $val"

算术运算符

符号意义举例
+加法`expr $a + $b` 结果为 30。
-减法`expr $a - $b` 结果为 -10。
*乘法`expr $a * $b` 结果为 200。
/除法`expr $b / $a` 结果为 2。
%取余`expr $b % $a` 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!=不相等用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]

关系运算符

符号作用举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

布尔运算符

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。

字符运算符

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -n “$a” ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

文件测试运算符

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。

输出命令

echo

  • \n换行 \c不换行
  • 将结果输出到文件 echo “It is a test” > myfile
  • 显示命令执行结果 echo `date`

printf

和c语言的差不多
printf “%-10s %-8s %-4.2f\n” 郭靖 男 66.1234

流程控制

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
while condition
do
    command
done
until condition
do
    command
done
casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

函数

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
  • 函数返回值在调用该函数后通过 $? 来获得
  • $10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数

输入输出重定向

文件包含

  • . filename # 注意点号(.)和文件名中间有一空格
  • source filename

Tips

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值