Shell入门-Shell变量

Shell变量

本篇包含的内容:

  • 变量的类型及变量的赋值方式
  • 显示与取消环境变量
  • Shell中单引号、双引号、反引号的区别
  • Shell中的特殊位置参数变量
  • Shell中特殊状态变量
  • Shell内置命令
  • Shell变量子串及特殊扩展命令

变量类型

变量可分为两类:环境变量(全局变量)和普通变量(局部变量)。

环境变量一般是指用export内置命令导出的变量。

按照系统规范,所有环境变量的名字均采用大写形式。例如:正确的环境变量定义方法为export OLDGIRL=1

在查看设置的变量时,有3个命令可以显示变量的值:set、env和declare(替代早期的typeset)。set命令输出所有的变量,包括全局变量和局部变量;env命令只显示全局变量;declare命令输出所有的变量、函数、整数和已经导出的变量。set -o命令显示bash Shell的所有参数配置信息

赋值方式

先写变量名称,紧接着是“=”这个字符,最后是值,中间无任何空格。

[root@localhost shell]# oldboy="iam oldboy"
[root@localhost shell]# echo $oldboy
iam oldboy
[root@localhost shell]# echo $oldboy
iam oldboy
[root@localhost shell]# oldboy1 = "iam oldboy"
-bash: oldboy1: 未找到命令
[root@localhost shell]# 

设置登录提示的两种方式

  1. /etc/motd中添加描述,welcome to tianhao linux shell training....

    连接成功
    Last login: Thu Mar  4 21:56:02 2021 from 192.168.15.1
         welcome to tianhao linux shell training....
    [root@localhost ~]# 
    
  2. /etc/profile.d/添加脚本,如test.sh,内容为echo "this is tianhao training"

    [root@localhost ~]# echo  echo "here is tianhao training" > /etc/profile.d/tianhao.sh
    
    连接成功
    Last login: Thu Mar  4 22:11:22 2021 from 192.168.15.1
         welcome to tianhao linux shell training....
    here is tianhao training
    [root@localhost ~]# 
    

显示与取消环境变量

  • $HOME:用户登录时进入的目录。
  • $UID:当前用户的UID(用户标识),相当于id -u。
  • $PWD:当前工作目录的绝对路径名。
  • $SHELL:当前SHELL。
  • $USER:当前用户。
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $UID
0
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo $USER
root
[root@localhost ~]# 

取消本地变量和环境变量

root
[root@localhost ~]# unset USER
[root@localhost ~]# echo $USER

[root@localhost ~]# 

本地变量

定义普通变量有三种方式

  • 变量名=value
  • 变量名=‘value’
  • 变量名=“value”

$变量名表示输出变量,可以用$c和${c}两种用法。例如:

[root@localhost shell]# cat var-learn01.sh 
#!/bin/bash
#***********************************************
#Author:        luotianhao
#Mail:          [email protected]
#Version:       1.0
#Date:          2021-03-04
#FileName:      var-learn01.sh
#Description:   This is a test script.
#***********************************************
a=192.168.15.79
b='192.168.15.79'
c="192.168.15.79"

echo "a=$a"
echo "b=$b"
echo "c=${c}"
[root@localhost shell]# sh var-learn01.sh 
a=192.168.15.79
b=192.168.15.79
c=192.168.15.79

将连续的普通字符串的内容赋值给变量,不管用不用引号,或者不管用什么引号,它的内容是什么,打印变量时就会输出什么。

现在我们不单纯使用字符串了,添加了一些变量。例如:

[root@localhost shell]# cat var-learn02.sh 
#!/bin/bash
#***********************************************
#Author:        luotianhao
#Mail:          [email protected]
#Version:       1.0
#Date:          2021-03-04
#FileName:      var-learn02.sh
#Description:   This is a test script.
#***********************************************
d=192.168.15.79-$d
e='192.168.15.79-$d'
f="192.168.15.79-$d"

