1.关于结束符
单行若为一个独立语句,加或不加结束符都可以,一般使用分号';'作为结束符。
单行若为多个语句,那么必须加入分号“;”作为各个语句的分割符号。
下面案例均为正确写法:
案例1:
#!/bin/bash
girl2='王丹';echo "see ${girl2}";
案例2:
#!/bin/bash
girl2='王丹';
echo "see ${girl2}";
案例3:
#!/bin/bash
girl2='王丹'
echo "see ${girl2}"
2.关于引号
单引号中字符全部认为是字符串,即不识别$符号,不能引用变量。
双引号作为功能引号,内部的$符号被解析为变量引用符号,即双引号内部可以引用变量。
反引号(即键盘上tab按钮上面的符号),内部代码被shell解析器解析为linux命令行代码来执行,然后将返回的数据替换为当前反引号及其内部的内容部分。一般反引号内部的命令实际在linux命令窗口执行时返回什么值,则就直接将这些值放到当前shell脚本对应位置,即不会对返回值外加引号等,不重新进行封装。
如果一个字符串直接出现在脚本文件中,没有带任何引号,那么shell解析器将尽量将其解析为一个适合他所在位置的格式,不报错,如echo hello,echo被解析为关键字,hello被解析为字符串,通常此类情况不是被解析为关键字就是被解析为字符串。
案例:分析:可以看到for循环后面的in,in后面有至少4个参数,其中’列表结束’‘ok‘等不带任何引号,被解析为字符串, `ls /root`的返回值因为是多个用空格分开的文件名,因为在in结构中,会认为是in的多个参数处理,这些文件名都不带引号,因此被认为是字符串处理(此处被解析为字符串更合适,如果某个文件名字为echo,与关键字重名,那么此处为了不报错,那么仍然解析为字符串)。
#!/bin/bash
for str in '下面是/root目录的文件列表:' `ls /root` 列表结束 ok
do
echo $str
done
:<<block
文件执行后输出:
[root@iZ25ja2kaemZ sbin]# ./test.sh
下面是/root目录的文件列表:
15.12.22.sql
20fuwuqi.sql
Amis
apache
apr-1.5.2
apr-1.5.2.tar.gz
apr-1.5.2.tar.gz.1
apr-util-1.5.4
apr-util-1.5.4.tar.gz
download.zip
EOF
httpd-2.4.17
install
mysql-5.7.10
mysql-5.7.10-linux-glibc2.5-x86_64
mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz
mysql_li
mysq.tar.gz
pcre-8.38
pcre-8.38.zip
php5.6.18
php5.6.18.tar.gz
php7.0.1
php7.0.1.tar.gz
php7.0.1test
[root@iZ25ja2kaemZ
[root@localhost
列表结束
ok
block