bash语言基础

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42948022/article/details/102569635

内建变量与特殊符号

$0,$1/$2..$0
	指当前执行的脚本名称,$1$2...指第N个脚本参数
$#
	命令行或者是位置参数的个数
"$*"
	把命令行的所有参数用一个字符串表示("$1$2…")
"$@"
	命令行的所有参数都是独立表示("$1""$2")
$-
	显示shell使用的当前选项,与set命令功能相同
$?
	上一条命令执行后的回传值,如果执行成功,回传值为0
$$
	当前执行进程的ID
$!
	最后执行的后台命令的进程ID

1、注释符#
	除了#!/bin/bash里的#特殊
2、美元符$ 变量符。
	与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。
	变量字符长度超过1个时,用{}括起来
3、单引号
	被引起的字符全部做普通字符,即全部原样
	在单引号括起来的字符串中,反斜线也成为普通字符,而失去转义字符功能。
	echo ‘my $SHELL’
4、双引号
	引号内的内容,除$ 转义符\ 倒引号`        //`
	这三个保留特殊功能,其他字符均做普通字符。
5、倒引号(数字1键旁边的那个键)
	引号内的字符串当做shell命令行解释执行,
	得到的结果取代整个倒引号括起来的部分。
6. 反斜线 转义字符
	把特殊字符变成普通字符。
	在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。

..		上一层目录,与cd命令配合用得比较多
.		目前工作的目录
*		任意长度的字符
?		长度为一个的任意字符
[..]	括号内的一个字符
\m     等于某个通配符,如*、?等
[a-z]  	*小写字母开头的所有字符串
\		转义符号,用以解除特殊字符的特殊意义
~		用户目录
;		分隔符,当命令行有多个命令时,做分隔用
$		BourneShell的提示符,同时也作为shell语言的位置变量参数
#		做注释用
|		建立一个管道,使一命令的输出作为另一个命令的输入
&		将命令以后台方式执行
>       将命令的输出重导入文件中
<       将命令的输入流指定为由文件中加载,和>相反
>>     	将命令的输出加在一个已经存在的文件后面
{..}    括号内的一个字符串

数值处理

num1 –eq num2 如果num1等于num2,测试结果为真
num1 –gt num2 如果num1大于num2,测试结果为真
num1 –lt  num2 如果num1小于num2,测试结果为真
num1 –ge num2 如果num1大于或等于num2,测试结果为真
num1 –le num2 如果num1小于或等于num2,测试结果为真
num1 –ne num2 如果num1不等于num2,测试结果为真

expr命令
r=`expr 4 + 5`
r=`expr 40 -5` 
r=`expr 4 \* 5` 	//  \*  才表示*
r=`expr 40 / 5` 
r=`expr 100 % 43`
注:expr不支持乘幂

$(())命令
r=$(( 4 + 5 ))
r=$(( 40 -5 ))
r=$(( 4 * 5 ))
r=$(( 40 / 5 ))
r=$((100 % 43))
r=$(( 2 ** 3 ))

$[]命令
r=$[ 4 + 5 ]
r=$[ 40 -5 ]
r=$[ 4 * 5 ]
r=$[ 40 / 5 ]
r=$[100 % 43]
r=$[ 2 ** 3 ]

let命令
let "r = 4+5" 
let "r = 40 -5"
let "r = 4 * 5"
let "r = 40 / 5"
let "r = 100 % 43"
let "r = 2**3"
注:不带引号时,=两边不能有空格

字符串----简单正则

字符串常量

[:alpha:]
	匹配当前归类中的大写和小写字母字符
	'[0-9]{3}[[:alpha:]]{2}'匹配三个数字,后跟两个字母
[:alnum:]
	匹配当前归类中的数字、大写和小写字母符
	'[[:alnum:]]+'匹配含有一个或多个字母和数字的字符串
