1.再识变量
静态类型语言:一种编译期间就能确定数据类型的语言
动态类型语言:一种运行期间才去确定数据类型的语言
强类型:一种总是强制类型定义的语言。如果不进行明确的转换,不能把它当成一个字符串
弱类型:一种类型可以被忽略的语言
Linux Shell 是一种动态类型的语言和弱类型。shell 语言中的一切变量都是字符串类型的。
2.用户变量
指的是用户在 shell 编程过程中定义的变量,分为全局变量和局部变量。默认为全局变量,局部变量 需要使用local 限定词。
变量的表示方式 $varname 实际上是常用语法 ${varname} 的简略形式。
为什么会有这2种不同的语法呢?原因如下:
1.如果代码中的位置参数超过9个,当引用第10个的时候,必须要用语法 ${10} 而不是 $10。
2.如果要再用户ID后面放置一个下划线,如 echo $UID_, 则 shell 会试图使用 UID_ 作为变量名。
3.字符串操作符
大括号操作符允许我们使用 shell 字符串操作的更多高级功能,即字符串处理运算符。字符串处理运算符允许你完成如下操作:
1.确保变量存在且有值
2.设置变量的默认值
3.捕获未设置变量而导致的错误
4.删除匹配模式的变量的值部分内容
${varname:-word} : 如果 varname 存在且非null,返回varname的值;否则返回 word。
${varname:=workd} : 如果 varname 存在且非 null,返回varname 的值;否则返回 word,并将变量设置为word。
${varname:?message} : 如果varname 存在且非null,则返回varname的值;否则打印 message,并退出当前脚本。
${varname:+word} : 如果 varname 存在且非 null, 则返回 word;否则返回null
4.命令替换
`command` : 允许你使用命令的标准输出,就像它是一个变量值一样。
5.位置变量
也称为系统变量,位置参数,是shell脚本运行时传递给脚本的参数,同时也表示shell函数内部的函数参数。它们的名字是以数字命名,
超过9,用括号括起来,如 ${10}。
6.启动文件
shell使用一些启动文件来协助创建一个运行环境,其中每个文件都有特殊的用途,对登录和交互环境的影响也各不相同。/etc 目录下提供
全局设置,如果用户主目录下存在同名文件,它将覆盖全局设置。
使用 /bin/login 读取 /etc/passwd 文件成功登陆后,启动了一个交互登陆shell。用命令可以启动一个交互非登陆shell。非交互shell
通常出现在shell脚本运行的时候,之所以称为非交互的,因为它正在运行一个脚本,而且命令与命令之间并不等待用户的输入。
无论运行什么shell,文件 /etc/environment 都先运行。
7.函数
当 shell 执行函数时,并不独立创建子进程。通常的做法是,将函数写入其他文件中,当需要的时候才将它们载入脚本。
1.shell 执行命令的顺序
交互式shell在获取用户输入时,并不是直接就在 PATH 路径中查找,而是按照固定的顺序依次寻找命令的位置。搜索顺序为:
1.别名,即使用 alias command='' 创建的命令
2.关键字,如 if, for
3.函数
4.内置命令,如 cd,pwd 等命令
5.外部命令,即脚本或可执行程序,这才在 PATH 路径中查找
由此可见,在同名时,函数的优先级高于脚本。可以使用内置命令 command,buildin 和 enable 改变优先级顺序。它允许你将函数,别名和脚本
文件定义成相同的名字,并选择执行其中之一。
2.函数的使用规则
1.函数必须先定义,后使用
2.函数在当前环境下运行,共享调用它的脚本中的变量,并且,函数允许你以给位置参数的方式向函数传递参数。函数体内可以使用local限定词创建局部变量。
3.如果在函数中使用 exit 命令,会退出脚本。如果想退回到原来调用函数的地方,则使用 return 命令
4.函数的 return 语句返回函数执行最后一条命令的退出状态
5.使用内置命令 export -f 可以将函数导出到子 shell 中
6.如果函数保存在其他文件中,可以使用 source 或者 . 命令将它们装入当前脚本
7.可以使用 declare -f 找到登录会话中定义的函数。函数会按照字母顺序打印所有的函数定义。如果仅仅想看函数名,则使用 declare -F 语句
3.函数定义
function 函数名()
{
...
}
function ()
{
...
}
4.函数的参数和返回值
由于函数是在当前 shell 中执行,所以变量对于函数和 shell 都可见。在函数内部对变量做的任何改动也会影响 shell 的环境。
参数 : 你可以像使用命令一样,向函数传递位置参数。位置参数是私有的,对位置参数的任何操作并不会影响函数外部使用的任何参数。
局部变量限定词local
返回方式 return : return 命令可以在函数体内返回函数被调用的位置。如果没有指定 return 的参数,则函数返回最后一条命令的退出
状态。按照规定,return 命令只能返回 0~255 之间的整数。
8.条件控制与流程控制
if 条件
then
...
elif 条件
then
...
else
...
fi
case 表达式 in
匹配1)
...;;
匹配2)
...;;
匹配3)
...;;
esac
for name [in list]
do
...
done
while 条件
do
...
done
until 条件
do
...
done