变量与函数

变量

变量的类型

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;]
}

说明:

  1. 可以带function fun()  定义,也可以直接fun() 定义,不带任何参数。
  2. 参数返回,可以显示加: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命令可以看出每一次执行的命令。

原文地址:https://www.cnblogs.com/qiusuo/p/5570255.html