echo "d=$d"
echo "e=$e"
echo "f=${f}"
[root@localhost shell]# sh var-learn02.sh 
d=192.168.15.79-
e=192.168.15.79-$d
f=192.168.15.79-192.168.15.79-

能发现:①不加引号时,变量中引用变量,引用的变量无值则输出为空②加单引号,变量中引用变量,输出的是变量名③使用双引号,可以输出被引用的变量

把一个命令的结果作为变量的内容赋值的方法:

  1. 使用反引号包裹命令
  2. 使用$()包裹命令。

一个按天打包网站的示例:①定义一个CMD的变量,变量的值是date +%F输出的结果(使用$()包裹)②使用反引号包裹变量的输出作为压缩包名称

[root@localhost shell]# CMD=$(date +%F)
[root@localhost shell]# echo $CMD
2021-03-04
[root@localhost shell]# echo `date +%F`.tar.gz
2021-03-04.tar.gz
[root@localhost shell]# tar zcf etc_$(date +%F).tar.gz /etc
tar: 从成员名中删除开头的“/”
[root@localhost shell]# ls -l etc_2021-03-04.tar.gz 
-rw-r--r-- 1 root root 11403065 3月   4 22:44 etc_2021-03-04.tar.gz
[root@localhost shell]# H=$(uname -n)
[root@localhost shell]# echo $H
localhost.localdomain
[root@localhost shell]# tar zcf $H.tar.gz /etc/services 
tar: 从成员名中删除开头的“/”
[root@localhost shell]# ls -l localhost.localdomain.tar.gz 
-rw-r--r-- 1 root root 136214 3月   4 22:45 localhost.localdomain.tar.gz
[root@localhost shell]# 

Shell中单引号、双引号、反引号与不加引号的区别

  • 单引号:所见即所得(引号内是什么输出什么),被称为强引用。
  • 双引号:如果内容中有命令(反引号)、变量、特殊转义符等,会先把变量、命令、转义符解析输出结果,然后再输出最终内容,被称为弱引用
  • 无引号:变量内容中如果有空格,会造成赋值不完整。而在输出内容时,会将含有空格的字符串视为一个整体来输出;如果内容中有命令(反引号)、变量等,则会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要改加双引号。一般连续的字符串、数字、路径等可以不加任何引号进行赋值和输出,不过最好是用双引号替代无引号的情况,特别是对变量赋值时
  • 反引号:相当于$(),赋值和输出时都要用反引号或$()将命令引起来

awk命令中使用单引号、双引号、反引号

  • 单引号:是纯字符串输出解析后的结果;被单引号/双引号包裹的字符串则输出空;被反引号包裹的输出报错
  • 双引号:纯字符串/单引号/双音好包裹输出引号内容本身
  • 双引号+单引号:输出引用
  • 无引号:输出空
[root@localhost ~]# ETT=123
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'

