Advanced Bash-Scripting Guide学习笔记-变量深入

1.内部变量

variable_name variable_value instructions
BASH /bin/bash bash二进制执行文件
BASH_VERSINFO[0] 4 主版本号
BASH_VERSINFO[1] 2 次版本号
BASH_VERSINFO[2] 46 更新次数
BASH_VERSINFO[3] 2 构建次数
BASH_VERSINFO[4] release 分发状态
BASH_VERSINFO[5] x86_64-redhat-linux-gnu 架构
BASH_VERSION 4.2.46(2)-release bash版本号
DIRSTACK $PWD 当前目录
FUNCNAME 正在执行的函数的名字 可以放在函数里定位函数执行过程
GROUPS 0 当前登录的用户所属组的组id号,root默认为0
HOME /root 当前登录的用户家目录
HOMENAME 主机名 主机名
HOSTTYPE x86_64 设备硬件类型
IFS 内部域分隔,默认为空白,可以自定义设置 Bash 在解释字符串时如何识别域,或者单词边界
LINENO 记录其所在的行号 记录其所在shell脚本中的行号
MACHTYPE 系统硬件架构 系统设备

IFS
IFS默认为空白(空格 TAB 新行),该默认值是可以更改的,下面是两个关于IFS的脚本
cat example1.sh

#!/bin/bash

test () {
    for arg
    do
        echo "[$arg]"
    done
}

var=" a  b c   "
test $var
pwd

bash example.sh
返回
[a]
[b]
[c]
/root/bashtest

cat example2.sh

#!/bin/bash

test () {
    for arg
    do
        echo "[$arg]"
    done
}

IFS=":"
var=":a::b:c:::"
test $var
pwd

bash examlpe2.sh
返回
[]
[a]
[]
[b]
[c]
[]
[]
/root/bashtest

再看下面这个脚本,通过其结果可以理解其IFS是如何工作的
cat ifs.sh

#!/bin/bash

echo 
echo "IFS域内分隔符作用,其默认值为空白(空格、TAB以及换行),可以更改"
echo 

echo "IFS=\" \""
echo "-----------"
var="a b  c"
echo $var
for i in $var
do  
    echo "[$i]"
done

echo
echo "IFS=\":\""
echo "------------"
IFS=":"
var="a:b::c"
echo $var
for i in $var
do
    echo "[$i]"
done

echo
echo "IFS=\" \""
echo "------------"
IFS=" "
var="a:b::c"
echo $var
for i in $var
do
    echo "[$i]"
done

echo
echo "IFS=\":\""
echo "------------"
IFS=":"
var="a b  c"
echo $var
for i in $var
do
    echo "[$i]"
done

返回结果
04ifs2

从上面返回的结果来看,IFS定义了如何去分隔变量var值,其处理空白的方式与其他方式不一样,但如果将上面的语句echo $var改成echo "$var",看看结果会是如何

PWD
当前所在的工作目录

#!/bin/bash

### 清空目录##
E_WRONG=73
TargetDirectory=/root/tmp

cd $TargetDirectory

if [ "$PWD" != "$TargetDirectory" ];then
    echo "Wrong Directory"
    echo "In $TargetDirectory,rather than $PWD"
    exit $E_WRONG
fi

rm -Rf *
rm -Rf .[A-Za-z0-9]*

echo "Done"

exit 0

REPLAY
REPLY是read命令结果保存的默认变量,但是当且仅当没有变量提供给read命令时,REPLY才保存最后一个read命令读入的值

#!/bin/bash

echo "what is your favorite vegetable"
read 

echo "your favorite vegetavle is $REPLY"   

echo "waht is your favorite fruit"
read fruit   
echo "the \$REPLY is still is $REPLY"   
echo "youur favorite fruit is $fruit"

echo

exit 0

what is your favorit vegetable
手动输入 haha
your favorite vegetavle is haha
手动输入 apple
the $REPLY is still vegetable
youur favorite fruit is apple