变量与函数
变量
变量的类型
declare –a name :表示数组array。
declare –f name :表示是function的名字。
declare –F name :同上,但只显示function的名字。
declare –i name :表示整数
readonly name=value
declare –r name=value :表示只读。不能使用unset。对于只读变量,也可以使用readonly name 的方式,相当于declare –r name 。readonly可以带三个选项:-f表示这是个function的名字,-p表示打印所有的readonly的名字,-a表示这是个只读的数组。
declare –x name :同export,即不仅在当前的环境中起作用,也在子shell环境中起作用。
变量的使用
1. 设定变量(注意等号两端要紧跟,不能有空格):使用=号
2. 取得变量的值:在变量前加$,如果有其他干扰的情况,可以使用${},将变量名称括起来
3. 取消变量:unset后跟变量名称或者函数名称
4. 清空变量:赋值时,等号后边为空白就行。
5. 设置变量为环境变量:使用export后跟变量名。这样子shell就可以使用了。
注意:
双引号中:进行如下三个操作:替换变量、替换命令执行结果、替换算术运算结果。抑制在双引号中替换变量,可以使用\转义$。
单引号:形成一个所见所得的字符串,不会进行任何的变量操作。
echo "my first linux shell!" first_name=Jackie last_name=King echo your name is: $first_name·$last_name
数组
1. 建立数组
可以直接创建数组:A[0]=5; A[4]=10; A[3]="bash shell" #下标可以跳跃,可以直接增加元素。没有定义下标的位置是没有元素的,此时A有3个元素。
可以通过列表创建:B=(23 88 99 66)
指定个别元素索引:C=([3]=77 [1]=100 [5]=66)
2. 访问数组
访问单个数组:echo ${B[2]}
得到空格隔开的所有元素:${B[@]}
得到空格隔开的字符串:${B[*]}
元素个数:echo ${#B[@]}
字符串操作 (可以使用正则表达式)
运算符号 | 代表意义 |
${#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/substring/replacement} |
使用$replacement, 来代替第一个匹配的$substring |
${string//substring/replacement} |
使用$replacement, 代替所有匹配的$substring |
${string/#substring/replacement} |
如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring |
${string/%substring/replacement} |
如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring |
预定义变量
1. 环境变量
BASH:Bash的完整路径名。
BASH_VERSION
HOME
HOSTNAME:主机名
HOSTTYPE:主机形态。例如i386.
IFS:定义字段分隔符。默认值为:空格符、tab字符、换行字符(newline)
LANG:目前语系(locale)的名称。
PATH:命令的搜索路径。如果要自行添加搜索路径,一般的做法为:export PATH=/root/bin/:$PATH。这样可以在PATH增加路径/root/bin。
PS1:主要提示符号。
SHELL:shell的文件路径。默认为'/bin/bash'。
UID:用户代码
2. 输入的参数
输入参数的个数:$#
输入参数的数组:$*
输入参数的数组:$@
(以上两个不同只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 "$*" 等价于 "1 2 3"(传递了一个参数),而 "$@" 等价于 "1" "2" "3"(传递了三个参数)
每一个输入参数:$0 $1 $2 $3...$[10] $[11]...,其中$0表示可执行文件路径
#!/bin/bash # 预定义变量 echo parameter amount: $# echo all parameter: $* for((i=0;i<=$#;i++)) do eval echo "parameter $i: $"$i done
3. 执行状态
命令的执行状态:$?
当前shell的PID:$$
后台进程的PID:$!
#!/bin/bash echo execute echo # return 为0表示正常返回 echo last return: $? # 后台进程 echo current process ID: $$ & echo last background process ID in this shell: $!
参数置换
name=${name2:-word}
当name2这个变量已经设置过了(就是说name2这个变量设置过值),则把它的值赋值给name。如果name2这个变量没有设置过值,则把word当作name的值。
name=${name2:=word}
当name2这个变量已经设置过了,就把name2的值赋值给name这个变量,如果name2没有设置过,则把word赋值给name2
name=${name2:?word}
当name2这个变量设置过了,就把name2的值赋值给name,如果没有设置过值,则打印出word,但并不把值赋值给name
name=${name2:+word}
当name2这个变量有值,则把word的值赋给name,如果name2没有值,则什么都不设置。
函数
脚本中的函数
函数定义方式
[ function ] funname () { action; [return int;] }
说明:
- 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
#!/bin/bash function output() { echo this is output $1 return 4; } output "12345" echo $?
shell中载入函数
当你收集一些经常使用的函数时,可以将之放入函数文件中并将文件载入shell。
有函数文件test.main
function findit(){ if [ $# -lt 1 ]; then echo "usage: findit file" return 1 fi find / -name $1 -print }
载入(定位文件):
#点+空格+函数路径
. ~/test.main
删除:
unset
调试脚本
脚本错误一般有:循环错误、漏写引号、比较测试的错误、字符大小写。
最常用的调试是使用echo输出
set命令
set命令可辅助脚本调试。以下是set命令常用的调试选项:
- set -n 读命令但并不执行。
- set -v 显示读取的所有行。
- set -x 显示所有命令及其参数。
使用set命令可以看出每一次执行的命令。