Shell脚本傻瓜学习笔记

Shell是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁

Shell既是一种命令语言,又是一种程序设计语言

作为命令语言,它交互式解释、执行用户输入的命令

作为程序设计语言,它定义了各种变量、参数,并提供许多在高级语言中才有的控制结构,包括循环、分支

Shell执行命令方式

交互式

解释、执行用户的命令,用户输入一条命令,Shell解释、执行一条

批处理

用户事先写一个Shell脚本,Shell一次性执行完多条命令,不必逐条敲命令

Shell脚本解释器

常见的有:bash、sh、ash、csh、ksh

sh是Bourne Shell的缩写,是Unix默认标准的shell

bash是Bourne Again Shell的缩写,是linux默认标准的shell;本文就是基于bash

Shell脚本语言与编译型语言差异

脚本编程语言好处是它们多半运行在比编译型语言还高的层级,能轻易处理文件与目录之类的对象

编译型语言

这类语言需预先将编写好的源代码转换成目标代码,这个过程被称为编译

如C、C++、Java

解释型语言

解释型语言也称为脚本语言;执行这类程序时,解释器需读取编写好的源代码,并将其转换成目标代码,再由计算机运行

因执行程序时多了编译过程,因此效率有所下降,通常不如编译型语言

如Perl、Python、Ruby与Shell

Hello, World

#!/bin/bash
echo "Hello, World"

保存文件为hello.sh,保存格式为.sh

作为可执行程序

chmod +x ./hello.sh #更改文件权限为可执行程序
./hello.sh #执行程序

作为解释器参数

hello.sh

Shell变量

变量声明调用

#!/bin/bash
lang="Hello, World"
echo $lang #简便
echo ${lang} #更标准

只读变量

#!/bin/bash
lang="Hello, World"
readonly lang #只读
lang="Bye" #报错

删除变量

#!/bin/bash
lang="Hello, World"
unset lang #删除
echo lang #空

交互式变量

#!/bin/bash
echo "What is your name"
read name #用户敲击输入自己的姓名
echo "Hello, $name" #输入的姓名(注:必须为双引号)

特殊变量

$0	#当前脚本文件名
$n	#传递给脚本或函数的参数
$#	#传递给脚本或函数的参数个数
$*	#传递给脚本或函数的所有参数
$@	#传递给脚本或函数的所有参数
$?	#上个命令的退出状态或函数的返回值
$$	#当前Shell脚本进程ID

替换变量

${var}			#原值
${var:-word}	#原值为空或已删除,返回word,但不改变原值
${var:=word}	#原值为空或已删除,返回word,更改原值为word
${var:?message}	#原值为空或已删除,将消息message传送至标准错误输出
${var:+word}	#原值被定义,返回word,但不改变原值

转义字符

\	#反斜杠
a	#警告
	#退格
f	#换页

	#换行

	#回车
		#水平制表符
v	#垂直制表符

Shell运算符

算术运算符

+	#加法
-	#减法
*	#乘法
/	#除法
%	#取余
=	#赋值
==	#相等
!=	#不相等

算数运算符用法示例

#!/bin/bash
number=`expr 5 + 5` #加法
echo $number

关系运算符

-eq	#是否相等
-ne	#是否不相等
-gt	#是否大于
-lt	#是否小于
-ge	#是否大于等于
-le	#是否小于等于

关系运算符用法示例

#!/bin/bash
if [ 5 -eq 5 ] #是否相等(注:必须空格分开)
then
	expression
fi

字符串运算符

=	#字符串是否相等
!=	#字符串是否不相等
-z	#字符串长度是否等于0
-n	#字符串长度是否大于0
str	#字符串是否为空

布尔运算符

!	#非
-o	#或
-a	#且

文件运算符

-b file	#文件是否是块设备文件
-c file	#文件是否是字符设备文件
-d file	#文件是否是目录
-f file	#文件是否是普通文件
-g file	#文件是否设置SGID位
-k file	#文件是否设置粘着位
-p file	#文件是否是具名管道
-u file	#文件是否设置SUID位
-r file	#文件是否可读
-w file	#文件是否可写
-x file	#文件是否可执行
-s file	#文件是否为空
-e file	#文件是否存在

Shell字符串

拼接字符串

#!/bin/bash
lang="World"
echo "Hello, "$lang
echo "Hello, $lang"

获取字符串长度

#!/bin/bash
lang="Hello, World"
echo ${#lang}

提取字符串

#!/bin/bash
lang="Hello, World"
echo ${lang:1:4}

查找子字符串

#!/bin/bash
lang="Hello, World"
echo `expr index "$lang" llo`

Shell数组

数组声明

#!/bin/bash
array=(value value)

#!/bin/bash
array=(
	value
	value
)

#!/bin/bash
array[0]=value
array[1]=value

数组调用

#!/bin/bash
array=(value value)
echo ${array[index]} #输出元素
echo ${array[*]} #输出所有元素

获取数组长度

#!/bin/bash
array=(value value)
echo ${#array[*]}

获取数组元素长度

#!/bin/bash
array=(value value)
echo ${#array[index]}

Shell if else语句

if ... fi

#!/bin/bash
if [ condition ]
then
	expression
fi

if ... else ... fi

#!/bin/bash
if [ condition ]
then
	expression
else
	expression
fi

if ... elif ... fi

#!/bin/bash
if [ condition ]
then
	expression
elif [ condition ]
then
	expression
else
	expression
fi

Shell case语句

#!/bin/bash
case value in
	model)
		expression
	;;
	model)
		expression
	;;
	*)
		expression
	;;
esac

Shell for循环

#!/bin/bash
for v in value
do
	echo $v
done

Shell while循环

#!/bin/bash
while [ condition ]
do
	expression
done

Shell until循环

#!/bin/bash
until [ condition ]
do
	expression
done

Shell函数

函数声明调用

#!/bin/bash
function ()
{
	expression
}
function

函数传参

#!/bin/bash
function value value

参数调用

$n	#传递给函数的参数
$#	#传递给函数的参数个数
$*	#传递给函数的所有参数
$@	#传递给函数的所有参数
$?	#函数返回值

Shell文件包含

#!/bin/bash
. file
source file
最近研究Linux服务器的时候,抽空学习了Shell脚本语言,写个简约语法笔记以便随时翻阅
原文地址:https://www.cnblogs.com/johnl/p/5244829.html