bash脚本

来源:互联网 发布:c qt 编程视频教程 编辑:程序博客网 时间:2024/06/10 07:36

bash对空格的有无敏感,但对其数量不敏感。该有空格的地方一定要有,但是无所谓有几个

  • 脚本参数:$0 脚本名,$1 第一个参数,$* 所有参数,$# 参数数量
  • 上一个命令的退出状态:$?,0表示上一个命令无错误,1表示有错误
  • 子命令:$(command)
  • #开头的是注释,bash没有多行注释,只能疯狂打#
  • '\n' 虽然在正则表达式中被解释为换行,但是在bash的其他命令中都被解释为普通字符,"\n"也是一样,但是\n(不加引号)则会被解释为n,因为反斜杠表转义,而 n 不像引号之类的字符,它没有特殊意义,转义之后还是 n,所以 echo \n的输出为 n。希望\n表示未换行可以使用 $'\n'
  • bash 的分隔符是空白符(包括空格、制表、换行等),不希望在一些命令中,一行字符串被空格分隔,可以把分隔符改成换行。执行命令前 oldIFS=$IFSIFS=$'\n',执行命令后 IFS=$oldIFS

bash调试

set -e:当前命令执行错误立即停止该脚本
如果是用./形式执行脚本的,那会跳出子shell
如果是用source执行脚本的,那直接跳出父shell
条件判断中,语句的执行正确与否是以整条语句为判断的;如果是由几个连接起来的,那只要由一个子语句正确,set -e同样判断该语句正确

set -x:打印出当前正在执行的语句

输入输出重定向

重定向的文件名如果用变量表示,比如$name,请务必加上双引号,"$name"

变量

bash 所有变量全是字符串

key=value
- 变量名的首个字符必须是字母
- 变量名中不能出现空格,如果需要,可以使用_代替
- 等号左右不能有空格
- 更精准地使用变量,可以用${key}代替$key

目的 操作 使用变量 $key 重定义变量 为变量重新赋值即可 设置只读变量 readonly key
或者 readonly key=value 删除变量 unset key 设置局部变量 local key
或者local key=value 设置环境变量 export key
export key=value

变量类型

  • 本地变量:key=value,当前shell有效
  • 环境变量:export key=value,当前shell及其子shell有效
  • 局部变量:local key=value,当前代码块有效,只能用在函数里

变量设定

