Shell
一、Shell脚本入门
1、脚本格式
脚本以#!/bin/bash
开头(指定解析器)
2、编写脚本
1 | [root@yxl100 ~]# mkdir scripts |
1 | !/bin/bash |
3、运行脚本
(1)没改权限之前
1 | [root@yxl100 scripts]# sh ./hello.sh |
(2)修改权限之后
1 | [root@yxl100 scripts]# chmod +x hello.sh |
二、变量
1、系统变量
变量 | 描述 | 示例 |
---|---|---|
$HOME |
当前用户的主目录路径 | /home/username |
$USER |
当前用户的用户名 | username |
$PATH |
可执行文件的搜索路径 | /usr/local/bin:/usr/bin |
$SHELL |
当前Shell的路径 | /bin/bash |
$PWD |
当前工作目录的路径 | /home/username/projects |
$OLDPWD |
上一次工作目录的路径 | /home/username |
$HOSTNAME |
当前主机的名称 | my-computer |
$LANG |
当前语言设置 | en_US.UTF-8 |
$0 |
当前脚本的名称或路径 | script.sh 或 ./script.sh |
$1 到 $9 |
脚本接收的第1到第9个参数 | |
$# |
传递给脚本的参数个数 | 3 |
$* |
传递给脚本的所有参数作为一个字符串 | "arg1 arg2 arg3" |
$$$$ | 当前Shell进程的PID | 12345 |
$? |
上一个命令的退出状态 | 0 表示成功,非0表示失败 |
$@ |
传递给脚本的所有参数,每个参数独立显示 | "arg1" "arg2" "arg3" |
2、自定义变量
操作/规则 | 命令/说明 | 示例 |
---|---|---|
定义变量 | 变量名=变量值 | A=5 |
打印变量 | 使用 $ 符号引用变量值 |
echo $A 输出 5 |
撤销变量 | 使用 unset 命令撤销变量 |
unset A |
声明静态变量 | 使用 readonly 命令声明静态变量,不能修改和撤销 |
readonly B=2 |
空格处理 | 如果变量的值中有空格,需要使用双引号或单引号括起来 | D="I love banzhang" |
变量默认类型 | Bash 中变量默认是字符串类型,无法直接进行数值运算 | C=1+2 echo $C 输出 1+2 |
变量名称 | 变量名称可由字母、数字和下划线组成,但不能以数字开头。环境变量名建议大写 | 例如:MY_VAR=10 |
等号两侧不能有空格 | 赋值时等号两侧不能有空格 | 正确:A=5 ,错误:A = 5 |
全局环境变量 | 使用 export 命令将变量提升为全局环境变量 |
export B |
三、运算符
操作/语法 | 说明 | 示例 |
---|---|---|
算术运算符 | 进行整数运算 | + - * / % ++ -- |
使用 $((运算式)) | 计算并返回运算结果 | result=$((2 + 3)) |
使用 $[运算式] | 计算并返回运算结果 | result=$[2 + 3] |
变量与运算结合 | 可以将变量与算术表达式结合使用 | a=5; result=$((a * 2)) |
嵌套运算 | 支持嵌套运算 | result=$(( (2 + 3) * 4 )) |
注意事项 | 运算符之间需要有空格,以确保正确解析 | 正确:result=$(( 2 + 3 )) |
1 | [root@yxl100 scripts]# echo $[1+2] |
四、条件判断
操作/语法 | 说明 | 示例 |
---|---|---|
基本语法 | ||
test condition |
使用 test 命令进行条件判断 |
test 5 -eq 5 |
[ condition ] |
使用 [] 进行条件判断,condition 前后需有空格 |
[ 5 -eq 5 ] |
整数比较 | 使用算术运算符进行整数比较 | |
-eq |
等于(equal) | [ 5 -eq 5 ] |
-ne |
不等于(not equal) | [ 5 -ne 3 ] |
-lt |
小于(less than) | [ 3 -lt 5 ] |
-le |
小于等于(less equal) | [ 5 -le 5 ] |
-gt |
大于(greater than) | [ 5 -gt 3 ] |
-ge |
大于等于(greater equal) | [ 5 -ge 5 ] |
字符串比较 | 字符串之间的相等或不等比较 | |
= |
判断字符串是否相等 | [ "abc" = "abc" ] |
!= |
判断字符串是否不等 | [ "abc" != "def" ] |
文件权限判断 | 根据文件权限进行判断 | |
-r |
是否具有读权限(read) | [ -r filename ] |
-w |
是否具有写权限(write) | [ -w filename ] |
-x |
是否具有执行权限(execute) | [ -x filename ] |
文件类型判断 | 根据文件类型进行判断 | |
-e |
文件是否存在(existence) | [ -e 路径 ] |
-f |
文件是否存在且是一个常规文件(file) | [ -f 路径 ] |
-d |
文件是否存在且是一个目录(directory) | [ -d 路径 ] |
多条件判断 | 使用逻辑运算符进行多条件判断 | |
&& |
逻辑与:前一条命令执行成功时,才执行后一条命令 | [ 5 -eq 5 ] && echo OK |
|| | 逻辑或:前一条命令执行失败时,才执行后一条命令 | [ 5 -ne 5 ] || echo notOK |
五、流程控制
结构/语法 | 说明 | 示例 |
---|---|---|
if 判断 | 根据条件判断执行不同的程序块 | |
单分支 if 语句 | 单个条件判断,条件成立时执行程序块 | if [ $1 -eq 1 ]; then echo "True"; fi |
多分支 if 语句 | 多个条件判断,依次执行相应程序块 | if [ $1 -eq 1 ]; then echo "1"; elif [ $1 -eq 2 ]; then echo "2"; else echo "Other"; fi |
注意事项 | - [ 条件判断式 ] 中括号和条件之间必须有空格- if 后要有空格 |
|
case 语句 | 根据变量的值执行不同的程序块 | |
基本语法 | 使用模式匹配执行不同的命令序列 | case $1 in "1") echo "One";; "2") echo "Two";; *) echo "Other";; esac |
注意事项 | - case 语句以 in 结尾,每个模式匹配以 ) 结束- 双分号 ;; 表示命令序列结束 |
|
for 循环 | 循环执行一组命令 | |
for (( 初始值;条件;变量变化 )) | 经典 for 循环语法 | for ((i=0; i<=100; i++)); do sum=$((sum+i)); done |
for 变量 in 值1 值2… | 迭代循环一组值 | for i in 1 2 3; do echo "Value $i"; done |
while 循环 | 当条件为真时循环执行命令 | |
基本语法 | 使用条件判断执行循环 | while [ $i -le 100 ]; do sum=$((sum+i)); i=$((i+1)); done |
六、输入输出
命令/操作 | 说明 | 示例 | 选项 |
---|---|---|---|
read |
从控制台读取输入,并将其存储在指定变量中 | read name read -p "Enter your name: " name |
-p :提示文本-t :设置超时时间(秒)-n :限制输入字符数-s :隐藏输入 |
echo |
输出文本到终端或文件,通常用于提示或显示变量内容 | echo "Hello, $name" echo "This is a test" > output.txt |
-n :不换行-e :启用转义字符-E :禁用转义字符(默认行为) |
输入重定向 (< ) |
从文件而不是终端读取输入 | read name < input.txt |
无 |
输出重定向 (> ) |
将输出写入文件而不是显示在终端,覆盖文件内容 | echo "Hello" > output.txt |
无 |
追加重定向 (>> ) |
将输出追加到文件末尾而不是覆盖文件 | echo "Append this" >> output.txt |
无 |
printf |
格式化文本输出,比 echo 更灵活,可控制输出格式 |
printf "Name: %s\n" "$name" |
-v var :将输出保存到变量 var 而不是输出到屏幕 |
cat |
显示文件内容,或从终端/文件中读取输入并显示或重定向到文件 | cat file.txt cat < input.txt > output.txt |
-n :显示行号-E :显示行尾的 $ 符号-T :显示制表符为 ^I |
管道 (|) | 将一个命令的输出作为另一个命令的输入 | echo “Hello” | read var | 无 |
tee |
从标准输入读取数据,将其输出到标准输出和文件 | echo “Hello” | tee output.txt | -a :追加到文件而不是覆盖-i :忽略中断信号 |
> 和 2> |
分别用于重定向标准输出和标准错误输出 | command > output.txt 2> error.log |
无 |
&> |
将标准输出和标准错误输出同时重定向到同一文件 | command &> all_output.txt |
无 |
> 和 |& |
分别用于将标准输出重定向到文件、将标准输出和错误管道到另一个命令 | command > file.txt command |& grep “error” |
无 |
七、函数
1、系统函数
系统函数 | 功能描述 | 基本语法 | 案例 | 选项 | 补充 |
---|---|---|---|---|---|
basename | 删除路径中的所有前缀,包括最后一个斜杠 / ,返回文件名部分 |
basename [string / pathname] [suffix] |
basename /home/yxl/banzhang.txt basename /home/yxl/banzhang.txt .txt |
suffix :可选参数,指定后会从返回的文件名中去除该后缀 |
如果路径以 / 结尾,返回空字符串常与 find 命令结合使用,批量提取文件名 |
dirname | 删除路径中的文件名部分,返回目录路径 | dirname 文件绝对路径 |
dirname /home/yxl/banzhang.txt |
无 | 对于根路径 / ,dirname / 返回 / |
2、自定义函数
结构/语法 | 说明 | 示例 | 选项 | 补充 |
---|---|---|---|---|
自定义函数 | 自定义函数用于在脚本中封装可重复使用的代码块 | 函数定义必须在调用之前 函数没有参数时,可以省略括号 |
||
基本语法 | 定义一个自定义函数,并可选择性地返回一个整数值 | [ function ] funname[()] { Action; [return int;] } |
return 用于指定返回值 |
return 后只能返回 0-255 的整数值如果未指定 return ,函数的返回值为最后一个命令的执行结果 |
调用函数 | 通过函数名调用自定义函数,并可以传递参数 | funname arg1 arg2 |
调用函数时,传递的参数通过 $1 , $2 等特殊变量访问 |
|
函数返回值 | 函数返回值通过 $? 系统变量获取 |
result=$? |
函数返回值只能是整数 通常用于表示成功或失败 |
|
案例:计算两个数的和 | 创建一个自定义函数 sum ,用于计算两个输入参数的和 |
bash<br>function sum() {<br>s=$[$1+$2];<br>echo "$s";<br>}<br>read -p "Please input the number1: " n1;<br>read -p "Please input the number2: " n2;<br>sum $n1 $n2; |
read -p 用于读取用户输入并提示输入信息 |
自定义函数可以包含任何有效的 Shell 命令 函数内部的变量是全局的,如果需要局部变量,请使用 local |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 浮城!
评论