澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:变量与函数,shell笔记之

bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html**


变量

shell笔记之变量


本文目录:

变量的类型

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环境中起作用。

 

变量存在于内存中。假设变量str,设置或修改变量属性时,不带$号,只有引用变量的值时才使用$号。也就是说在内存中,标记变量的变量名称是str,而不是$str

1.4.1 环境变量

变量的使用

  1. 设定变量(注意等号两端要紧跟,不能有空格):使用=号

2. 取得变量的值:在变量前加$,如果有其他干扰的情况,可以使用${},将变量名称括起来

  1. 取消变量:unset后跟变量名称或者函数名称

  2. 清空变量:赋值时,等号后边为空白就行。

  3. 设置变量为环境变量:使用export后跟变量名。这样子shell就可以使用了。

注意:

双引号中:进行如下三个操作:替换变量、替换命令执行结果、替换算术运算结果。抑制在双引号中替换变量,可以使用转义$。

 

单引号:形成一个所见所得的字符串,不会进行任何的变量操作。

echo "my first linux shell!"
first_name=Jackie
last_name=King
echo your name is: $first_name·$last_name

Shell代码  

1.4.1 环境变量

环境变量就是运行在"环境"上下文的,在这个上下文都可以引用。例如,常见的cd、ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环境变量中,系统自己会去寻找PATH下的路径是否有该命令。

环境变量常用大写字母表示。常见的环境变量有HOSTNAME、SHELL、HISTSIZE、USER、PATH、PWD、LANG、HOME、LOGNAME。分别表示当前主机名、SHELL的路径即bash的类型、history保存多少记录、当前用户名、自动搜索路径、当前目录、使用的语系(临时修改语系时就改这个变量)、当前用户的家目录、当前登录的用户。

使用env或者export可以查看当前用户的环境变量。

[root@xuexi ~]# env

XDG_SESSION_ID=411
HOSTNAME=xuexi.longshuai.com
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.16.10.1 10171 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/0
QT_GRAPHICSSYSTEM_CHECKED=1
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sersync:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
SSH_CONNECTION=172.16.10.1 10171 172.16.10.3 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

使用echo可以输出变量的值。

[root@xuexi ~]# echo $PATH 
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

例如,在PATH环境变量中新加入一个目录/usr/local/mysql/bin。

[root@xuexi tmp]# PATH=/usr/local/mysql/bin:$PATH

这里也能看到两个PATH第一个没使用$,第二个使用了。当对变量本身进行操作,则不使用$,当对变量值进行操作,则使用$

1.4.2 普通变量

数组

  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) 

  1. 访问数组

访问单个数组:echo ${B[2]澳门新浦京娱乐场网站:变量与函数,shell笔记之变量。}

得到空格隔开的所有元素:${B[@]} 

得到空格隔开的字符串:${B[*]}

