在Linux系统中,.sh文件是Shell脚本文件,通过编写一系列Shell命令并保存为.sh文件,可以实现对Linux系统的自动化操作和任务管理,创建.sh文件是Linux系统管理中的一项基础技能,下面将详细介绍从文件创建到脚本执行的全过程,包括文件编写、权限设置、常见语法及注意事项等内容。

创建.sh文件的基本步骤
使用文本编辑器创建文件
Linux系统中常用的文本编辑器有vim、nano、gedit等,可根据个人习惯选择,以下是使用不同编辑器创建.sh文件的具体操作:
- 
使用vim创建
vim是Linux中最常用的命令行文本编辑器,功能强大但需一定学习成本,打开终端,输入以下命令创建并编辑脚本文件(例如命名为test.sh):vim test.sh
进入vim后,默认为“命令模式”,按
i键切换到“插入模式”,此时可输入脚本内容,编写完成后,按Esc键返回命令模式,输入wq保存并退出(q!为不保存退出)。 - 
使用nano创建
nano是更简单的命令行编辑器,适合新手,输入以下命令:nano test.sh
进入编辑界面后,可直接输入内容,编辑完成后按
Ctrl+X,根据提示按Y保存,按Enter确认文件名。 - 
使用gedit创建(图形界面)
如果系统安装了图形界面,可使用gedit等图形编辑器:gedit test.sh
在打开的窗口中编写脚本,保存后直接退出即可。
 
编写脚本内容
.sh文件的本质是文本文件,内容由Shell命令组成,一个规范的Shell脚本通常包含以下部分:
- Shebang行:脚本的第一行必须以
#!/bin/bash开头(或#!/bin/sh),用于指定解释器(此处为Bash Shell),告诉系统使用哪个程序来执行脚本。 - 注释行:以开头的行是注释,用于说明脚本功能、参数、作者等信息,可提高脚本的可读性。
 - 可执行语句:由Shell命令、变量、条件判断、循环等组成的实际操作代码。
 
示例:简单的Hello World脚本
#!/bin/bash # 这是一个简单的Shell脚本,用于输出"Hello, World!" echo "Hello, World!"
echo是Shell内置命令,用于输出文本内容。
Shell脚本的基本语法
变量定义与使用
Shell脚本中无需声明变量类型,直接用变量名=值定义(注意等号两侧不能有空格),使用变量时需在变量名前加,或用${变量名}避免歧义。  
示例
#!/bin/bash
name="Linux"
echo "Hello, $name!"      # 输出:Hello, Linux!
echo "Current user: ${USER}"  # 输出当前用户名
条件判断
通过if-else语句实现条件判断,格式为:  
if [ 条件表达式 ]; then
    执行命令1
else
    执行命令2
fi
条件表达式常用测试操作符:
-eq:等于(数值比较)-ne:不等于(数值比较)-lt:小于(数值比较)-gt:大于(数值比较)-f:判断文件是否存在-d:判断目录是否存在
示例:判断文件是否存在

#!/bin/bash
file="test.txt"
if [ -f "$file" ]; then
    echo "文件 $file 存在"
else
    echo "文件 $file 不存在"
fi
循环结构
- 
for循环:遍历列表或文件名
# 遍历1到5 for i in {1..5}; do echo "Number: $i" done # 遍历当前目录下的.sh文件 for file in *.sh; do echo "Found script: $file" done - 
while循环:根据条件重复执行
# 输出1到5 count=1 while [ $count -le 5 ]; do echo "Count: $count" ((count++)) done 
函数定义
通过函数名()定义函数,函数名调用,参数通过$1, $2传递($0为脚本名)。  
示例
#!/bin/bash
# 定义函数
hello() {
    echo "Hello, $1! Welcome to $2."
}
# 调用函数,传递参数
hello "User" "Linux"
设置.sh文件的可执行权限
Linux系统中,默认情况下.sh文件没有执行权限,需通过chmod命令添加权限。  
权限类型
Linux文件权限分为三类:
- 用户(Owner):文件所有者的权限
 - 组(Group):文件所属组的权限
 - 其他(Others):其他用户的权限
 
