shell-基础

一、变量的定义,中间没有空格

a=1
b="123"

变量的引用,多数情况下可以去掉{},{}用于区分变量的边界。
${a}
${b}
#举例
num=2 
echo "this is the $numnd"    #this is the //因为没有定义变量,找不到变量边界
echo "this is the ${num}nd"  #this is the 2nd
字符串中对变量的引用
#如果在某个字符传中引用已定义的变量,此字符串必须是双引号hell="123${a}"
#!/bin/bash
url="http://c.biancheng.net"
website1='C语言中文网:${url}'
website2="C语言中文网:${url}"
echo $website1
echo $website2
运行结果:
C语言中文网:${url}
C语言中文网:http://c.biancheng.net

总结

单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。
双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。

shell中所有的类型默认都是字符串类型,所以不手工指定变量类型是不能进行数值运算,注意这里指的是数值运算,具体如何数值运算,参见:

https://blog.mimvp.com/article/5994.html

二、反引号(``)

# echo The date and time is `date`
The date and time is 三 6月 15 06:10:35 CST 2005
# echo Your current working directory is $(pwd)
Your current working directory is /home/howard/script.

总结

shell能够将一个命令的标准输出插在一个命令行中任何位置
shell中有两种方法作命令替换:把shell命令用反引号/或者$(...)结构括起来,其中$(...)格式受到POSIX标准支持,也利于嵌套。

三、加不加分号的区别

#单行语句一般要用到分号来区分代码块
/#该代码若写作多行,用换行符来区分代码块,则无需用到分号

写法一:
if [ "$PS1" ]; then echo test is ok; fi
写法二:
if [ "PS1" ]
  then echo "test is ok"
fi
写法三(推荐写法):
if [ command ]; then
   符合该条件执行的语句
fi


if [ command ];then
   符合该条件执行的语句
elif [ command ];then
   符合该条件执行的语句
else
   符合该条件执行的语句
fi


注意事项:
1、[  ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
4、判断是不支持浮点值的
5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
6、在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
7、使用-z或者-n来检查长度的时候,没有定义的变量也为0
8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
9、? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

四、shell中echo单引号,双引号,不加引号的区别

https://www.cnblogs.com/dazhuwang/p/13203248.html

#声明变量 VAR01 并用echo打印出来,第一次直接打印,第二次用双引号括起来,从内容看好像没什么区别
[root@localhost ~]# VAR01=100
[root@localhost ~]# echo $VAR01
100
[root@localhost ~]# echo "$VAR01"
100
#声明变量 VAR02 内容为字符串,ABC 之间有多个空格
[root@localhost ~]# VAR02="A   B   C"
#直接打印变量时,输出内容只保留了每个字幕间一个空格
[root@localhost ~]# echo $VAR02
A B C
#使用双引号括起的输出内容和变量定义时的内容是完全一致的
[root@localhost ~]# echo "$VAR02"
A   B   C

五、定义变量时单引号,双引号,不加引号的区别

shell中定义变量用双引号和单引号以及不用引号的区别

单引号
所见即所得,即输出时会将单引号内的所有內容都原样输出,或者描述为单引号里面看到的是什么就会输出什么,这称为强引用

双引号 (默认)
输出双引号内的所有内容;如果内容中有命令(要反引下)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容,推荐使用,这称为弱引用

无引号 赋值时,如果变量内容中有空格,则会造成赋值不完整。而在输出内容时,会将含有空格的字符串视为一个整体来输出;如果内容中有命令(要反引下)、变量等,则会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要双引号替代无引号的情况,特别是对变量赋值时改加双引号。一般连续的字符串、数字、路径等可以不加任何引号进行赋值和输输出,不过最好是用用双引号赋值

反引号
一般用于引用命令,执行的时候命令会被执行,相当于S0,赋值和输出都要用“将命令引起来

a= demo
b='b- $a'
c="b- $a"
echo $a
echo $b
echo $c


demo
b- $a
b- demo

总结起来,字符串变量的定义全部加上双引号

posted @ 2020-10-23 15:32  hostid  阅读(110)  评论(0编辑  收藏  举报