第一章 shell编程

shell的变量分为两种环境变量和本地变量

查看环境变量 env:

打印环境变量:printenv

本地变量:

新建本地变量:

diner='eqewqeqe'

注意:新建本地变量是,等行前后不能加空格,要不然会出错。

查看本地变量:

set | grep "diner"

本地变量导入到环境变量:

export diner
env | grep "diner"

定义环境变量:

export eee=‘ddd’

删除一个已定义的环境变量或者本地变量

unset diner

查看当前的shell类型:

扫描二维码关注公众号,回复: 3519154 查看本文章
echo $SHELL

shell 中取值时需要加$:

diner=aaa
echo $diner

输出结果为aaa。

也可以用大括号${diner} == $diner

VAR=45
echo $VAR+3

这个显示结果是:

45+3

实际上,VAR是一个字符串。

通配符

*   匹配0个或多个任意字符
?   匹配一个任意字符
[若干字符]  匹配方括号中任意一个字符的一次出现。

命令代换:`或 $()

由'`'反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。例如定义一个变量存放date命令的输出:

DATE=`date`
echo $DATE

命令代换也可以用$()表示:

 DATE=$(date)

算术代换:$(())

用于算术计算,$(())中的Shell变量取值将转换成整数,同样含义的$[]等价例如:

 VAR=45
 echo $(($VAR+3))
$(())中只能用+-*/和()运算符,并且只能做整数运算。

$[base#n],其中base表示进制,n按照base进制解释,后面再有运算数,按十进制解释。

echo $[2#10+11]
echo $[8#10+11]
echo $[10#10+11]

转义字符\

和C语言类似,\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值。例如:

echo $SHELL
/bin/bash
echo \$SHELL
$SHELL
echo \\
\

比如创建一个文件名为“$ $”的文件可以这样:

touch \$\ \$

还有一个字符虽然不具有特殊含义,但是要用它做文件名也很麻烦,就是-号。如果要创建一个文件名以-号开头的文件,这样是不行的:

touch -hello
touch: invalid option -- h
Try `touch --help' for more information.

即使加上\转义也还是报错:

touch \-hello
touch: invalid option -- h
Try `touch --help' for more information.

因为各种UNIX命令都把-号开头的命令行参数当作命令的选项,而不会当作文件名。如果非要处理以-号开头的文件名,可以有两种办法:

touch ./-hello

或者

touch -- -hello

\还有一种用法,在\后敲回车表示续行,Shell并不会立刻执行命令,而是把光标移到下一行,给出一个续行提示符>,等待用户继续输入,最后把所有的续行接到一起当作一个命令执行。例如:

ls \
> -l
(ls -l命令的输出)

单引号

和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界定符(双引号下一节介绍),而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对就输入回车,Shell会给出续行提示符,要求用户把引号配上对。例如:

echo '$SHELL'
$SHELL
echo 'ABC\(回车)
> DE'(再按一次回车结束命令)
ABC\
DE

双引号

被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引号的处理方式不同

DATE=$(date)
echo "$DATE"
echo '$DATE'

Shell脚本语法

条件测试:test [

命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与C语言的逻辑表示正好相反)。例如测试两个数的大小关系:

var=2
test $var -gt 1
echo $?

返回值为真,为0。

test $var -gt 3
echo $?

返回值为1;为假。

[ $var -gt 3 ]
echo $?

返回值为假。

虽然看起来很奇怪,但左方括号[确实是一个命令的名字,传给命令的各参数之间应该用空格隔开,比如,$VAR、-gt、3、]是[命令的四个参数,它们之间必须用空格隔开。命令test或[的参数形式是相同的,只不过test命令不需要]参数。以[命令为例,常见的测试命令如下表所示:

[ -d DIR ]              如果DIR存在并且是一个目录则为真

[ -f FILE ]             如果FILE存在且是一个普通文件则为真

[ -z STRING ]           如果STRING的长度为零则为真

[ -n STRING ]           如果STRING的长度非零则为真

[  $STRING1 =$ STRING2 ]   如果两个字符串相同则为真

[ $STRING1 !=$ STRING2 ]  如果字符串不相同则为真

[ $ARG1 OP $ARG2 ]        ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)之中的一个

和C语言类似,测试条件之间还可以做与、或、非逻辑运算:

带与、或、非的测试命令

[ ! EXPR ]          EXPR可以是上表中的任意一种测试条件,!表示逻辑反
[ EXPR1 -a EXPR2 ]  EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示逻辑与
[ EXPR1 -o EXPR2 ]  EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示逻辑或
$ VAR=abc
$ [ -d Desktop -a $VAR = 'abc' ]
$ echo $?
0

注意,如果上例中的$VAR变量事先没有定义,则被Shell展开为空字符串,会造成测试条件的语法错误(展开为[ -d Desktop -a = 'abc' ]),作为一种好的Shell编程习惯,应该总是把变量取值放在双引号之中(展开为[ -d Desktop -a "" = 'abc' ]):

$ unset VAR
$ [ -d Desktop -a $VAR = 'abc' ]
bash: [: too many arguments
$ [ -d Desktop -a "$VAR" = 'abc' ]
$ echo $?
1

猜你喜欢

转载自blog.csdn.net/m0_38036750/article/details/81454492