元素个数:echo ${#B[@]} 

#!/bin/bash  

1.4.2 普通变量

脚本语言是弱类型的语言,变量通常不需要特地声明甚至不需要初始化,在脚本运行时由解释器进行解释运算,解释器知道变量在什么时候是什么类型,所以直接赋值使用即可。bash中,变量默认都是字符串类型,不论是否使用引号赋值,都以字符串方式存储。

1.变量赋值方式: str=value 。注意等号左右没有空格。如果有空格就是进行比较运算符的比较运算了。

澳门新浦京娱乐场网站:变量与函数,shell笔记之变量。2.变量引用方式:$str或者${str},例如 echo "the var is ${str}" 。

[root@xuexi tmp]# str='Hello World!'

[root@xuexi tmp]# echo "We will say ${str}"
We will say Hello World! 

3.释放变量: unset str ,注意变量名前不加前缀$。

[root@xuexi ~]# unset str

4.查看所有的变量:不接任何参数的set或者declare命令,输出结果中包含了普通变量和环境变量。

5.定义只读变量: readonly str 。这时将无法修改变量值也无法unset变量,只有重新登录shell才能继续使用只读变量。

6.临时将普通变量升级为环境变量: export str 或者赋值时 export str="value" ,这样$str就可以在当前shell和子shell中使用,但是退出脚本或者重新登录shell都会取消export效果。

[root@xuexi ~]# str='Hello World!';echo $str
Hello World!

[root@xuexi ~]# bash            # 开启子shell
[root@xuexi ~]# echo ${str}     # 子shell中查看变量结果发现没有该变量。

在子shell中查看变量,结果竟然没有该变量。这是因为$str的作用域只在当前shell,要想在子shell中也能引用普通变量,则需要使用export升级为环境变量。

[root@xuexi ~]# exit   # 退出子shell

[root@xuexi ~]# export str # 回到父shell升级该变量

[root@xuexi ~]# bash

[root@xuexi ~]# echo $str
Hello World!

1.4.3 修改变量的生命周期和作用域

字符串操作 (可以使用正则表达式)

 

运算符号 代表意义

${#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.4.3 修改变量的生命周期和作用域

普通的变量在脚本结束或退出登录后就失效,并且只对当前shell有效,其他用户和当前用户的子shell都无法使用。

使用export可以升级为临时局部的环境变量,只对当前用户的当前shell和子shell有效,退出脚本和退出登录后也失效。

如果想要设置永久的且全局的变量,一种方法是将变量的设置语句放入到/etc/profile文件中,因为每个用户登录时,都会调用该文件并执行其中的语句。如果想立即加载此文件中的配置使得临时添加的设置立即生效,只需source该文件即可。

[root@xuexi ~]# source /etc/profile

/etc/profile文件是bash的全局配置文件,还有每个用户的配置文件~/.bash_profile,此文件中的变量将只对对应的用户生效。

此外,还有几个配置bash环境配置文件,具体的见bash环境配置流程。

1.4.4 获取变量的长度

预定义变量

  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:用户代码

  1. 输入的参数

输入参数的个数:$#

输入参数的数组:$*

输入参数的数组:$@

(以上两个不同只有在双引号中体现出来。假设在脚本运行时写了三个参数 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
  1. 执行状态

命令的执行状态:$?

当前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没有值,则什么都不设置。

# #开头的行注释  

1.4.4 获取变量的长度

在使用"${}"方式引用变量时,变量名前加上#就可以查看该变量的字符长度。空格也算入长度。例如:

[root@xuexi ~]# echo ${#str}
12

[root@xuexi ~]# echo ${#PATH}
92

1.4.5 declare声明变量

函数

# shell脚本的第一行一般都是#!/bin/bash 表示由/bin/bash负责解释  

1.4.5 declare声明变量

declare [ /-][选项] 变量名

选项说明:

-/ :给变量设定类型属性,取消给变量设定的类型属性

-i:声明为整型

-x:声明为环境变量

-p:显示变量名和值

例如,声明一个环境变量 declare -x str ,取消该变量 declare x str 。

1.4.6 位置变量和特殊变量

脚本中的函数

函数定义方式

[ 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 $?

 www.2cto.com  

1.4.6 位置变量和特殊变量

$?:上一条代码执行的回传指令,回传0表示标准输出,即正确执行,否则为标准错误输出。

$$:当前shell的PID。除了执行bash命令和shell脚本时,$$不会继承父shell的值,其他类型的子shell都继承。

$BASHPID:当前shell的PID,这和"$$"是不同的,因为每个shell的$BASHPID是独立的。而"$$"有时候会继承父shell的值。

$!:最近一次执行的后台进程PID。

$#:统计参数的个数。

$@:所有单个参数,如"a""b""c""d"。

$*:所有参数的整体,如“abcd”。

$0:脚本名。

$1……$n:参数位置。

使用下面的脚本来验证位置变量和特殊变量。

root@xuexi tmp]# vim var.sh
#!/bin/bash

# 测试各种变量的作用,包括预定义和自定义变量
echo '$?:'$?
echo '$$:'$$
echo '$!:'$!
echo '$#:'$#
echo '$@:'$@
echo '$*:'$*
echo '$0:'$0
echo '$1:'$1
echo '$2:'$2
echo '$3:'$3
echo '$4:'$4

使用5个参数来运行该脚本。

[root@xuexi tmp]# sh ./var.sh a b c d e
$?:0
$$:6089
$!:
$#:5
$@:a b c d e
$*:a b c d e
$0:./var.sh
$1:a
$2:b
$3:c
$4:d

1.4.7 shift轮替变量

shell中载入函数

当你收集一些经常使用的函数时,可以将之放入函数文件中并将文件载入shell。

有函数文件test.main

function findit(){
    if [ $# -lt 1 ]; then
        echo "usage: findit file"
        return 1
    fi
    find / -name $1 -print
}

载入(定位文件):

#点 空格 函数路径
. ~/test.main

删除:

unset

 

# 定义变量  

1.4.7 shift轮替变量

使用 shift [N] 可以指定参数轮替,每执行一次 shift N 就踢掉N个参数,默认N为1。

例如在脚本中:

echo $1   # # 输出第一个参数值
shift 2   # # 踢掉前两个参数,第三个参数变成$1
echo $1   # # 此时$1的值为第三个参数的值
shift     # # 又踢掉一个参数,第四个参数变成$1
echo $1   # # 输出第四个参数

1.4.8 shell其它基础

调试脚本

脚本错误一般有:循环错误、漏写引号、比较测试的错误、字符大小写。

最常用的调试是使用echo输出

str="string value"  

1.4.8 shell其他基础

1、变量中字符的长度: ${#VARNAME} 

2、变量赋值等:

${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则展开为parameter的值;

${parameter-word}:和${parameter:-word}几乎等价,除了parameter设置了但为空时,变量的结果将是null,而非word。在/etc/init.d/httpd中有此用法。

${parameter: word}:如果parameter为空或未定义,不做任何操作,即仍然为空;否则展开为“word”值;

${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,否则为parameter自身;

${parameter:offset}:取子串,从offset处的后一个字符开始取到最后一个字符;

${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;

其中 ${parameter:-word} 最常用,最后两个是截取字符串的,偶尔也会用到。

3、脚本配置文件

配置文件中的变量值可以在脚本中被使用

要在脚本中调用配置文件,直接使用 source config_file 或 . config_file 

服务启动脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件

4、局部变量,在函数中定义局部变量使其不影响函数外的同名变量

local VAR_NAME=

5、命令mktemp创建临时文件或目录

mktemp [-d] /tmp/file.XX   # X指定越多,随机生成的后缀就越长,其中-d表示创建临时目录。

例如:

[root@xuexi ~]# mktemp haha.XXX
haha.oOe

[root@xuexi ~]# mktemp -d haha.XXX
haha.npz

[root@xuexi ~]# touch haha.npz/A.txt

1.4.9 变量的切分、提取和替换

set命令

set命令可辅助脚本调试。以下是set命令常用的调试选项:

  • set -n 读命令但并不执行。
  • set -v 显示读取的所有行。
  • set -x 显示所有命令及其参数。

使用set命令可以看出每一次执行的命令。

num=123  

1.4.9 变量的切分、提取和替换

其实是对变量实现的功能,只是使用文件名的说法比较典型,且容易理解它的用途。

例如,将文件名"Linux.docx.jpg"存放到变量file_name中,然后执行从左向右或从右向左的删除或贪婪删除。

[root@xuexi tmp]# file_name="Linux.docx.jpg"
[root@xuexi tmp]# file_name_greedy=${file_name%%.*}
[root@xuexi tmp]# file_name_nongreedy=${file_name%.*}
[root@xuexi tmp]# extention_name_greedy=${file_name##*.}
[root@xuexi tmp]# extention_name_nongreedy=${file_name#*.}

[root@xuexi tmp]# echo -e "${file_name_greedy}n${file_name_nongreedy}n${extention_name_greedy}n${extention_name_nongreedy}"
Linux
Linux.docx
jpg
docx.jpg

 ${var%%.*} 和 ${var%.*} 中的 %%.* 表示从右向左匹配 .* 并删除,由于Linux.docx.jpg有两种符合条件的匹配:".jpg"和".docx.jpg",所以使用两个"%%"表示贪婪删除,即删除最长匹配".docx.jpg"。可以使用一个%表示非贪婪删除,表示删除最短的匹配即".jpg"。

 ${var##*.} 和 ${var#*.} 中的 ##*. 表示从左向右匹配 *. 并执行贪婪删除,即删除"Linux.docx.",同理 #*. 表示非贪婪删除,即删除"Linux."。

除了删除,还可以实现提取和替换的功能。

[root@xuexi tmp]# echo "${file_name:0:5}"   # 提取第0个字节后的5个字节,即1-5字节
Linux

[root@xuexi tmp]# echo "${file_name:6:4}"   # 提取第6个字节后的4个字节,即第7、8、9、10字节
docx

[root@xuexi tmp]# echo "${file_name/jpg/pdf}"   # 非贪婪替换jpg为pdf,即只替换从左向右的第一个
Linux.docx.pdf

[root@xuexi tmp]# echo "${file_name//jpg/pdf}"  # 贪婪替换jpg为pdf,即所有的jpg都替换为pdf
Linux.docx.pdf

不错的功能是替换。有时候想要删除PATH环境变量中的某个路径,可以使用变量替换的功能,似乎没法使用变量切分来实现。例如:

[root@toystory php]# echo $A
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin:/usr/local/mysql:/usr/local/apache/bin

注意,由于可能多次读取了配置文件,导致PATH中出现了重复的路径。现在想删除其中一个路径。使用下面的命令就可以实现路径删除,注意其中使用了转义符号,并且变量替换的替换值留空了表示删除前面匹配的部分。

[root@toystory php]# B=${A/:/usr/local/apache/bin/}

[root@toystory php]# echo $B
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql:/usr/local/apache/bin

echo str is :"$str"  

变量存在于内存中。假设变量str,设置或修改变量属性时,不带$号,只有引用变量的值时才使用$号。也就是说在内存中,标记变量的变量名称是str,而不是$str

echo num's value is: $num  

1.4.1 环境变量

环境变量就是运行在"环境"上下文的,在这个上下文都可以引用。例如,常见的cd、ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环境变量中,系统自己会去寻找PATH下的路径是否有该命令。

环境变量常用大写字母表示。常见的环境变量有HOSTNAME、SHELL、HISTSIZE、USER、PATH、PWD、LANG、HOME、LOGNAME。分别表示当前主机名、SHELL的路径即bash的类型、history保存多少记录、当前用户名、自动搜索路径、当前目录、使用的语系(临时修改语系时就改这个变量)、当前用户的家目录、当前登录的用户。

使用env或者export可以查看当前用户的环境变量。

[root@xuexi ~]# env

XDG_SESSION_ID=411
HOSTNAME=xuexi.longshuai.com
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.16.10.1 10171 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/0
QT_GRAPHICSSYSTEM_CHECKED=1
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/sersync:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
SSH_CONNECTION=172.16.10.1 10171 172.16.10.3 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env

使用echo可以输出变量的值。

[root@xuexi ~]# echo $PATH 
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

例如,在PATH环境变量中新加入一个目录/usr/local/mysql/bin。

[root@xuexi tmp]# PATH=/usr/local/mysql/bin:$PATH

这里也能看到两个PATH第一个没使用$,第二个使用了。当对变量本身进行操作,则不使用$,当对变量值进行操作,则使用$

  

1.4.2 普通变量

脚本语言是弱类型的语言,变量通常不需要特地声明甚至不需要初始化,在脚本运行时由解释器进行解释运算,解释器知道变量在什么时候是什么类型,所以直接赋值使用即可。bash中,变量默认都是字符串类型,不论是否使用引号赋值,都以字符串方式存储。

变量赋值方式:str=value,其实是set str=value,省略了set关键字。注意等号左右没有空格。如果有空格就是进行比较运算符的比较运算了。

变量引用方式:$str或者${str},例如echo "the var is ${str}"。

[root@xuexi tmp]# str='Hello World!'

[root@xuexi tmp]# echo "We will say ${str}"
We will say Hello World! 

释放变量:unset str,注意变量名前不加前缀$。

[root@xuexi ~]# unset str

查看所有的变量:不接任何参数的set或者declare命令,输出结果中包含了普通变量和环境变量。

定义只读变量:readonly str。这时将无法修改变量值也无法unset变量,只有重新登录shell才能继续使用只读变量。

临时将普通变量升级为环境变量:export str或者赋值时export str="value",这样$str就可以在当前shell和子shell中使用,但是退出脚本或者重新登录shell都会取消export效果。

[root@xuexi ~]# str='Hello World!';echo $str
Hello World!

[root@xuexi ~]# bash            # 开启子shell
[root@xuexi ~]# echo ${str}     # 子shell中查看变量结果发现没有该变量。

在子shell中查看变量,结果竟然发现没有该变量。这是因为$str的作用域只在当前shell,要想在子shell中也能引用普通变量,则需要使用export升级为环境变量。

[root@xuexi ~]# exit   # 退出子shell

[root@xuexi ~]# export str # 回到父shell升级该变量

[root@xuexi ~]# bash

[root@xuexi ~]# echo $str
Hello World!

# 注意:  

1.4.3 修改变量的生命周期和作用域

普通的变量在脚本结束或退出登录后就失效,并且只对当前shell有效,其他用户和当前用户的子shell都无法使用。

使用export可以升级为临时局部的环境变量,只对当前用户的当前shell和子shell有效,退出脚本和退出登录后也失效。

如果想要设置永久的且全局的变量,一种方法是将变量的设置语句放入到/etc/profile文件中,因为每个用户登录时,都会调用该文件并执行其中的语句。如果想立即加载此文件中的配置使得临时添加的设置立即生效,只需source该文件即可。

[root@xuexi ~]# source /etc/profile

/etc/profile文件是bash的全局配置文件,还有每个用户的配置文件~/.bash_profile,此文件中的变量将只对对应的用户生效。

此外,还有几个配置bash环境配置文件,具体的见bash环境配置流程。

# 1、"="两边没有空格,任何空格会导致错误。  

1.4.4 获取变量的长度

在使用${}方式引用变量时,变量名前加上#就可以查看该变量的字符长度。空格也算入长度。例如:

[root@xuexi ~]# echo ${#str}
12

[root@xuexi ~]# echo ${#PATH}
92

# 2、虽然在定义一个字时可以省略引号,但是当定义的变量值多于一个字时(包含空格或制表符),引号是必须的。  

1.4.5 declare声明变量

declare [ /-][选项] 变量名

选项说明:

-/ :给变量设定类型属性,取消给变量设定的类型属性

-i:声明为整型

-x:声明为环境变量

-p:显式指定变量被声明的类型

例如,声明一个环境变量declare -x str,取消该变量declare x str。

# 3、虽然通常可以使用双引号,但可能导致错误。使用单引号禁用了成为扩展的bash特性  

1.4.6 位置变量和特殊变量

$?:上一条代码执行的回传指令,回传0表示标准输出,即正确执行,否则为标准错误输出。

$$:当前shell的PID。除了执行bash命令和shell脚本时,$$不会继承父shell的值,其他类型的子shell都继承。

$BASHPID:当前shell的PID,这和"$$"是不同的,因为每个shell的$BASHPID是独立的。而"$$"有时候会继承父shell的值。

$!:最近一次执行的后台进程PID。

$#:统计参数的个数。

$@:所有单个参数,如"a""b""c""d"。

$*:所有参数的整体,如“abcd”。

$0:脚本名。

$1……$n:参数位置。

使用下面的脚本来验证位置变量和特殊变量。

root@xuexi tmp]# vim var.sh
#!/bin/bash

# 测试各种变量的作用,包括预定义和自定义变量
echo '$?:'$?
echo '$$:'$$
echo '$!:'$!
echo '$#:'$#
echo '$@:'$@
echo '$*:'$*
echo '$0:'$0
echo '$1:'$1
echo '$2:'$2
echo '$3:'$3
echo '$4:'$4

使用5个参数来运行该脚本。

[root@xuexi tmp]# sh ./var.sh a b c d e
$?:0
$$:6089
$!:
$#:5
$@:a b c d e
$*:a b c d e
$0:./var.sh
$1:a
$2:b
$3:c
$4:d

    www.2cto.com  

1.4.7 shift轮替变量

使用shift [N]可以指定参数轮替,每执行一次shift N就踢掉N个参数,默认N为1。

例如在脚本中:

echo $1   # # 输出第一个参数值
shift 2   # # 踢掉前两个参数,第三个参数变成$1
echo $1   # # 此时$1的值为第三个参数的值
shift     # # 又踢掉一个参数,第四个参数变成$1
echo $1   # # 输出第四个参数

# 参数变量(用单引号禁止来扩展)  

1.4.8 shell其他基础

1、变量中字符的长度:${#VARNAME}

2、变量赋值等:

${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则展开为parameter的值;

${parameter-word}:和${parameter:-word}几乎等价,除了parameter设置了但为空时,变量的结果将是null,而非word。在/etc/init.d/httpd中有此用法。

${parameter: word}:如果parameter为空或未定义,不做任何操作,即仍然为空;否则展开为“word”值;

${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,否则为parameter自身;

${parameter:offset}:取子串,从offset处的后一个字符开始取到最后一个字符;

${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;

其中${parameter:-word}最常用,最后两个是截取字符串的,偶尔也会用到。

3、脚本配置文件

配置文件中的变量值可以在脚本中被使用

要在脚本中调用配置文件,直接使用source config_file或“.  config_file”

服务启动脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件

4、局部变量,在函数中定义局部变量使其不影响函数外的同名变量

local VAR_NAME=

5、命令mktemp创建临时文件或目录

mktemp [-d] /tmp/file.XX # X指定越多,随机生成的后缀就越长,其中-d表示创建临时目录。

例如:

[root@xuexi ~]# mktemp haha.XXX
haha.oOe

[root@xuexi ~]# mktemp -d haha.XXX
haha.npz

[root@xuexi ~]# touch haha.npz/A.txt

# $0 表示执行的命令本身,如此脚本是 env.sh  

1.4.9 变量的切分、提取和替换

其实是对变量实现的功能,只是使用文件名的说法比较典型,且容易理解它的用途。

例如,将文件名“Linux.docx.jpg”存放到变量file_name中,然后执行从左向右或从右向左的删除或贪婪删除。

[root@xuexi tmp]# file_name="Linux.docx.jpg"
[root@xuexi tmp]# file_name_greedy=${file_name%%.*}
[root@xuexi tmp]# file_name_nongreedy=${file_name%.*}
[root@xuexi tmp]# extention_name_greedy=${file_name##*.}
[root@xuexi tmp]# extention_name_nongreedy=${file_name#*.}

[root@xuexi tmp]# echo -e "${file_name_greedy}n${file_name_nongreedy}n${extention_name_greedy}n${extention_name_nongreedy}"
Linux
Linux.docx
jpg
docx.jpg

${var%%.*}和${var%.*}中的“%%.*”表示从右向左匹配“.*”并删除,由于Linux.docx.jpg有两种符合条件的匹配:“.jpg”和“.docx.jpg”,所以使用两个%%表示贪婪删除,即删除最长匹配“.docx.jpg”。可以使用一个%表示非贪婪删除,表示删除最短的匹配即“.jpg”。

${var##*.}和${var#*.}中的“##*.”表示从左向右匹配“*.”并执行贪婪删除,即删除“Linux.docx.”,同理“#*.”表示非贪婪删除,即删除“Linux.”。

除了删除,还可以实现提取和替换的功能。

[root@xuexi tmp]# echo "${file_name:0:5}"   # 提取第0个字节后的5个字节,即1-5字节
Linux

[root@xuexi tmp]# echo "${file_name:6:4}"   # 提取第6个字节后的4个字节,即第7、8、9、10字节
docx

[root@xuexi tmp]# echo "${file_name/jpg/pdf}"   # 非贪婪替换jpg为pdf,即只替换从左向右的第一个
Linux.docx.pdf

[root@xuexi tmp]# echo "${file_name//jpg/pdf}"  # 贪婪替换jpg为pdf,即所有的jpg都替换为pdf
Linux.docx.pdf

不错的功能是替换。有时候想要删除PATH环境变量中的某个路径,可以使用变量替换的功能,似乎没法使用变量切分来实现。例如:

[root@toystory php]# echo $A
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin:/usr/local/mysql:/usr/local/apache/bin

注意,由于可能多次读取了配置文件,导致PATH中出现了重复的路径。现在想删除其中一个路径。使用下面的命令就可以实现路径删除,注意其中使用了转义符号,并且变量替换的替换值留空了表示删除前面匹配的部分。

[root@toystory php]# B=${A/:/usr/local/apache/bin/}

[root@toystory php]# echo $B
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql:/usr/local/apache/bin

 

回到系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

# $1 表示第一个参数, $2表示第二个参数,如此类推;  

转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/7229381.html

# [email protected] 表示一次引用所有的变量,它扩展成所有用空格分隔开的命令行参数;  

# $# 表示传递给脚本的变量数目;  

echo '$0 is ' $0  

echo '$1 is ' $1  

echo '$2 is ' $2  

echo '$3 is ' $3  

echo '$# is ' $#  

echo '[email protected] is ' [email protected]  

  

# 环境变量,使用export命令设置,使用unset取消  

export editor=vim  

unset editor  

  

# 变量默认值  

# ${parameter:-word} 如果parameter没有设置或者为空,则shell扩展word并替换结果。parameter的值并没有更改。  

  

# ${parameter:=word} 如果parameter没有设置或者为空,则shell扩展word并将结果指派给parameter。这个值然后被替换。不能用这种方式指派位置参数或特殊参数的值。  

  

# ${parameter:?word} 如果parameter没有设置或者为空,shell扩展word并将结果写入标准错误中。如果没有word则写入一条消息。如果shell不是交互的,则表示存在这个扩展。  

  

# ${parameter: word} 如果parameter没有设置或者为空,则不作替换  

    www.2cto.com  

unset x  

y="abc def"  

echo "/${x:-'xyz'} /${y:-'xyz'} /$x /$y/"  

  

unset x  

y="abc def"  

echo "/${x:='xyz'} /${y:-'xyz'} /$x /$y/"  

Shell代码 #!/bin/bash # #开头的行注释 # shell脚本的第一行一般都是#!/bin/bash 表示由/bin/bash负责解释 www.2cto.com # 定义变量 str=s...

本文由澳门新浦京娱乐场网站发布于澳门新浦京娱乐场网站,转载请注明出处:澳门新浦京娱乐场网站:变量与函数,shell笔记之