shell

菜鸟教程shell总结:http://www.runoob.com/linux/linux-shell-process-control.html

变量

	变量名和等号之间不能有空格
	命名只能使用英文字母,数字和下划线,首字符不以数字开头
	中间不能有空格,可使用_
	不能使用标点符号
	不含bash关键字(可用help命令查看保留关键字)
	除了显式地直接赋值,还可以用语句给变量赋值
		for file in `ls /etc`
		或
		for file in $(ls /etc)
		以上语句将 /etc 下目录的文件名循环出来

使用变量

	定义过的变量,只要在变量名前面加美元符号
	如:
		$name
		${name}		//标准写法、建议
		
只读变量
	使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
	myUrl="http://www.google.com"
	readonly myUrl
	
	
删除变量
	使用 unset 命令可以删除变量
	unset variable_name
	变量被删除后不能再次使用。unset 命令不能删除只读变量。
	
	
变量类型
	1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
	2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
	3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

字符串

单引号
	单引号里的任何字符都会原样输出,单引号字符串中的变量无效;
	其中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
	双引号里可以有变量
	双引号里可以出现转义字符
拼接字符串
	your_name="runoob"
	# 使用双引号拼接
	greeting="hello, "$your_name" !"
获取字符串长度
	string="abcd"
	echo ${#string} #输出 4
提取子字符串
	以下实例从字符串第 2 个字符开始截取 4 个字符
	string="runoob is a great site"
	echo ${string:1:4} # 输出 unoo

数组(Bash Shell 只支持一维数组)

括号来表示数组 空格分割
一般定义形式:
	数组名=(值1 值2 ... 值n)
	或者
	array_name=(
	value0
	value1
	value2
	value3
	)
单独定义数组的各个分量:
	array_name[0]=value0
	array_name[1]=value1
	array_name[n]=valuen
	可以不使用连续的下标,而且下标的范围没有限制。
读取数组
	一般格式:
		${数组名[下标]}
	使用 @ 符号可以获取数组中的所有元素:
		echo ${array_name[@]}
获取数组的长度
	与获取字符串长度的方法相同,例如:
		# 取得数组元素的个数
		length=${#array_name[@]}
		# 或者
		length=${#array_name[*]}
		# 取得数组单个元素的长度
		lengthn=${#array_name[n]}

注释

以"#"开头的行就是注释,会被解释器忽略。
无多行注释
	开发中需要,可把一段要注释的代码用一对花括号括起来,定义成一个函数,
	没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

	还可以如下:
		:<<EOF
		注释内容...
		注释内容...
		注释内容...
		EOF
	或者:
		:<<'
		注释内容...
		注释内容...
		注释内容...
		'
		
		:<<!
		注释内容...
		注释内容...
		注释内容...
		!

传参

执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
实例:
	#!/bin/bash
	# author:菜鸟教程
	# url:www.runoob.com

	echo "Shell 传递参数实例!";
	echo "执行的文件名:$0";
	echo "第一个参数为:$1";
	echo "第二个参数为:$2";
	echo "第三个参数为:$3";

特殊字符处理参数
	参数处理	说明
	$#			传递到脚本的参数个数
	$*			以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
	$$			脚本运行的当前进程ID号
	$!			后台运行的最后一个进程的ID号
	$@			与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
	$-			显示Shell使用的当前选项,与set命令功能相同。
	$?			显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

基本运算符

算数运算符
	原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
	expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
	例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
	#!/bin/bash

	val=`expr 2 + 2`
	echo "两数之和为 : $val"
	
	常用的算术运算符如下,假定变量 a=10,变量 b=20:
	运算符	说明										举例
	+		加法										`expr $a + $b` 结果为 30。
	-		减法										`expr $a - $b` 结果为 -10。
	*		乘法										`expr $a \* $b` 结果为  200。
	/		除法										`expr $b / $a` 结果为 2。
	%		取余										`expr $b % $a` 结果为 0。
	=		赋值										a=$b 将把变量 b 的值赋给 a。
	==		相等。用于比较两个数字,相同则返回 true。	[ $a == $b ] 返回 false。
	!=	不相等。用于比较两个数字,不相同则返回 true。	[ $a != $b ] 返回 true。
	
	注:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
关系运算符
	关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
	下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
	运算符	说明													举例
	-eq		检测两个数是否相等,相等返回 true。						[ $a -eq $b ] 返回 false。
	-ne		检测两个数是否不相等,不相等返回 true。					[ $a -ne $b ] 返回 true。
	-gt		检测左边的数是否大于右边的,如果是,则返回 true。		[ $a -gt $b ] 返回 false。
	-lt		检测左边的数是否小于右边的,如果是,则返回 true。		[ $a -lt $b ] 返回 true。
	-ge		检测左边的数是否大于等于右边的,如果是,则返回 true。	[ $a -ge $b ] 返回 false。
	-le		检测左边的数是否小于等于右边的,如果是,则返回 true。	[ $a -le $b ] 返回 true。
	
	实例:
		if [ $a -ne $b ]
		then
		   echo "$a -ne $b: a 不等于 b"
		else
		   echo "$a -ne $b : a 等于 b"
		fi		
布尔运算符
	下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
	运算符	说明												举例
	!		非运算,表达式为 true 则返回 false,否则返回 true。	[ ! false ] 返回 true。
	-o		或运算,有一个表达式为 true 则返回 true。			[ $a -lt 20 -o $b -gt 100 ] 返回 true。
	-a		与运算,两个表达式都为 true 才返回 true。			[ $a -lt 20 -a $b -gt 100 ] 返回 false。
逻辑运算符
	假定变量 a 为 10,变量 b 为 20:
	运算符	说明			举例
	&&		逻辑的 AND		[[ $a -lt 100 && $b -gt 100 ]] 返回 false
	||		逻辑的 OR		[[ $a -lt 100 || $b -gt 100 ]] 返回 true
字符串运算符
	假定变量 a 为 "abc",变量 b 为 "efg":
	运算符	说明										举例
	=		检测两个字符串是否相等,相等返回 true。		[ $a = $b ] 返回 false。
	!=		检测两个字符串是否相等,不相等返回 true。	[ $a != $b ] 返回 true。
	-z		检测字符串长度是否为0,为0返回 true。		[ -z $a ] 返回 false。
	-n		检测字符串长度是否为0,不为0返回 true。		[ -n "$a" ] 返回 true。
	str		检测字符串是否为空,不为空返回 true。		[ $a ] 返回 true。
文件测试运算符
	用于检测 Unix 文件的各种属性
	属性检测描述如下:
	操作符	说明	举例
	-b file	检测文件是否是块设备文件,如果是,则返回 true。	[ -b $file ] 返回 false。
	-c file	检测文件是否是字符设备文件,如果是,则返回 true。	[ -c $file ] 返回 false。
	-d file	检测文件是否是目录,如果是,则返回 true。	[ -d $file ] 返回 false。
	-f file	检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。	[ -f $file ] 返回 true。
	-g file	检测文件是否设置了 SGID 位,如果是,则返回 true。	[ -g $file ] 返回 false。
	-k file	检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。	[ -k $file ] 返回 false。
	-p file	检测文件是否是有名管道,如果是,则返回 true。	[ -p $file ] 返回 false。
	-u file	检测文件是否设置了 SUID 位,如果是,则返回 true。	[ -u $file ] 返回 false。
	-r file	检测文件是否可读,如果是,则返回 true。	[ -r $file ] 返回 true。
	-w file	检测文件是否可写,如果是,则返回 true。	[ -w $file ] 返回 true。
	-x file	检测文件是否可执行,如果是,则返回 true。	[ -x $file ] 返回 true。
	-s file	检测文件是否为空(文件大小是否大于0),不为空返回 true。	[ -s $file ] 返回 true。
	-e file	检测文件(包括目录)是否存在,如果是,则返回 true。	[ -e $file ] 返回 true。

echo命令(用于字符串输出)

显示普通字符串
	echo "It is a test"
	这里的双引号完全可以省略,以下命令与上面实例效果一致:
	echo It is a test
显示转义字符
	echo "\"It is a test\""
	或
	echo \"It is a test\"
显示变量
	read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
	#!/bin/sh
	read name 
	echo "$name It is a test"
	以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:
	[root@www ~]# sh test.sh
	OK                     #标准输入
	OK It is a test        #输出
显示换行
	# echo "OK! \n" # -e 开启转义
	echo "OK! \n"
	echo "It it a test"
显示不换行
	#!/bin/sh
	echo -e "OK! \c" # -e 开启转义 \c 不换行
	echo "It is a test"
显示结果定向至文件
	echo "It is a test" > myfile
原样输出字符串,不进行转义或取变量(用单引号)
	echo '$name\"'
显示命令执行结果
	echo `date`
	注意: 这里使用的是反引号 `, 而不是单引号 '。
	结果将显示当前日期
	Thu Jul 24 10:08:46 CST 2014

printf命令

简介
	printf 命令模仿 C 程序库(library)里的 printf() 程序。
	printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
	printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf 命令的语法:
	printf  format-string  [arguments...]
	参数说明:
	format-string: 为格式控制字符串
	arguments: 为参数列表。
实例:
	脚本:
		#!/bin/bash
		# author:菜鸟教程
		# url:www.runoob.com
		 
		printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
		printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
		printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
		printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 
	结果:
		姓名     性别   体重kg
		郭靖     男      66.12
		杨过     男      48.65
		郭芙     女      47.99
	解释:
		%s %c %d %f都是格式替代符
		%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
		%-4.2f 指格式化为小数,其中.2指保留2位小数。
其他实例:
	脚本:
		#!/bin/bash

		# format-string为双引号
		printf "%d %s\n" 1 "abc"

		# 单引号与双引号效果一样 
		printf '%d %s\n' 1 "abc" 

		# 没有引号也可以输出
		printf %s abcdef

		# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
		printf %s abc def

		printf "%s\n" abc def

		printf "%s %s %s\n" a b c d e f g h i j

		# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
		printf "%s and %d \n" 
	结果:
		1 abc
		1 abc
		abcdefabcdefabc
		def
		a b c
		d e f
		g h i
		j  
		 and 0
printf的转义序列
	序列	说明
	\a		警告字符,通常为ASCII的BEL字符
	\b		后退
	\c		抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
	\f		换页(formfeed)
	\n		换行
	\r		回车(Carriage return)
	\t		水平制表符
	\v		垂直制表符
	\\		一个字面上的反斜杠字符
	\ddd	表示1到3位数八进制值的字符。仅在格式字符串中有效
	\0ddd	表示1到3位的八进制值字符

test命令(用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试)

数值测试
	表格
		参数	说明
		-eq		等于则为真
		-ne		不等于则为真
		-gt		大于则为真
		-ge		大于等于则为真
		-lt		小于则为真
		-le		小于等于则为真
	实例
		代码:
			num1=100
			num2=100
			if test $[num1] -eq $[num2]
			then
				echo '两个数相等!'
			else
				echo '两个数不相等!'
			fi
		结果:
			两个数相等!
字符串测试
	表格:
		参数		说明
		=			等于则为真
		!=			不相等则为真
		-z 字符串	字符串的长度为零则为真
		-n 字符串	字符串的长度不为零则为真
	实例:
		代码:
			num1="ru1noob"
			num2="runoob"
			if test $num1 = $num2
			then
				echo '两个字符串相等!'
			else
				echo '两个字符串不相等!'
			fi
		结果:
			两个字符串不相等!
文件测试
	表格:
		参数		说明
		-e 文件名	如果文件存在则为真
		-r 文件名	如果文件存在且可读则为真
		-w 文件名	如果文件存在且可写则为真
		-x 文件名	如果文件存在且可执行则为真
		-s 文件名	如果文件存在且至少有一个字符则为真
		-d 文件名	如果文件存在且为目录则为真
		-f 文件名	如果文件存在且为普通文件则为真
		-c 文件名	如果文件存在且为字符型特殊文件则为真
		-b 文件名	如果文件存在且为块特殊文件则为真
	实例:
		代码:
			cd /bin
			if test -e ./bash
			then
				echo '文件已存在!'
			else
				echo '文件不存在!'
			fi
		结果:
			文件已存在!
	另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
	实例:
		代码:
			cd /bin
			if test -e ./notFile -o -e ./bash
			then
				echo '至少有一个文件存在!'
			else
				echo '两个文件都不存在'
			fi
		结果:
			至少有一个文件存在!

流程控制(sh的流程控制不可为空,如果else分支没有语句执行,就不要写这个else)

if 判断
	if语句
		语法格式:
			if condition
			then
				command1 
				command2
				...
				commandN 
			fi
		写成一行(适用于终端命令提示符):
			if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
	if else语句
		语法格式:
			if condition
			then
				command1 
				command2
				...
				commandN
			else
				command
			fi
	if elif else语句
		语法格式:
			if condition1
			then
				command1
			elif condition2 
			then 
				command2
			else
				commandN
			fi
	if else语句经常与test命令结合使用,如下实例:
		代码:
			num1=$[2*3]
			num2=$[1+5]
			if test $[num1] -eq $[num2]
			then
				echo '两个数字相等!'
			else
				echo '两个数字不相等!'
			fi
		结果:
			两个数字相等!
for 循环
	一般格式为:
		for var in item1 item2 ... itemN
		do
			command1
			command2
			...
			commandN
		done
	写成一行:
		for var in item1 item2 ... itemN; do command1; command2… done;
	简介
		当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。
		命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。
		in列表是可选的,如果不用它,for循环使用命令行的位置参数。
	实例-顺序输出当前列表中的数字:
		代码:
			for loop in 1 2 3 4 5
			do
				echo "The value is: $loop"
			done
		结果:
			The value is: 1
			The value is: 2
			The value is: 3
			The value is: 4
			The value is: 5
while 语句
	简介
		用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
	一般格式:
		while condition
		do
			command
		done	
	基本实例:
		代码:
			#!/bin/bash
			int=1
			while(( $int<=5 ))
			do
				echo $int
				let "int++"
			done
		结果:
			1
			2
			3
			4
			5
	实例-while循环可用于读取键盘信息:
		代码:
			echo '按下 <CTRL-D> 退出'
			echo -n '输入你最喜欢的网站名: '
			while read FILM
			do
				echo "是的!$FILM 是一个好网站"
			done
		结果:
			按下 <CTRL-D> 退出
			输入你最喜欢的网站名:菜鸟教程
			是的!菜鸟教程 是一个好网站
无限循环
	无限循环语法格式:
		while :
		do
			command
		done
		或者
		while true
		do
			command
		done
		或者
		for (( ; ; ))
until 循环
	简介:
		until 循环执行一系列命令直至条件为 true 时停止。
		until 循环与 while 循环在处理方式上刚好相反。
		一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用
	语法格式:
		until condition
		do
			command
		done
	实例-使用 until 命令来输出 0 ~ 9 的数字:
		代码:
			#!/bin/bash

			a=0

			until [ ! $a -lt 10 ]
			do
			   echo $a
			   a=`expr $a + 1`
			done
		结果:
			0
			1
			2
			3
			4
			5
			6
			7
			8
			9
case	
	简介:
		Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
	一般格式:		
		case 值 in
		模式1)
			command1
			command2
			...
			commandN
			;;
		模式2)
			command1
			command2
			...
			commandN
			;;
		esac
跳出循环
	break跳出所有循环
		代码:
			#!/bin/bash
			while :
			do
				echo -n "输入 1 到 5 之间的数字:"
				read aNum
				case $aNum in
					1|2|3|4|5) echo "你输入的数字为 $aNum!"
					;;
					*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
						break
					;;
				esac
			done
		结果:
			输入 1 到 5 之间的数字:3
			你输入的数字为 3!
			输入 1 到 5 之间的数字:7
			你输入的数字不是 1 到 5 之间的! 游戏结束		
	continue跳出当前循环
		代码:
			#!/bin/bash
			while :
			do
				echo -n "输入 1 到 5 之间的数字: "
				read aNum
				case $aNum in
					1|2|3|4|5) echo "你输入的数字为 $aNum!"
					;;
					*) echo "你输入的数字不是 1 到 5 之间的!"
						continue
						echo "游戏结束"
					;;
				esac
			done
esac
	case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。		

Shell 函数

定义格式:
	[ function ] funname [()]

	{

		action;

		[return int;]

	}
说明:
	1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
	2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
实例-带有return语句的函数:
	代码:
		#!/bin/bash
		# author:菜鸟教程
		# url:www.runoob.com

		funWithReturn(){
			echo "这个函数会对输入的两个数字进行相加运算..."
			echo "输入第一个数字: "
			read aNum
			echo "输入第二个数字: "
			read anotherNum
			echo "两个数字分别为 $aNum 和 $anotherNum !"
			return $(($aNum+$anotherNum))
		}
		funWithReturn
		echo "输入的两个数字之和为 $? !"
	结果:
		这个函数会对输入的两个数字进行相加运算...
		输入第一个数字: 
		1
		输入第二个数字: 
		2
		两个数字分别为 1 和 2 !
		输入的两个数字之和为 3 !
说明:
	在Shell中,调用函数时可以向其传递参数。
	在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
	$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
几个特殊字符用来处理参数:
	参数处理	说明
	$#			传递到脚本的参数个数
	$*			以一个单字符串显示所有向脚本传递的参数
	$$			脚本运行的当前进程ID号
	$!			后台运行的最后一个进程的ID号
	$@			与$*相同,但是使用时加引号,并在引号中返回每个参数。
	$-			显示Shell使用的当前选项,与set命令功能相同。
	$?			显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

输入/输出重定向

重定向命令列表如下:
	命令				说明
	command > file		将输出重定向到 file。
	command < file		将输入重定向到 file。
	command >> file		将输出以追加的方式重定向到 file。
	n > file			将文件描述符为 n 的文件重定向到 file。
	n >> file			将文件描述符为 n 的文件以追加的方式重定向到 file。
	n >& m				将输出文件 m 和 n 合并。
	n <& m				将输入文件 m 和 n 合并。
	<< tag				将开始标记 tag 和结束标记 tag 之间的内容作为输入。
	需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
输出重定向
	command1 > file1
输入重定向
	command1 < file1
command1 < infile > outfile		//同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
重定向深入讲解
	一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
		标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
		标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
		标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
	默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
	如果希望 stderr 重定向到 file,可以这样写:
		$ command 2 > file
	如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
		$ command > file 2>&1
		或者
		$ command >> file 2>&1
	如果希望对 stdin 和 stdout 都重定向,可以这样写:
		$ command < file1 >file2

Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序
基本格式:
	command << delimiter
		document
	delimiter
它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
	注意:
		结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
		开始的delimiter前后的空格会被忽略掉。

/dev/null 文件

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃

文件包含

格式:
	. filename   # 注意点号(.)和文件名中间有一空格
	或
	source filename
注:被包含的文件不需要可执行权限。

posted on 2019-05-21 09:37  w00chann  阅读(180)  评论(0)    收藏  举报

导航