shell编程方括号两边必须有(关于shell的问题)

本文目录
- 关于shell的问题
- shell 编程问题
- shell 条件判断怎么将多个判断条件按照优先顺序执行 类似于java中的()的作用
- LINUX简单填空先给50分,答对加分3Q啦
- Shell编码中syntax error at line 19: `if’ unmatched
- Shell中的括号、双括号、方括号和双方括号
- 如何使用Linux shell编程来进行系统管理和网络管理
- Shell 脚本中空格的使用
关于shell的问题
if;
改为:
if
或者:
if
注意空格,与方括号之间要有空格,操作符两边也要有。
另外,分号在shell中表示一个语句的结束,多个语句写在一行可以用分号隔开。这里可以不要,写了也不算错。
elif;
这个记得也改过来。
shell 编程问题
把if;改成
if;
在使用方括号比较时,要注意在条件两边加上空格。
(PS:LS的问答没有一个是正确的)
shell 条件判断怎么将多个判断条件按照优先顺序执行 类似于java中的()的作用
bash shell 中使用圆括号做命令分组,产生子进程,效率差一点:
( ) && ( echo yes )
注意方括号两端开始和结尾都必须有空格。
zsh shell 中使用花括号或者圆括号,做命令分组:
{ } && { echo yes }
LINUX简单填空先给50分,答对加分3Q啦
看这里都有
Linux面试题与答案
一.填空题:
1. 在Linux系统中,以 文件 方式访问设备 。
2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。
3. Linux文件系统中每个文件用 i节点 来标识。
4. 全部磁盘块由四个部分组成,分别为引导块 、专用块 、 i节点表块 和数据存储块。
5. 链接分为: 硬链接 和 符号链接 。
6. 超级块包含了i节点表 和 空闲块表 等重要的文件系统信息。
7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八进制数为: 644 ,该文件属性是 目录 。
8. 前台起动的进程使用 Ctrl+c 终止。
9. 静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。
10. 网络管理的重要任务是: 控制 和 监控 。
11. 安装Linux系统对硬盘分区时,必须有两种分区类型: 文件系统分区 和 交换分区 。
13. 编写的Shell程序运行前必须赋予该脚本文件 执行 权限。
14. 系统管理的任务之一是能够在 分布式 环境中实现对程序和数据的安全保护、备份、恢复和更新。
15. 系统交换分区是作为系统 虚拟存储器 的一块区域。
16. 内核分为 进程管理系统 、 内存管理系统 、 I/O管理系统 和文件管理系统 等四个子系统。
17. 内核配置是系统管理员在改变系统配置 硬件 时要进行的重要操作。
18. 在安装Linux系统中,使用netconfig程序对网络进行配置,该安装程序会一步步提示用户输入主机名、域名、域名服务器、IP地址、 网关地址 和 子网掩码 等必要信息。
19. 唯一标识每一个用户的是用户 ID 和用户名。
20 . RIP 协议是最为普遍的一种内部协议,一般称为动态路由信息协议。
21. 在Linux系统中所有内容都被表示为文件,组织文件的各种方法称为 文件系统 。
22. DHCP可以实现动态 IP 地址分配。
23. 系统网络管理员的管理对象是服务器、 用户 和服务器的进程 以及系统的各种资源。
24. 网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的中心。
25. 当想删除本系统用不上的 设备驱动程序 时必须编译内核,当内核不支持系统上的 设备驱动程序 时,必须对内核 升级 。
26 Ping命令可以测试网络中本机系统是否能到达 一台远程主机 ,所以常常用于测试网络的 连通性 。
27. vi器具有两种工作模式: 命令模式 和 输入模式 。
28. 可以用ls –al命令来观察文件的权限,每个文件的权限都用10位表示,并分为四段,其中第一段占 1 位,表示 文件类型 ,第二段占3位,表示 文件所有者 对该文件的权限。
29. 进程与程序的区别在于其动态性,动态的产生和终止,从产生到终止进程可以具有的基本状态为: 运行态 、 就绪态 和 等待态(阻塞态) 。
30. DNS实际上是分布在internet上的主机信息的数据库,其作用是实现 IP地址和主机名 之间的转换。
31. Apache是实现WWW服务器功能的应用程序,即通常所说的“浏览web服务器”,在服务器端 为用户提供浏览 web服务 的就是apache应用程序。
32. 在Linux系统上做备份可以有两种类型:系统备份 和 用户备份 。其中前者是指对 操作系统 的备份,后者是指对 应用程序和用户文件的备份。
33. CD-ROM标准的文件系统类型是 iso9660 。
34. 当lilo.conf配置完毕后,使之生效,应运行的命令及参数是 lilo 。
35. 在使用ls命令时,用八进制形式显示非打印字符应使用参数 -b 。
36. Linux使用支持Windows 9.x/2000长文件名的文件系统的类型是 vfat 。
37. 设定限制用户使用磁盘空间的命令是 quota 。
38 在Linux系统中,用来存放系统所需要的配置文件和子目录的目录是 /etc 。
39. 硬连接只能建立对 文件 链接。符号链接可以跨不同文件系统创建。
40. 套接字文件的属性位是 s 。
41. 结束后台进程的命令是 kill 。
42. 进程的运行有两种方式,即 独立运行和使用父进程运行 。
43. Links分为 硬链接和符号链接 。
44. 在超级用户下显示Linux系统中正在运行的全部进程,应使用的命令及参数是 ps -aux 。
45. 管道文件的属性位是 p 。
46. 将前一个命令的标准输出作为后一个命令的标准输入,称之为 管道 。
47. 为脚本程序指定执行权的命令及参数是 chmod a+x filename 。
48. 进行远程登录的命令是 telnet 。
49. 欲发送10个分组报文测试与主机abc.tuu.edu.cn的连通性,应使用的命令和参数是: ping abc.tuu.edu.cn –c 10 。
50. DNS服务器的进程命名为named,当其启动时,自动装载 /etc目录下的 named.conf 文件中定义的DNS分区数据库文件。
***隐藏网址***
52.在 Linux系统中,压缩文件后生成后缀为.gz文件的命令是 gzip 。
53. 在用vi文件时,将文件内容存入test.txt文件中,应在命令模式下键入 :w test.txt 。
54 可以在标准输出上显示整年日历的命令及参数是 cal -y 。
55. 在shell编程时,使用方括号表示测试条件的规则是:方括号两边必须有 空格 。
56. 检查已安装的文件系统/dev/had5是否正常,若检查有错,则自动修复,其命令及参数是 fsck –a /dev/had5 。
57. 在Windows9.x环境下共享Unix/Linux中的用户目录的一个工具是 Samba服务器 。
58. 系统管理员的职责是进行系统资源管理、系统性能管理、设备管理、安全管理和 系统性能监测 。
59 在Linux系统中,测试DNS服务器是否能够正确解析域名的的客户端命令,使用命令 nslookup 。
60. 在Linux系统下,第二个IDE通道的硬盘(从盘)被标识为 hdb 。
61. 当系统管理员需升级内核版本和改变系统硬件配置时,应 重新编译内核 。
62. 如果只是要修改系统的IP地址,应修改 /etc/rc.d/rc.inet1 配置文件。
63. 当LAN内没有条件建立DNS服务器,但又想让局域网内的用户可以使用计算机名互相访问时,应配置 /etc/hosts 文件。
64. 在vi环境下,使用 Esc键 进行模式转换。
65. Slackware Linux 9.0通常使用 ext3 文件系统,系统的全部磁盘块由 四 部分组成。
66. 将/home/stud1/wang目录做归档压缩,压缩后生成wang.tar.gz文件,并将此文件保存到/home目录下,实现此任务的tar命令格式 tar zcvf /home/wang.tar.gz /home/stud1/wang 。
67. 管道就是将前一个命令的 标准输出 作为后一个命令的 标准输入 。
68. 在使用手工的方法配置网络时,可通过修改 /etc/HOSTNAME 文件来改变主机名,若要配置该计算机的域名解析客户端,需配置 /etc/resolv.conf 文件。
69. 启动进程有手动启动和调度启动两种方法,其中调度启动常用的命令为 at 、 batch 和 crontab 。
70. test.bns.com.cn的域名是 bns.com.cn ,如果要配置一域名服务器,应在 named.conf 文件中定义DNS数据库的工作目录。
71. Sendmail邮件系统使用的两个主要协议是: SMTP 和 POP ,前者用来发送邮件,后者用来接收邮件。
72. DHCP是动态主机配置协议的简称,其作用是:为网络中的主机分配IP地址 。
73. 目前代理服务器使用的软件包有很多种,教材中使用的是 squid 。
74. rm命令可删除文件或目录,其主要差别就是是否使用递归开关 -r或-R 。
75. mv 命令可以移动文件和目录,还可以为文件和目录重新命名。
76. 路由选择协议(RIP)的跳数表示到达目的地之前必须通过的 网关 数,RIP接受的最长距离是 15跳 。
77. ping命令用于测试网络的连通性,ping命令通过 ICMP 协议(internet控制信息协议)来实现。
78. nfs 协议用于实现Unix(/linux)主机之间的文件系统共享。
79. 在Linux操作系统中,设备都是通过特殊的 文件 来访问。
80. shell不仅是 用户命令的解释器 ,它同时也是一种功能强大的编程语言。 bash是Linux的缺省shell。
81. 用 》;》; 符号将输出重定向内容附加在原文的后面。
82. 增加一个用户的命令是:adduser 或useradd 。
83 进行字符串查找,使用grep命令。
84. 使用 * 每次匹配若干个字符。
85. /sbin 目录用来存放系统管理员使用的管理程序。
Shell编码中syntax error at line 19: `if’ unmatched
在if 后面的那对中括号两边加上空格, 正反中括号两边都加。 等号两边也要有空格
if ;
Shell中的括号、双括号、方括号和双方括号
首先在Shell中,括号表示条件测试方法。主要用在if-then、case等需要条件判断的语句结构中。
最近在看bash,括号搞的我一头雾水,所以总结一下,理清思路!
如何使用Linux shell编程来进行系统管理和网络管理
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。
Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。
利用vi等文本器编写Shell脚本的格式是固定的,如下:
#!/bin/sh
#comments
Your commands go here
首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。
完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:
chmod +x filename.sh
执行脚本的方法是:
./filename.sh
下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。
#!/bin/sh
#print hello world in the console window
a = "hello world"
echo $a
Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:
variable_name = variable_value
如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:
echo "Hi, $as"
就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:
echo "Hi, ${a}s"
单引号中的变量不会进行变量替换操作。
关于变量,还需要知道几个与其相关的Linux命令。
env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。
下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。
1 #!/bin/bash
2 # we have less than 3 arguments. Print the help text:
3 if ; then
4 cat《《HELP
5 ren -- renames a number of files using sed regular expressions
6
7 USAGE: ren ’regexp’ ’replacement’ files
8 EXAMPLE: rename all *.HTM files in *.html:
9 ren ’HTM$’ ’html’ *.HTM
10
11 HELP
12 exit 0
13 fi
14 OLD="$1"
15 NEW="$2"
16 # The shift command removes one argument from the list of
17 # command line arguments.
18 shift
19 shift
20 # $* contains now all the files:
21 for file in $*; do
22 if ; then
23 newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
24 if ; then
25 echo "ERROR: $newfile exists already"
26 else
27 echo "renaming $file to $newfile "
28 mv "$file" "$newfile"
29 fi
30 fi
31 done
我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:
if …; then
…
elif …; then
…
else
…
fi
与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的表示条件测试,常用的条件测试有下面几种:
判断$file是否是一个文件
判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
判断$file是否存在且有可执行权限,同样-r测试文件可读性
判断变量$a是否有值,测试空串用-z
判断$a和$b的取值是否相等
判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立
要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。
$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。
现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以《《开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。
第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。
十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。
然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:
while …; do
…
done
for var in …; do
…
done
for (( cond1; cond2; cond3 )) do
…
done
until …; do
…
done
在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。
通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。
第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:
case var in
pattern 1 )
… ;;
pattern 2 )
… ;;
*)
… ;;
esac
我们再就下面一个例子,看看case语句的用法。
while getopts vc: OPTION
do
case $OPTION in
c) COPIES=$OPTARG
ehco "$COPIES";;
v) echo "suyang";;
\?) exit 1;;
esac
done
上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:
getopts option_string variable
option_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把 变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号 后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。
上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入"?指定的部分,退出脚本程序。
第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:
select var in …; do
break;
done
例如,下面这段程序的输出是:
#!/bin/bash
echo "Your choice?"
select var in "a" "b" "c"; do
break
done
echo $var
----------------------------
Your choice?
1) a
2) b
3) c
第三,Shell Script中也可以使用自定义的函数,其语法形式如下:
functionname()
{
…
}
例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。
第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。
sh ?x filename.sh
这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。
Shell 脚本中空格的使用
学 Kali 渗透的时候 Shell 脚本差点把我搞疯了,不停报错。因刚刚接触 Linux 和 Shell,没有系统学过,所以很多报错都不知道怎么回事。
对着视频敲脚本,视频中空格有没有也不怎么看得出来,没想到是空格的问题。后来查才发现 Shell 对空格有特别严格的要求。
参考: shell脚本中空格的注意问题
1. =
赋值时:两边不能有空格
i=1
i=$((i+1))
比较时:两边必须有空格
if
2. if
整数比较时:中括号前后必须有空格
if
参考: Linux#Shell#if ;then 是什么意思?
看来双括号还有问题…再学吧…
1. 变量名、等号、值之间不能有空格
2. 变量的引用是用 $ 符号加上变量名
echo ${a}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,建议给所有变量加上花括号,这是个好习惯,既便于阅读,又不易出错。

更多文章:
跷二郎腿太低好吗?想要通过贴墙站改正二郎腿影响的话,有哪些要点需要注意
2026年10月11日 05:10
易语言点击js按钮(易语言网页填表怎样点击链接为“javascript:void(0)“的按钮)
2026年10月11日 03:00
compare with造句(用compared with和compared to造句)
2026年10月10日 23:30
tensorflow与keras对应版本(为什么tensorflow2.8没有keras)
2026年10月10日 22:10
maven仓库jar网站(如何在maven仓库中添加jar包)
2026年10月10日 19:50






