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
目的 | 操作 |
---|---|
使用变量 | $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 condition
do
command
done
ture和false可表真假,while true即为无限循环,可用break,continue跳出
for语句
# 将value依次赋予key
for 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
;;
...
esac
done
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
,$*
等