shell脚本编程
shell编程基础
本篇文章主要介绍shell编程的基础知识,首先介绍shell脚本的第一行#!(shebang)、shell脚本中的注释、如何设置脚本的权限并运行脚本,然后介绍shell变量的进阶知识和shell的算术表达式,最后介绍shell脚本的退出状态以及如何吊事shell脚本。
shell脚本的第一行“#!”
#!(shebang)是一个由井号“#”和叹号“!”构成的字符序列。它是出现在shell脚本文件第一行的前两个字符。脚本中的#!行(第一行)用于指示一个解释程序。
#!行的语法格式如下:
#! INTERPRETER [OPTION]...
注意:INTERPRETER必须是一个程序的绝对路径。
在Linux系统中,当一个以#!开头的脚本作为一个程序运行时,程序加载器会将脚本第一行“#!”之后的内容解析为一个解释程序,然后用这个指定的解释程序替代改脚本去运行,并将脚本的路径作为第一个参数传递给解释程序。例如,一个脚本的路径名是path/to/script,它的第一行内容如下:
#!/bin/bash
程序加载器被指示用解释程序“/bin/bash”替代其运行,并将路径path/to/script作为第一个参数传递给解释程序“/bin/bash”。
几乎所有的bash脚本的内容都是以“#!/bin/bash”,这可以确保bash作为脚本的解释程序,及时改脚本运行在其他shell下。如果bash脚本中没有指定“#!”行,则会默认使用“/bin/sh”作为解释程序,但还是推荐将bash脚本的第一行设为“#!/bin/bash”。
shell脚本注释
在shell脚本中,井号“#”是注释标识符。如果脚本的某行含有#或以#开头(除了$#),那么这一行或在#之后的所有内容都将被程序忽略,#之后的内容称为注释。
shell脚本的注释用于解释脚本及其相关语句的含义,使这些脚本的源代码更容易理解,也便于对脚本的维护和更新。
来看下面的这个脚本:
#!/bin/bash # A Simple Shell Script To Get Linux Date & Hostname & Network Information # Zhang Renguo - 2025-06-25 echo "Current date : $(date) @ $(hostname)" echo "Network configuration" /sbin/ifconfig -a
在上面的脚本中,第一行#!(Shebang)行。接下来的两行即为注释行:
# A Simple Shell Script To Get Linux Date & Hostname & Network Information # Zhang Renguo - 2025-06-25
在shell脚本中,还可以使用bash的HERE DOCUMENT特性添加多行的注释内容,请看下面的脚本内容:
#!/bin/bash echo "Say something" <<COMMENT comment line 1 comment line 2 comment line n COMMENT echo "Do something else"
在上面的输出中,第3~7行即为注释内容。
实例:如何设置脚本的权限并执行脚本
在运行一个shell脚本之前,需要确保shell脚本文件具有可执行的权限,否则当直接运行脚本时,会得到如下Permission denied的错误信息:
-bash: ./multicomments.sh: 权限不够
如果遇到上述问题,就需要给脚本文件添加可执行的权限。
[root@localhost scripts]# chmod u+x multicomments.sh
如果要给所有用户执行脚本的权限,则使用如下命令:
[root@localhost scripts]# chmod +x multicomments.sh
运行一个shell脚本,使用绝对路径或相对路径两种方式都可以。
使用绝对路径运行shell脚本的方法如下:
[root@localhost scripts]# /scripts/helloworld.sh Hello World
使用相对路径运行shell脚本的方法如下:
[root@localhost ~]# cd /scripts/ [root@localhost scripts]# ./helloworld.sh Hello World
也可以像运行一个命令一样运行一个shell脚本,即不需要指定绝对路径或相对路径,只需要输入脚本名称即可。要实现这个目的,需要将shell脚本所在的目录路径添加到PATH环境变量。例如,将目录路径“/scripts”加入PATH环境变量,可以在任何路径下直接运行目录“/scripts”下的shell脚本:
export PATH=$PATH:/scripts
[root@localhost scripts]# cd /tmp [root@localhost tmp]# helloworld.sh Hello World
shell变量进阶
bash的参数扩展
参数是一个存储数值的实体,并由名称、数字或特定符号所引用。
- 被名称引用的参数称作变量;
- 被数字引用的参数称作为位置参数;
- 被特定符号引用的参数具有特殊的含义和用途,作为bash特殊的内部变量
参数扩展是从引用的实体中取值的过程,就像扩展变量打印它的值。
字符“$”会引导参数扩展,要扩展的参数名或符号可以放在花括号中。花括号虽然是可选的,但是可以保护待扩展的变量,使得紧跟在花括号后面额内容不会被扩展。通过下面的例子来了解一下参数扩展额各种形式:
基本的参数扩展:
$PARAMETER
${PARAMETER}
如果参数名后面还紧跟着其他字符,这是使用花括号{}是必须的,否则紧接在参数名后面的字符串会被解释为参数名的一部分。例如,打印一个单词后跟字母s:
WORD=car echo $WORDs echo ${WORD}s cars

在上面的输出信息中,第一个打印的内容是空的,这是因为参数名WORDs是未定义的。对于不适用花括号的参数扩展,bash会将从字符“$”开始到最后一个有效字符结束的所有可以的字符序列截石位参数名。当使用花括号时,会强制bash直接是花括号内的名称。
另外,对于访问$9之后的位置参数也同样需要使用花括,示例如下:
echo "Argument 1 is: $1" echo "Argument 10 is: ${10}"
注意:参数名是大小写敏感的。
简介参数扩展:
${!PARAMETER}

浙公网安备 33010602011771号