变量设定方式 说明 ${变量#关键词} 把变量在头部的符合关键词的最短数据删除 ${变量##关键词} 把变量在头部的符合关键词的最长数据删除 ${变量%关键词} 把变量在尾部的符合关键词的最短数据删除 ${变量%%关键词} 把变量在尾部的符合关键词的最长数据删除 ${变量/旧字符串/新字符串} 替换第一个字符串 ${变量//旧字符串/新字符串} 替换所有字符串

接受用户输入

read命令用法举例
- read key:读入一行内容(不包括换行符)到key
- read key1 key2:把用户输入一行内容中的第一个空白符前面的数据赋值给key1,后面的全部赋值给key2。当然,在使用的时候可以增加key的数量
- read -p “input” key:给用户提示
- read -t n key:n秒内不输入,这条语句就过了,key不会被赋值

输出

printf “%s %s” string string
前面的是输出样式,输出的是一个字符串空一格再一个字符串,后面的两个字符串回替换掉前面的%s
直接支持颜色字

echo 要输出有颜色的字必须使用 -e 参数

颜色字

echo -e "\033[30m 黑色字 \033[0m"echo -e "\033[31m 红色字 \033[0m"echo -e "\033[32m 绿色字 \033[0m"echo -e "\033[33m 黄色字 \033[0m"echo -e "\033[34m 蓝色字 \033[0m"echo -e "\033[35m 紫色字 \033[0m"echo -e "\033[36m 天蓝字 \033[0m"echo -e "\033[37m 白色字 \033[0m"echo -e "\033[40;37m 黑底白字 \033[0m"echo -e "\033[41;37m 红底白字 \033[0m"echo -e "\033[42;37m 绿底白字 \033[0m"echo -e "\033[43;37m 黄底白字 \033[0m"echo -e "\033[44;37m 蓝底白字 \033[0m"echo -e "\033[45;37m 紫底白字 \033[0m"echo -e "\033[46;37m 天蓝底白字 \033[0m"echo -e "\033[47;30m 白底黑字 \033[0m"

数组

只要在变量赋值时加上[]就表明该变量是一个数组,比如array[0]=aaa定义数组array,其第一个数据为aaa,此时它的数组长度为1。如果需要增加数组长度,可以继续定义arrat[1]=bbb。当然也可以一次定义多个数据array=(aaa bbb ccc)注意这里多个数据的分隔是空白符,不是C语言的分号

如果数组长度仅为3,但是执行这行代码array[100]=ssss,那数组长度是4,其中下标为0、1、2、100的元素有数据的,其他没有。

目的 操作 获取数组元素 ${array[0]} 获取某个元素长度 ${#array[0]} 获取所有元素 ${array[*]} 获取元素数量 ${#array[*]}

判断

test命令等同于[],[]要注意空格,其写法为[ $key == "value" ]

数值判断

参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le 小于等于则为真

字符串判断

参数 说明 == 等于则为真 != 不相等则为真 -z 字符串 字符串的长度为零则为真 -n 字符串 字符串的长度不为零则为真

文件判断

参数 说明 -e 文件名 如果文件存在则为真 -r 文件名 如果文件存在且可读则为真 -w 文件名 如果文件存在且可写则为真 -x 文件名 如果文件存在且可执行则为真 -s 文件名 如果文件存在且至少有一个字符则为真 -d 文件名 如果文件存在且为目录则为真 -f 文件名 如果文件存在且为普通文件则为真 -c 文件名 如果文件存在且为字符型特殊文件则为真 -b 文件名 如果文件存在且为块特殊文件则为真

-a,-o,!表示与或非
! 的用法是 [ ! -e file ]

与 [ … ] 不同,[[ … ]] 可以用 =~ 来匹配正则表达式,前者不能匹配正则表达式,也不能匹配 bash 通配符;可以用 <,>,==,!=,来判断数值,在空号内使用 && 与 || (单中括号的逻辑只能是[ .. -a .. ] 或者 [ .. ] && [ .. ],而不能是 [ .. && .. ])

流程控制

需要使用判断的话,要用双引号,比如:”$key”

判断

关于【;】【&&】【||】,不建议大量使用,最好只在两条命令之间使用一个这种符号,比较复杂的判断请用 if

if语句

if 命令   #命令结果真则执行if语句,这里的命令不一定是判断语句then    ...elif 命令    ...else    ...fi# 写成一句if [ 3 > 2 ];then echo "OK"; fi

case语句

case $gender in      男 | M)  # 【|】表示【或者】        echo "是位小少爷"          ;;      女 | F)          echo "是位小千金"          ;;      *)          echo "有没有搞错"          ;;  esac  

循环

while语句

while conditiondo    commanddone

ture和false可表真假,while true即为无限循环,可用break,continue跳出

for语句

# 将value依次赋予keyfor key in value1 value2 ...do    ...done# 写成一句for key in "hello" "world"; do echo $key; done

在value使用通配符可以让for读取文件名,比如
- for key in *:把当前目录下所有文件及文件夹的名字依次赋值给key
- for key in /r??t:把根目录下所有名字以【r】开头,以【t】结尾,中间有两个字符的文件及文件夹的名字依次赋值给key

for ((;;)) # 仅仅是这样子的话就是无限循环了do    ...done# 写成一句for ((i=0;i<100;i++));do printf "穷"; done

C语言风格的for循环,(())里面的代码遵循C语言风格,也就是说在这里面使用外部定义的变量可以不加$,同时代码中的空格也可以随便加

选择

select key in value1 value2 ...do    case $key in        value1)            ...            break            ;;        value2)            ...            break            ;;        ...    esacdone

select语句的效果是使用菜单让用户选择,并把用户选择的value赋值给key
select语句常与case语句连用
select语句中的key不加$,是因为它是把value赋值给key;而case语句是把key与value比较
这里的break不是为了跳出case(bash中的case与C语言中的switch不同,它不用跳出),而是跳出select。因为select是一个无限循环。之所以做成无限循环是因为用户很可能输入非法的字符

函数

定义

# function关键字可省略# ()仅仅表示这是一个函数,而不是用它来传递参数function func(){    # return语句可省略,如果省略,该函数将返回最后一条命令的执行结果,$?    return n}

bash脚本是从上往下执行的,所以函数的定义一定要放在执行的前面
函数的使用和脚本相同,即func arg1 arg2来执行函数并传参,函数内部用$1$2来接收参数。当然还可以用$0$*

原创粉丝点击