Bash脚本编程--学习笔记

Bash脚本编程

bash特殊字符

注释(#)

#!:指定当前脚本的解释器

分号(;)

同一行多个命令
if后面加空格,判断条件用中括号
终止case选项(双分号)

#!/bin/bash

varname=b

case "$varname" in
    [a-z]) echo "abc";;
    [0-9]) echo "123";;
esac

点号(.)

.=source filename读取并执行文件

引号

双引号(")
“STRING” 将会阻止(解释)STRING 中大部分特殊的字符。

单引号(’)
‘STRING’ 将会阻止 STRING 中所有特殊字符的解释,这是一种比使用"更强烈的形式

双引号认为是变量的时候,单引号直接认为是字符

斜线和反斜线

**斜线:**文件名路径分隔符,多个和一个是一样的
反斜线:

  • 符号 说明
  • \n表示新的一行
  • \r表示回车
  • \t 表示水平制表符
  • \v 表示垂直制表符
  • \b 表示后退符
  • \a 表示"alert"(蜂鸣或者闪烁)
  • \0xx 转换为八进制的 ASCII 码, 等价于 0xx
  • " 表示引号字面的意思

反引号(`)

(` `中的语句优先执行)

冒号( : )

等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与 shell 的内建命令 true 作用相同。“:”命令是一个 bash 的内建命令,它的退出码(exit status)是(0)。
-gt:greater than
-lt:greater than
-eq:greater than

与>重定向结合使用,清空文件

: > test.sh   # 文件“test.sh”现在被清空了
# 与 cat /dev/null > test.sh 的作用相同
# 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令

在与 >> 重定向操作符结合使用时,将不会对预先存在的目标文件
“:” 还用来在 /etc/passwd 和 $PATH 变量中做分隔符

问号( ?)

同C语言,
(( t=a<50?8:9 ))

变量替换($)

echo $var1

小括号(())

1.括号中的相当于局部变量
2.初始化数组用括号

大括号({})

赋值内容到另一个文件

#!/bin/bash

if [ ! -w 't.txt' ];
then
    touch t.txt
fi
echo 'test text' >> t.txt
cp t.{txt,back}

注意: 在大括号中,不允许有空白,除非这个空白被引用或转义。
代码块
创建了一个匿名函数

#!/bin/bash

a=123
{ a=321; }
echo "a = $a"

中括号([])

  • [ ]中放条件
  • [ [ ] ]双括号中也作条件判断
  • 数组元素赋值

尖括号(< 和 >)

test.sh > filename:重定向 test.sh 的输出到文件 filename 中。如果 filename 存在的话,那么将会被覆盖。

test.sh &> filename:重定向 test.sh 的 stdout(标准输出)和 stderr(标准错误)到 filename 中。

test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。

test.sh >> filename:把 test.sh 的输出追加到文件 filename 中。如果 filename 不存在的话,将会被创建。

竖线(|)

管道:输出作为后续命令的输入

破折号

  • 在所有的命令内如果想使用选项参数的话,前边都要加上“-”。
  • 重定向stdin或stdout

下面脚本用于备份最后 24 小时当前目录下所有修改的文件.

#!/bin/bash

BACKUPFILE=backup-$(date +%m-%d-%Y)
# 在备份文件中嵌入时间.
archive=${1:-$BACKUPFILE}
#  如果在命令行中没有指定备份文件的文件名,
#  那么将默认使用"backup-MM-DD-YYYY.tar.gz".

tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."

exit 0

波浪线(~)

home目录

变量和参数

变量定义

变量名和等号之间不能有空格。同时,变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用 bash 里的关键字(可用 help 命令查看保留关键字)。
    语句赋值:for file in `ls /etc`看不懂

使用变量

  • 可以加{ }表示边界,实现读取变量后面连接别的字符,否则会识别出一个的变量
  • 已定义的变量可重新被定义

只读变量

readonly

特殊变量

  • 局部变量
    这种变量只有在代码块或者函数中才可见。
  • 环境变量
    每个进程都有自己的“环境”,这个环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。在这种情况下,shell 与一个一般的进程没什么区别。
  • 位置参数
    从命令行传递到脚本的参数:$0,$1,$2,$3…
    $0 就是脚本文件自身的名字,$1 是第一个参数,$2 是第二个参数,$3 是第三个参数,然后是第四。$9 之后的位置参数就必须用大括号括起来了,比如,${10},${11},${12}。
  • $# : 传递到脚本的参数个数
  • $* : 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9 个
  • $$ : 脚本运行的当前进程 ID 号
  • $! : 后台运行的最后一个进程的进程 ID 号
  • $@ : 与 $* 相同,但是使用时加引号,并在引号中返回每个参数
  • $: 显示 shell 使用的当前选项,与 set 命令功能相同
  • $? : 显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。
    位置参数实例

基本运算符

算数运算符

在这里插入图片描述

  • 原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
  • expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
    注意使用的反引号(esc 键下边)
  • 表达式和运算符之间要有空格 $a + $b 写成 a + a+ a+b 不行
  • 条件表达式要放在方括号之间,并且要有空格 [ $a == b ] 写 成 [ b ] 写成 [ b][a==$b] 不行
  • 乘号(*)前边必须加反斜杠()才能实现乘法运算
  • expr 只能用于整数计算,可以使用 bc 或者 awk 进行浮点数运算

关系运算符

在这里插入图片描述

逻辑运算符

在这里插入图片描述

字符串运算符

在这里插入图片描述

文件测试运算符

在这里插入图片描述

流程控制

if else

sh 的流程控制不可为空

  • 在 sh/bash 里可不能这么写,如果 else 分支没有语句执行,就不要写这个 else。
if condition1
then
    command1
elif condition2
then
    command2
else
    commandN
fi

#例子
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo 'Two numbers are equal!'
else
    echo 'The two numbers are not equal!'
fi

for循环

for var in item1 item2 ... itemN  #循环条件可以是字符串,都是一次读取直到为空
do
    command1
    command2
    ...
    commandN
done

while语句

  • let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量

无限循环

while :
do
    command
done
#或者
while true
do
    command
done
#或者
for (( ; ; ))

until循环

until condition
do
    command
done

case

casein
模式1)       #每一模式必须以右括号结束。
    command1
    command2
    ...
    commandN
    ;;       #匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
模式2)
    command1
    command2
    ...
    commandN
    ;;
    #如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
    *)
    ;;
 
esac

跳出循环

  • break
    跳出后面的所有循环
    break n 跳出n层循环
  • continue
    跳出当前循环

esca

结束标记,两个分号作为break

函数定义

[ function ] funname [()]
{
	action;
	[return int;]
}
  • 可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数。
  • 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)。
    例子
#!/bin/bash
funWithReturn(){
    echo "This function will add the two numbers of the input..."
    echo "Enter the first number: "
    read aNum
    echo "Enter the second number: "
    read anotherNum
    echo "The two numbers are $aNum and $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "The sum of the two numbers entered is $? !"
  • 函数返回值在调用该函数后通过 $? 来获得
  • 函数在使用前定义

函数参数获取

#!/bin/bash
funWithParam(){
    echo "The first parameter is $1 !"
    echo "The second parameter is $2 !"
    echo "The tenth parameter is $10 !"
    echo "The tenth parameter is ${10} !"#获取第10个参数
    echo "The eleventh parameter is ${11} !"
    echo "The total number of parameters is $# !"
    echo "Outputs all parameters as a string $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
  • 10以上的参数获取需要使用${n}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值