标签:bash编程语言
前言
bash(Bourne-Again SHell)是一种过程式编程语言、是人机交互接口,它是解释型语言(源程序->解释器去读取执行)也称为动态语言,解释型无法脱离解释器独立运行,bash是弱类型,保存变量方式一切皆字符。
概念
脚本:将希望执行的命令罗列在文件中一起执行,bash没有库,整个程序都依赖于命令完成,在脚本中命令语句执行失败并不影响后续命令执行,如果语法错误后续所有命令将不再执行。
格式:第一行用于指定解释器类型#!/bin/bash,其他以#开头的都为注释行。
bash变量:
本地变量 :只对当前shell进程有效,其他shell和子shell进程无效
环境变量:当前shell和子shell进程有效,其他 shell进程无效
局部变量:对某shell脚本代码片段有效
位置变量:记录所传参数对应信息,当传递参数大于等于10后需要{}如:${10},$#:显示传递参数的个数。$@和$*:显示所有参数内容、shift:把当前变量销毁让下一个变量取代当前变量位置
特殊变量:有特殊意义的变量如:$?、$$
控制语句:
顺序执行:
选择执行:多分支,当满足条件后执行对应分支,if和case,case有多个测试条件时,case语句会使得语法结构更清晰。
循环执行:同一段代码执行多次,必须有退出机制否则死循环,for、while、until,循环while和until(while适用于循环次数未知,或不便用for直接生成较大列表时使用)
循环执行中有2个命令可以控制循环跳出或结束操作
continue:跳出本次操作
break:跳出本循环
变量赋值:向变量空间保存数据name=value。
变量引用:读取变量空间数据echo ${name}。
撤销变量:unset name。
只读变量:readonly name(当设置为只读变量后变量值将不能修改和撤销)。
查看当前shell进程中所有变量:set,
查看当前shell中环境变量:export、printenv、env
bash:
-n:scriptfile可做语法测试检查、
-x:显示单步执行脚本结果
bash配置文件:
profile类:为交互式登录用户提供配置
全局:/etc/profile和/etc/profile.d/*.sh
个人:~/.bash_profile
bashrc类:为非交互式用户提供配置
全局:/etc/bashrc
个人:~/.bashrc
bash操作符(+、-、*、/、%、**)这些称之为双目运算符
整数比较:(-gt(>)、-lt(<)、-ge(>=)、-le(<=)、-eq(==)、-nq(!=))
字符串比较:(<、>、=~(模式匹配)、==、!=)
还包括2个单目运算符:
-n 检查文件内容是否为空,不空为真,空为假
-z 和-n相反空为真,不空假
文件测试:
-e:存在为真
-f:存在并且为普通文件
-d:存在并且为目录、
-l或-L:存在并为链接文件、
-s:存在并且为非空文件、
-b:块设备、
-c:字符设备、
-S:套接字文件、
-p:命名管道、
-r、-w、-x:存在并且可读、可写、可执行、
-nt: 双目运算 判断file1的mtime(修改时间)新于file2
组合条件测试:(与(-a)&&、或(-o)||、非(-not)!)
bash编程函数:函数名出现的地方,会被自动替换为函数体,函数可自定义返回值,还可以接受位置参数。
bash数组:bash中只支持一维数组并且支持稀疏格式,在引用是必须使用${}查看相关值。
选择执行操作
if:格式有三种
1、 if 测试条件;then 2、if 测试条件;then 3、if 测试条件1;then
选择分支 选择分支1 选择分支1
fi else elif 条件2;then
选择分支2 分支2
fi else
分支3
fi
if [ -d /media/sysroot$(dirname $i) ];then [ -f /media/sysroot$i ] || cp $i /media/sysroot$i elif [ ! -d /media/sysroot ];then mkdir -p /media/sysroot$(dirname $i) [ -f /media/sysroot$i ] || cp $i /media/sysroot$i else exit 3 fi
case:格式
case 变量引用 in
PATTERN1)
分支1
;;
PATTERN2)
分支2
;;
*)
分支n
;;
esac
read -p "Please select the compression method(xz | gz | bz2):" Compression etc="etc-`date +%Y-%m-%d-%H-%M-%S`" case $Compression in xz) tar Jcf "$etc.tar.xz" /etc/* if [ ! -d /backups ];then mkdir -p /backups fi mv "$etc.tar.xz" /backups/ ;; gz) tar zcf "$etc.tar.gz" /etc/* if [ ! -d /backups ];then mkdir -p /backups fi mv "$etc.tar.gz" /backups/ ;; bz2) tar jcf "$etc.tar.bz2" /etc/* if [ ! -d /backups ];then mkdir -p /backups fi mv "$etc.tar.bz2" /backups/ ;; *) echo "you inpot error:" exit 5 ;; esac
循环执行操作
for:格式
for VAR_NAME in LIST;do
循环体
done
for ((i=1;i<=9;i++));do for ((z=1;z<=$i;z++));do let tmp="$i*$z" arr[$z]="$i*$z=$tmp" done echo "${arr[@]}" done
while测试条件为真,进入循环,until和while相反,判断为假进入循环
while:格式 until:格式
while 测试条件;do while 测试条件;do
循环体 循环体
done done
数组操作
赋值:
一次对多个元素赋值:例如:array=(red blue yellow green)
按索引进行赋值: 例如:array=([0]=green [3]=red [2]=blue [6]=yellow)
命令替换赋值: 例如:array=($(ls /opt/script/))或array=(/etc/sysconfig/*)
用户输入赋值: 例如:read -a array,赋值后用echo ${array[0]}查看
bash取值:
echo ${#array[2]}。获取这个数组字符的个数
echo ${#array[*]}或echo ${#array[@]}。获取这个数组中变量个数
echo ${array[@]}。取出所有元素
${ARRAY[@]:offset:number}。例如:echo ${array[@]:1:1}
offset: 偏移的元素个数
number: 取出的元素的个数
字符串操作
字符串操作
字符串切片:${string:offset:length}。例如:${array[1]:0:5}可以对该数组内1的变量截取0-5个字符串。
取尾部指定个数的字符:${string: -length},中间需要有个空格,从右向左取多少个字符。例如echo ${string: -3}
取子串:
基于非贪婪模式:${string#*word}:从左向右截取第一次出现该字符串后的值例如:echo ${string#*a}
基于贪婪模式:${string##*word}:从左向右截取最后一次出现该字符串后的值例如:echo ${string#*a}
${string%word*}:从右向左取第一次出现该字符串后的值。例如:echo ${string%a*}
${string%word*}:从右向左取最后一次出现该字符串后的值。例如:echo ${string%%a*}
查找替换:
${string/pattern/substi}: 替换第一次出现。例如:echo ${string/d/xxx}
${string//pattern/substi}:替换所有的出现。例如:echo ${string//d/xxx}
${string/#pattern/substi}:只替换行首echo ${string/#d/xxx}
${string/%pattern/substi}:只替换行尾echo ${string/%d/xxx}
查找删除:
${string/pattern}删除第一次出现的字符
${string//pattern}删除所有出现的字符
${string/#pattern}删除行首出现的字符
${string/%pattern}删除行尾出现的字符
大小写转换:
echo ${string^^}小-->大
echo ${string,,}大-->小
变量赋值:${parameter:-word}:如果变量值为空将显示指定字符串,不空显示自身已有值,例如:${string:-test}
${parameter:=word}:如果变量值为空将显示指定字符串,变量将被赋值。例如:${string:=test}
${parameter:?word}:如果变量为空将把指定字符串作为错误信息显示。${string:?error}
${parameter:+word}:如果变量有值将显示指定字符串,为空将显示空。例如:${string:+xxxx}
标签:bash编程语言
原文地址:http://5990383.blog.51cto.com/5980383/1638805