[:digit:]
	匹配当前归类中的数字
	'[[:digit:]-]+'匹配含有一个或多个数字或横线的字符串
[:lower:]
	匹配当前归类中的数字匹配当前归类中的小写字母字符。
	'[[:lower:]]'不匹配A,因为A 为大写
[:space:]
	匹配单个空格(' ')
	[[:space:]]空白字符
[:upper:]
	匹配当前归类中的大写字母字符
	'[[:upper:]ab]'与以下其中一项匹配:任何大写字母、a 或b。
[:whitespace:]
	匹配一个空白字符空格、制表符、换页符和回车符
[:ascii:]
	匹配任何七位的ASCII 字符控制字符包括换行符、换页符、退格符
[:blank:]
	匹配一个空白区或水平制表符
	[[:blank:]]等效于[ \t]

字符串匹配(定位,判断,替换)

\b匹配一个单词边界,是指单词和空格间的位置。
	例:“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
	echo "never verb" |xargs -n1 |grep "er\b"
^ 匹配字符串开头
	例:匹配以abc开头的行:
	echo –e “abc\nxyz”|grep –E ^abc
$ 匹配字符串结尾
	例:匹配以xyz结尾的行
	echo –e “abc\nxyz”|grep –E xyz$

*    0到无数次
+   1到无数次
? 0或者1 次
{n}  重复N次
{n,} 重复至少N次
{n,m}   n到m次
[]  字符组,字符范围
()  捕获组(子表达式)
*?  重复任意次,但尽可能少重复
+?  重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复

email地址的正则表达式可以写成
^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$
分析:
	^[a-zA-Z0-9_]+
	@
	[a-zA-Z0-9_]+
	\.
	[a-zA-Z0-9_]+$
	
匹配腾讯QQ号:[1-9][0-9]{4,}

.  除换行以外的其他任意字符
\s  空白字符——[ \f\n\r\t\v]
\S   除空白字符以外的任意字符——[^ \f\n\r\t\v]
\w  字母、数字、下划线——[A-Za-z0-9_]
\W  除了字母、数字、下划线以外的任意字符——[^A-Za-z0-9_]
\d   数字0-9——[0-9]
\D  除了数字之外的任意字符——[^0-9]

-n string 测试字符串string是否不为空
-z string 测试字符串string是否为空
String1=string2 测试字符串string1是否与字符串string2
相同
String1!=string2   测试字符串string1是否与字符串string2
不相同
注意:字符串比较时建议字符串变量要使用双引号,即使变量为空,也要使用双引号;