[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
123
[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
123
[root@localhost ~]# ETT='oldgirl'
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'

[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
oldgirl
[root@localhost ~]# awk 'BEGIN {print '$ETT'}'

[root@localhost ~]# ETT="tingting"
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'

[root@localhost ~]# awk 'BEGIN {print '$ETT'}'

[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
tingting
[root@localhost ~]# ETT=`pwd`
[root@localhost ~]# echo $ETT
/root
[root@localhost ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@localhost ~]# awk 'BEGIN {print $ETT}'

[root@localhost ~]# awk 'BEGIN {print '$ETT'}'
awk: cmd. line:1: BEGIN {
    
    print /root}
awk: cmd. line:1:               ^ unterminated regexp
awk: cmd. line:1: BEGIN {
    
    print /root}
awk: cmd. line:1:                    ^ unexpected newline or end of string
[root@localhost ~]# awk 'BEGIN {print "'$ETT'"}'
/root
[root@localhost ~]# 

不管变量如何定义、赋值,除了加单引号以外,利用awk直接获取变量的输出,结果都是一样的,因此,在awk取用Shell变量时,我们更多地还是喜欢先用echo加符号输出变量,然后通过管道给awk,进而控制变量的输出结果。

[root@localhost ~]# ETT="oldgirl"
[root@localhost ~]# echo "$ETT"|awk '{print $0}'
oldgirl
[root@localhost ~]# echo '$ETT'|awk '{print $0}'
$ETT
[root@localhost ~]# ETT=`pwd`
[root@localhost ~]# echo "$ETT"|awk '{print $0}'
/root
[root@localhost ~]# echo '$ETT'|awk '{print $0}'
$ETT
[root@localhost ~]# echo $ETT|awk '{print $0}'
/root
[root@localhost ~]# 

这就符合前面给出的普通情况的结论了。

sed指定变量关键字过滤

[root@localhost shell]# echo testchars > sed.log
[root@localhost shell]# cat sed.log 
testchars
[root@localhost shell]# echo oldboy >> sed.log
[root@localhost shell]# cat sed.log 
testchars
oldboy
[root@localhost shell]# sed -n /$OLDBOY/p sed.log
testchars
[root@localhost shell]# echo $OLDBOY
testchars
[root@localhost shell]# sed -n /"$OLDBOY"/p sed.log
testchars
[root@localhost shell]# sed -n /'$OLDBOY'/p sed.log
[root@localhost shell]# 

sed和grep的测试和前面结论是相符的,唯有awk有些特殊。

自定义普通字符串变量的建议

  1. 内容是纯数字、简单的连续字符(内容中不带任何空格)时,定义时可以不加任何引号
  2. 没有特殊情况时,字符串一律用双引号定义赋值,特别是多个字符串中间有空格时
  3. 当变量里的内容需要原样输出时,要用单引号(’’),这样的需求极少

Shell中的特殊位置参数变量

  • $0:获取当前执行的Shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径
  • $n:获取当前执行的Shell脚本的第n个参数值,n=1…9,当n=0时表示脚本的文件名;如果n大于9,则用大括号括起来,例如${10}
  • $#:获取当前执行的Shell脚本后面接的参数总个数
  • $*:获取当前Shell脚本所有传参的参数,不加引号和$@相同;如果加上双引号,则表示所有的参数视为单个字符串,相当于"$1 $2 $3"
  • $@:获取当前Shell脚本所有传参的参数,不加引号和$*相同。如果给$@加上双引号,例如:"$@",则表示将所有的参数视为不同的独立字符串,相当于"$1" "$2" "$3" "$..."

使用$1

[root@localhost shell]# echo 'echo $1' >p.sh
[root@localhost shell]# cat p.sh 
echo $1
[root@localhost shell]# sh p.sh lth
lth
[root@localhost shell]# sh p.sh lth 22
lth
[root@localhost shell]# sh p.sh "lth 22"
lth 22
[root@localhost shell]# 
[root@localhost shell]# echo 'echo $1 $2'>p.sh
[root@localhost shell]# cat p.sh 
echo $1 $2
[root@localhost shell]# sh p.sh longge bingbing
longge bingbing
[root@localhost shell]# sh p.sh "longge bingbing" oldgirl
longge bingbing oldgirl

设置多个参数的小技巧:echo \${1..15}。能发现在位置参数数字大于9之后,输出的内容出现了异常。

[root@localhost shell]# echo \${1..15}
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost shell]# echo \${1..15} >n.sh
[root@localhost shell]# cat n.sh 
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost shell]# vim n.sh 
[root@localhost shell]# cat n.sh 
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[root@localhost shell]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost shell]# sh n.sh (a..z)
-bash: 未预期的符号 `(' 附近有语法错误
[root@localhost shell]# sh n.sh ${a..z}
-bash: ${a..z}: 坏的替换
[root@localhost shell]# sh n.sh {a..z}
a b c d e f g h i a0 a1 a2 a3 a4 a5
[root@localhost shell]# 

当把位置参数数字大于9的加上{}之后,输出的内容正常。

[root@localhost shell]# vim n.sh 
[root@localhost shell]# sh n.sh {a..z}
a b c d e f g h i j k l m n o
[root@localhost shell]# cat n.sh 
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}

创建一个使用了$0的脚本

[root@localhost shell]# echo 'echo $0'>n.sh
[root@localhost shell]# sh n.sh 
n.sh
[root@localhost shell]# sh /u01/learn/shell/n.sh 
/u01/learn/shell/n.sh
[root@localhost shell]# 
[root@localhost shell]# dirname n.sh
.
[root@localhost shell]# dirname /u01/learn/shell/n.sh 
/u01/learn/shell
[root@localhost shell]# basename /u01/learn/shell/n.sh 
n.sh
[root@localhost shell]# 

根据用户输入的变量数来决定是否要打印异常并结束

[root@localhost shell]# cat tl.sh 
#!/bin/bash
#***********************************************
#Author:        luotianhao
#Mail:          [email protected]
#Version:       1.0
#Date:          2021-03-05
#FileName:      tl.sh
#Description:   This is a test script.
#***********************************************
[ $# -ne 2 ] && {
    
    
        echo "must two args"
        exit 1
}
echo oldgirl
[root@localhost shell]# vim tl.sh
[root@localhost shell]# sh tl.sh 
must two args
[root@localhost shell]# sh tl.sh arg1 arg2
oldgirl

if判断语句的写法,注意then跟的位置,如果直接跟在if后中括号后会直接报错

[root@localhost shell]# cat t2.sh 
#!/bin/bash
#***********************************************
#Author:        luotianhao
#Mail:          [email protected]
#Version:       1.0
#Date:          2021-03-05
#FileName:      t2.sh
#Description:   This is a test script.
#***********************************************
if [ $# -ne 2 ] 
then
   echo "USAGE:/bin/bash $0 arg1 arg2" 
   exit 1
fi
echo $1 $2  
[root@localhost shell]# sh t2.sh 
USAGE:/bin/bash t2.sh arg1 arg2
[root@localhost shell]# cat t2.sh 
#!/bin/bash
#***********************************************
#Author:        luotianhao
#Mail:          [email protected]
#Version:       1.0
#Date:          2021-03-05
#FileName:      t2.sh
#Description:   This is a test script.
#***********************************************
if [ $# -ne 2 ] then
   echo "USAGE:/bin/bash $0 arg1 arg2" 
   exit 1
fi
echo $1 $2   
[root@localhost shell]# sh t2.sh 
t2.sh:行12: 未预期的符号 `fi' 附近有语法错误
t2.sh:行12: `fi'

利用set设置位置参数

[root@localhost shell]# set -- "i am" handsome oldboy
[root@localhost shell]# echo $#
3
[root@localhost shell]# echo $1
i am
[root@localhost shell]# echo $2
handsome
[root@localhost shell]# echo $3
oldboy
[root@localhost shell]# echo $*
i am handsome oldboy
[root@localhost shell]# echo $@
i am handsome oldboy
[root@localhost shell]# for i in $*;do echo $i;done
i
am
handsome
oldboy
[root@localhost shell]# for i in $@;do echo $i;done
i
am
handsome
oldboy
[root@localhost shell]# for i in "$*";do echo $i;done
i am handsome oldboy
[root@localhost shell]# for i in "$@";do echo $i;done
i am
handsome
oldboy
[root@localhost shell]# 

Shell特殊状态变量

  • $?:获取上一个指令执行的状态返回值(0为成功,非0为失败)。可用来判断安装软件/打包是否成功
  • $$:获取执行当前Shell脚本的进程号
  • $!:获取上一个在后台工作的进程的进程号
  • $_:获取在此之前执行的命令或脚本的最后一个参数

bash Shell内置命令

  1. echo在屏幕上输出信息,echo参数选项如下:

    • -n 不换行输出内容

    • -e 解析转义字符

      转义字符:

      • \n 换行
      • \r 回车
      • \t tab
      • \b 退格
      • \v 纵向制表符
    [root@localhost shell]# echo oldboy;echo oldgirl
    oldboy
    oldgirl
    [root@localhost shell]# echo -n oldboy;echo oldgirl
    oldboyoldgirl
    [root@localhost shell]# echo "oldboy\toldgirl\noldboy\toldgirl"
    oldboy\toldgirl\noldboy\toldgirl
    [root@localhost shell]# echo -e "oldboy\toldgirl\noldboy\toldgirl"
    oldboy  oldgirl
    oldboy  oldgirl
    [root@localhost shell]# 
    
  2. eval ,当Shell程序执行到eval语句时,Shell读入参数args,并将它们组合成一个新的命令,然后执行

    [root@localhost shell]# echo 'echo \$$#'>noeval.sh
    [root@localhost shell]# sh noeval.sh arg1 arg2
    $2
    [root@localhost shell]# echo 'eval "echo \$$#"'>eval.sh
    [root@localhost shell]# sh eval.sh arg1 arg2
    arg2
    [root@localhost shell]# 
    

Shell变量子串

  1. ${parameter}:返回变量$parameter的内容
  2. ${#parameter}:返回变量$parameter内容的长度(按字符),也适用于特殊变量
  3. ${parameter.offset}:在变量${parameter}中,从位置offset之后开始提取子串到结尾
  4. ${parameter:offset:length}:在变量${parameter}中,从位置offset之后开始提取长度未length的子串
  5. ${parameter#word}:从变量${parameter}开头开始删除最短匹配的word子串
  6. ${parameter##word}:从变量${parameter}开头开始删除最长匹配的word子串
  7. ${parameter%word}:从变量${parameter}结尾开始删除最短匹配的word子串
  8. ${parameter%%word}:从变量${parameter}结尾开始删除最长匹配的word子串
  9. ${parameter/pattern/string}:使用string代替第一个匹配的pattern
  10. ${parameter//pattern/string}:使用string代替所有匹配的pattern

打印变量值的长度:

[root@localhost shell]# OLDBOY="i am oldboy"
[root@localhost shell]# echo $OLDBOY
i am oldboy
[root@localhost shell]# echo ${#OLDBOY}
11
[root@localhost shell]# echo $OLDBOY|wc -L
11
[root@localhost shell]# expr length "$OLDBOY"
11
[root@localhost shell]# echo "$OLDBOY"|awk '{print length($0)}'
11
[root@localhost shell]# 

截取字符串

[root@localhost shell]# OLDBOY="i am oldboy"
[root@localhost shell]# echo $OLDBOY
i am oldboy
[root@localhost shell]# echo ${OLDBOY:2}
am oldboy
[root@localhost shell]# echo ${OLDBOY:2:2}
am
[root@localhost shell]# echo ${OLDBOY}|cut -c 3-4
am

删除最短匹配a*c字符,并输出剩余的字符

a*c表示匹配的字符串,*表示匹配所有,a*c匹配开头为a、中间为任意多个字符、结尾为c的字符串。

[root@localhost shell]# OLDBOY=abcABC123ABCabc
[root@localhost shell]# echo $OLDBOY
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY# a*c}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY#a*c}
ABC123ABCabc
[root@localhost shell]# 

删除最长匹配a*C字符,并输出剩余的字符

[root@localhost shell]# OLDBOY=abcABC123ABCabc
[root@localhost shell]# echo $OLDBOY
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY##a*c}

[root@localhost shell]# echo ${OLDBOY##a*C}
abc
[root@localhost shell]# 

从结尾开始删除最短匹配的子串

[root@localhost shell]# OLDBOY=abcABC123ABCabc
[root@localhost shell]# echo $OLDBOY
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%a*C}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%a*c}
abcABC123ABC
[root@localhost shell]# 

从结尾开始删除最长匹配的子串

[root@localhost shell]# echo ${OLDBOY}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%%a*C}
abcABC123ABCabc
[root@localhost shell]# echo ${OLDBOY%%a*c}

[root@localhost shell]# 

替换指定的字符串

[root@localhost shell]# OLDBOY="i am oldboy,yes,oldboy"
[root@localhost shell]# echo $OLDBOY
i am oldboy,yes,oldboy
[root@localhost shell]# echo ${OLDBOY/oldboy/oldgirl}
i am oldgirl,yes,oldboy
[root@localhost shell]# echo ${OLDBOY//oldboy/oldgirl}
i am oldgirl,yes,oldgirl
[root@localhost shell]# 

实例:批量修改文件名

[root@localhost shell]# echo '1' >stu_102999_1_finished.txt
[root@localhost shell]# echo '2' >stu_102999_2_finished.txt
[root@localhost shell]# echo '3' >stu_102999_3_finished.txt
[root@localhost shell]# echo '4' >stu_102999_4_finished.txt
[root@localhost shell]# ls -l *.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_1_finished.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_2_finished.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_3_finished.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_4_finished.txt
[root@localhost shell]# #>我们先尝试修改一个文件
[root@localhost shell]# F=stu_102999_1_finished.txt
[root@localhost shell]# echo ${F//_finished/}
stu_102999_1.txt
[root@localhost shell]# mv $F $(echo ${F//_finished/})
[root@localhost shell]# ls -l *.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_1.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_2_finished.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_3_finished.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_4_finished.txt
[root@localhost shell]# #>循环批量处理
[root@localhost shell]# for F in $(ls *fin*.txt);do mv $F $(echo ${F//_finished/});done
[root@localhost shell]# ls -l *.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_1.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_2.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_3.txt
-rw-r--r-- 1 root root 2 3月   7 15:59 stu_102999_4.txt

Shell特殊扩展变量

  1. ${parameter:-word}:如果parameter变量值为空或未赋值,则会返回word字符串替代变量的值

    [root@localhost shell]# echo $test
    
    [root@localhost shell]# result=${rest:-UNSET}
    [root@localhost shell]# echo $result
    UNSET
    [root@localhost shell]# echo ${test}
    
    [root@localhost shell]# 
    
  2. ${parameter:=word}:如果parameter变量值为空或未赋值,就设置这个变量值为word,并返回其值。位置变量和特殊便令不适用。这个变量的功能可以解决变量没有定义的问题,并确保没有定义的变量始终有值。

    [root@localhost shell]# unset result
    [root@localhost shell]# echo $result
    
    [root@localhost shell]# echo $test
    oldboy
    [root@localhost shell]# unset test
    [root@localhost shell]# result=${test:=UNSET}
    [root@localhost shell]# echo $result
    UNSET
    [root@localhost shell]# result=${test=UNSET}
    [root@localhost shell]# echo $test
    UNSET
    [root@localhost shell]# 
    
  3. ${parameter:?word}:可以用于设定由于变量未定义而报错的具体内容,如:“not defined”

    [root@localhost shell]# echo ${key:? not defined}
    -bash: key:  not defined
    [root@localhost shell]# echo ${key? not defined}
    -bash: key:  not defined
    [root@localhost shell]# key=1
    [root@localhost shell]# echo ${key:? not defined}
    1
    [root@localhost shell]# echo ${key? not defined}
    1
    [root@localhost shell]# unset key
    [root@localhost shell]# echo ${key? not defined}
    -bash: key:  not defined
    [root@localhost shell]# echo ${key:? not defined}
    
  4. ${parameter:+word}:如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值。

    [root@localhost shell]# oldboy=${oldgirl:+word}
    [root@localhost shell]# echo $oldboy
    
    [root@localhost shell]# oldgirl=19
    [root@localhost shell]# oldboy=${oldgirl:+word}
    [root@localhost shell]# echo $oldboy
    word
    [root@localhost shell]# 
    

猜你喜欢

转载自blog.csdn.net/weixin_43169156/article/details/114501598