每类权限包含:
r(读,4):可查看文件内容w(写,2):可修改文件内容x(执行,1):可执行文件
常用chmod命令
- 
添加可执行权限:
chmod +x test.sh
此命令为文件所有者、所属组、其他用户均添加可执行权限(保留原有读写权限)。
 - 
设置数字权限:
通过数字组合设置权限,例如755表示:- 所有者:7(rwx,读+写+执行)
 - 所属组:5(r-x,读+执行)
 - 其他用户:5(r-x,读+执行)
chmod 755 test.sh
 
 - 
仅所有者可执行:
chmod 700 test.sh
 
权限设置的意义
对于Shell脚本,通常设置755权限,确保所有者可读写执行,其他用户可读和执行,便于脚本在需要时被其他用户调用,若仅个人使用,可设置700权限。
执行.sh文件
直接执行(需可执行权限)
在脚本所在目录下,通过./文件名执行(表示当前目录):  
./test.sh
如果不在脚本所在目录,需使用绝对路径(如/home/user/test.sh)或相对路径(如../test.sh)。
通过解释器执行(无需可执行权限)
若脚本未设置可执行权限,可直接调用Bash解释器执行:

bash test.sh # 或 sh test.sh
此方式不会使用脚本中的Shebang行,而是直接使用指定的解释器。
在当前Shell中执行
使用source或命令执行脚本,脚本中的变量和函数会直接生效到当前Shell环境:  
source test.sh # 或 . test.sh
常用于加载环境配置文件(如.bashrc)。
常见错误与调试
权限不足
错误提示:Permission denied
解决方法:使用chmod +x test.sh添加可执行权限。
Shebang行错误
错误提示:bad interpreter: No such file or directory
原因:Shebang行中的解释器路径错误(如系统中Bash实际路径为/usr/bin/bash,但Shebang写为/bin/bash)。
解决方法:通过which bash查看Bash实际路径,修正Shebang行。
语法错误
错误提示:syntax error: unexpected end of file(缺少fi或done)
解决方法:检查脚本中的if-else、for、while等结构是否闭合,可通过bash -n test.sh检查语法(不执行,仅检查语法)。
变量未定义
错误提示:command not found(变量名未加)
解决方法:使用变量时确保添加符号,如$name而非name。
进阶技巧
脚本参数传递
通过$1, $2, ...获取脚本执行时的参数,表示参数个数,表示所有参数(作为一个字符串),表示所有参数(作为多个字符串)。  
示例
#!/bin/bash echo "Script name: $0" echo "Total arguments: $#" echo "First argument: $1" echo "All arguments: $@"
执行:./test.sh arg1 arg2 arg3,输出:  
Script name: ./test.sh
Total arguments: 3
First argument: arg1
All arguments: arg1 arg2 arg3
重定向与管道
- 输入重定向:
<,从文件读取输入(如sort < numbers.txt)。 - 输出重定向:
>(覆盖)、>>(追加),将命令输出保存到文件(如echo "Hello" > output.txt)。 - 管道:,将前一个命令的输出作为后一个命令的输入(如
ls -l | grep ".sh")。 
创建.sh文件是Linux自动化操作的核心技能,需掌握文件创建、脚本编写、权限设置、执行方式及常见语法,通过合理利用变量、条件判断、循环和函数,可编写功能强大的脚本,简化重复性操作,在实际使用中,注意权限管理和错误调试,确保脚本的稳定性和安全性。
相关问答FAQs
问题1:为什么.sh文件用bash ./filename.sh可以执行,但./filename.sh提示“Permission denied”?
解答:bash ./filename.sh是通过显式调用Bash解释器执行脚本,无需脚本本身具有可执行权限;而./filename.sh要求脚本文件具有可执行权限(x位),解决方法是使用chmod +x filename.sh为脚本添加可执行权限,或使用sh filename.sh(同样无需可执行权限)。
问题2:.sh文件中的#!/bin/bash有什么作用?如果系统中没有/bin/bash会怎样?
解答:#!/bin/bash是Shebang行,用于指定脚本的解释器,当系统执行脚本时,会读取该行并调用指定的解释器(此处为Bash)来执行脚本内容,如果系统中没有/bin/bash,执行时会提示“bad interpreter: No such file or directory”,此时可通过which bash查看Bash的实际路径(如/usr/bin/bash),并修正Shebang行为#!/usr/bin/bash。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/26163.html