${#string}
	$string的长度
${string:position}$string中,从位置$position开始提取子串
${string:position:length}$string中,从位置$position开始提取长度为$length的子串
${string#substring}
	从变量$string的开头,删除最短匹配$substring的子串
${string##substring}
	从变量$string的开头,删除最长匹配$substring的子串
${string%substring}
	从变量$string的结尾,删除最短匹配$substring的子串
${string%%substring}
	从变量$string的结尾,删除最长匹配$substring的子串
${string/old/new}
	使用$new,来代替第一个匹配的$old
${string//old/new}
	使用$new,代替所有匹配的$old
${string/#old/new}
	替换开头.如果$string$old开头,那么就用$new替换
${string/%old/new}
	替换结尾.如果$string$old结尾,那么就用$new替换

复合条件

! expression 
	如果expression为假,则测试结果为真。!与表达式之间要有空格
expression1 –a expression2   
	如果expression1和expression2同时为真,则测试结果为真
expression1 –o expression2   
	如果expression1和expression2有一个为真,则测试结果为真

结构化控制:

分支结构:
	if语句: if then else提供条件测试
	Case语句:允许匹配模式、单词或值
循环结构:
	for:每次依次处理列表内的信息,直至循环耗尽。
	until:条件在循环末尾,至少执行一次。
	while:条件在循环头部。
	continue:继续执行下一次循环。
	break:结束循环,继续执行循环后面的命令。
格式1:
if[ 条件 ]
then
	命令
fi

格式2:
if[ 条件] ; then 命令
fi

格式3:
if  [ 条件]
then
	命令1
else
	命令2
fi

格式4:
if [ 条件1 ]
then
	命令1
elif[ 条件2 ]
then  
	命令2
else 
	命令3
fi

case格式:
casein
	模式1)
		命令1
		;;
	模式2)
	…
	*)
	命令n
	;;
esac
//取值后面必须为单词in,每一个模式必须以右括号结束。取值可以为变量或常数。
//取值检测匹配的每一个模式,一旦模式匹配,其间所有命令开始执行直至;;
//*****执行完匹配模式相应命令后不再继续其他模式。
//如果无一匹配模式,使用*号捕获该值。

for格式1
for 变量名 in 列表
do
	命令
done

for格式2:
for ((变量=初始值;条件判断;变量变化))
do
	命令
done

例子:
s=0
for ((i=1;i<=100;i++))
do
	s=$((s+i))
done
echo $s

while格式:
while 条件
do
	命令
done
//while循环用于不断执行一系列命令,也用于从输入文件中读取数据。
//虽然通常只有一个命令,但在while和do之间可以放几个命令。
//命令通常用作测试条件,
//只有当命令的退出状态为0时,do和done之间命令才被执行,
//如果退出状态不是0,则循环终止。

until格式
until 条件
do
	命令
done
until 执行一系列命令,直至条件为真时停止。

break和continue可以在for、while、until循环中产生中断
break把控制权转交给done之后的语句,从而跳出循环。
continue命令把控制权交给done语句,继续执行写一次循环。

输入输出

Linux启动后,会默认打开3个文件描述符,分别是:
标准输入:standard input 0。
	从键盘输入数据,即从键盘读入数据。
正确输出:standard output 1。
	把数据输出到终端上。
错误输出:error output 2。
	标准错误输出到终端上。
	
重定向分为输入重定向与输出重定向。
输入重定向:输入不从键盘读入,而是从文件输入或其它。
输出重定向:不输出到终端上,而是输出到文件中去或其它。

键盘	/dev/stdin0		标准输入
显示器	/dev/stdout1	标准输出
显示器	/dev/stderr2	标准错误输出

“<”:输入重定向运算符,如果文件不存在会自动建立一个文件,如果第二次输入时,会覆盖前一次的输入内容。
“>>”:表示把第二次的输出内容追加到文件中去,而不是覆盖。
“>”:输出重定向运算符。

用文件的内容为变量赋值
read a < 1.txt
echo $a

标准输出重定向	命令>文件	覆盖方式
				命令>>文件	追加方式
标准错误输出重定向
	错误命令2>文件	覆盖方式
	错误命令2>>文件	追加方式

正确输出和错误输出保存到同一个文件
命令>文件 2>&1	覆盖方式
命令>>文件 2>&1	追加方式
命令 &>文件		覆盖方式
命令 &>>文件		追加方式
命令>>文件1 2>>文件2

&>/dev/null
//将标准输出和错误输出全部重定向到/dev/null中
//也就是将产生的所有信息丢弃.

cat filename >/dev/null
rm filename1 2>/dev/null
rm filename1 >/dev/null 2>&1
cat /dev/null > filename 
ls –l >/dev/null 2>&1   ===    &>/dev/null

函数

函数由两部分组成:1.函数名; 2.函数体
函数与脚本中的一段代码  的区别:
	执行函数时,它保留当前shell和内存信息。
	如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的shell,因而去除所有原脚本中定义的变量。
	函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。

必须在调用函数地方之前,声明函数,shell脚本是逐行运行。
调用函数仅使用其函数名即可,要传给函数的变量跟在函数后面。
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。

函数名()
{
. . .
}

function 函数名()
{}

猜你喜欢

转载自blog.csdn.net/qq_42948022/article/details/102569635