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=$IFS
,IFS=$'\n'
,执行命令后IFS=$oldIFS
bash调试
set -e:当前命令执行错误立即停止该脚本
如果是用./
形式执行脚本的,那会跳出子shell
如果是用source
执行脚本的,那直接跳出父shell
条件判断中,语句的执行正确与否是以整条语句为判断的;如果是由几个或连接起来的,那只要由一个子语句正确,set -e
同样判断该语句正确
set -x:打印出当前正在执行的语句
输入输出重定向
重定向的文件名如果用变量表示,比如$name
,请务必加上双引号,"$name"
变量
bash 所有变量全是字符串
key=value
- 变量名的首个字符必须是字母
- 变量名中不能出现空格,如果需要,可以使用_
代替
- 等号左右不能有空格
- 更精准地使用变量,可以用${key}
代替$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的元素有数据的,其他没有。
判断
test命令等同于[],[]要注意空格,其写法为
[ $key == "value" ]
数值判断
字符串判断
文件判断
-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
,$*
等
- bash 脚本
- bash脚本
- bash脚本
- bash脚本
- bash脚本
- bash脚本
- BASH脚本
- bash脚本
- Bash脚本
- Bash Scripts(Bash 脚本)I
- BASH脚本编程
- BASH脚本编程
- 一个bash备份脚本
- bash 脚本学习笔记
- 调试bash脚本
- bash脚本计算除法
- Bash脚本编程基础
- BASH脚本编写教程
- B2C电商网站调用第三方支付平台流程
- 第一章 :Java的诞生与发展历史
- javascript数组的使用总结
- C#调用Oracle的存储过程
- UVa-10152 ShellSort(模拟)
- bash脚本
- solr6.6 配置mysql数据源
- Java入门(4)——常见的String方法
- 线程同步
- Linux find命令
- HDU6149[Valley Numer II]--压位DP
- Oracle创建表空间并授权的步骤
- 日记
- 怎么把自己的代码上传到GitHub上