shell脚本语法

shell脚本的开头一般是#!/bin/bash#!/bin/sh ,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径;这两者存在一定差别,例如:shell sh执行出现错误后会停止执行,而shell bash是一直执行到低。
如何运行脚本:
1.sh hello.shbash hello.sh. hello.sh
2. ./hello.sh
注意:第一种方法不要求脚本文件hello.sh有可执行权限,第二种方法要求脚本有可执行权限

1. 特殊字符的含义:

$*$@ : 所有参数列表。
$1 ~ $n : 各个参数的值。$1:第一个参数,$2:第二个参数,……,$n:第n个参数;
$# : 参数的个数。
$0 : shell本身的文件名。
$$ : shell本身的PID

* 输入、输出重定向*
1.三个文件描述符:0、1、2
0 标准输入
1 标准输出
2 标准错误
2.使用范例
command >&m m表示文件描述符

1).ls > ls.out ls标准输出到文件ls.out;等于ls 1>ls.out,1可以省略
2).ls > ls.out 2>&1 标准输出,标准错误都输出到ls.out

>      输出到文件,若文件不存在就新建文件;若文件存在,覆盖文件中的内容
>>     输出到文件,若文件不存在就新建文件;若文件存在,接着输出,不覆盖

2. shell变量

shell变量和一些编程语言不同,一般shell的变量赋值的时候不用带$,而使用或者输出的时候要带$。加减乘除的时候要加两层小括号$(())。括号外面要有一个$,括号里面的变量可以不用$。需要注意的是,变量赋值,变量使用的时候不能有空格,否则会被解析成命令,报错无此命令。
例子:

#!/bin/bash

a=10                   #赋值的时候不用加'$'
b=20

echo "a = "$a          #输出的时候需要加'$'
echo "b = "$b          #输出b的值

echo "a+b = "$((a+b))  #加减乘除运算时要加'$(())'
echo "a^3 = "$((a**3)) #输出a的3次方的值,次方

3. if条件判断

代码格式:

if 条件测试1 then 
     do something here 
elif 条件测试2 then 
     do another thing here 
else 
     do something else here 
fi  

条件有这么几种写法:[ 条件 ]、test 条件、[[ 条件 ]]、(( 条件 )),用的最多的是第一种。

[ ]条件测试符号
注意:[ ]括号两边都有空格
1.逻辑运算符
-a  expr1 -a expr2   逻辑与
-o  expr1 -o expr2   逻辑或
!  !expr1      逻辑非
 
2.字符串判断
=  str1 = str2   字符串是否相等
!=  str1 != str2  字符串是否不等
-n  -n str1    字符串长度是否不等于0
-z  -z str2    字符串长度是否等于0

3.数值判断
-eq  num1 -eq num2   是否相等
-ne  num1 -ne num2   是否不相等
-gt   num1 -gt num2   是否大于
-ge  num1 -ge num2  是否大于等于
-lt   num1 -lt num2   是否小于
-le  num1 -le num2   是否小于等于

4.文件判断
-r   -r filename   文件是否存在且可读
-w  -w filename  文件是否存在且可写
-s   -s filename   文件是否存在且长度非0
-f  -f filename   文件是否存在且是普通文件
-d  -d filename   文件是否存在且是一个目录

4.单引号 ’ ,双引号 “,反引号 `

单引号 ’ ‘
单引号内的字符,不论是普通字符还是特殊字符,全都当成普通字符;也就是单引号内的所有内容,都当成普通字符输出。

[root@linux ~]# name=TekTea
[root@linux ~]# sayhello='Hello $name'
[root@linux ~]# echo $sayhello
Hello $name   /*$ 只作为普通字符处理*/ 

双引号 ” “
由双引号括起来的字符,$(美元符号)、\(反斜杠)、’(单引号)、和”(双引号)这几个字符仍是特殊字符并保留其特殊功能外,其余字符作为普通字符对待。
$(美元符号):取$后面变量的指
\(反斜杠):转义字符

[root@linux ~]# name=TekTea
[root@linux ~]# sayhello="Hello $name"
[root@linux ~]# echo $sayhello
Hello TekTea

反引号 “ 与$( )
反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。

[root@linux ~]# echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
[root@linux ~]# echo the last sunday is `date -d "last sunday" +%Y-%m-%d`
两种方法功能相同,都是得到上一星期天的日期

注意:
(反引号)很容易与' '(单引号)搞混,$( )更加直观;
(反引号)基本上可在全部的unix shell中使用,若写成shell script移植性比较高。而$( )并不是每一种shell都能使用。
${ }用来作变量替换
一般情况下,$var${var}作用相同。但是用${ }会比较精确的界定变量名称的范围,例如:
$ A=B
$ echo $AB
原本是打算先将 ABAB使 { }就没问题了:
$ echo ${A}B
BB

${ }的一些特异功能

定义一个变量:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换获得不同的值:
${file#*/} 拿掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/} 拿掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.} 拿掉第一个 . 及其左边的字符串:file.txt
${file##*.} 拿掉最后一个 . 及其左边的字符串:txt
${file%/*} 拿掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*} 拿掉第一个 / 及其右边的字符串:(空值)
${file%.*} 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*} 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法:
 去掉左边(键盘上 # 在 $ 的左边)
% 去掉右边(在键盘上 % 在 $ 的右边)
单一符号是最小匹配,两个符号是最大匹配。
${file:0:5} 提取最左边的 5 个字节:/dir1
${file:5:5} 提取第 5 个字节右边的连续 5 个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path} 将第一个 dir 替换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path} 将全部 dir 替换为 path:/path1/path2/path3/my.file.txt
利用${ }还可针对不同的变量状态赋值(未设定、空值、非空值): 
${file-my.file.txt} 若 $file 未设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理) 
${file:-my.file.txt} 若 $file 未设定或为空值,则使用 my.file.txt 作传回值。(非空值时不作处理)
${file+my.file.txt} 若 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(未设定时不作处理)
${file:+my.file.txt} 若 $file 为非空值,则使用 my.file.txt 作传回值。(未设定及空值时不作处理)
${file=my.file.txt} 若 $file 未设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt。 (空值及非空值时不作处理)
${file:=my.file.txt} 若 $file 未设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt。 (非空值时不作处理)
${file?my.file.txt} :若 $file 未设定,则将 my.file.txt 输出至 STDERR。(空值及非空值时不作处理)
${file:?my.file.txt} :若 $file 未设定或为空值,则将 my.file.txt 输出至 STDERR。(非空值时不作处理)
以上的理解在于,一定要分清楚 unset 与 null 及 non-null 这三种赋值状态。
一般而言,与 null 有关,若不带 : 的话,null 不受影响,若带 : 则连 null 也受影响。
${#var} 可计算出变量值的长度:
${#file} 可得到 27,/dir1/dir2/dir3/my.file.txt 刚好是 27 个字节。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值