shell编程
!/bin/bash
set -u -e 安全
export 环境变量 cat /porc/$PID/export
位置变量
$0: 表示脚本或命令本身的名称。
$1, $2, $3, ...: 表示第一个、第二个、第三个等参数的值。
$* 或 $@: 表示所有位置参数的列表。
$#: 表示传递给脚本或命令的位置参数的个数。
echo $[12^4] =8 异或
条件 | 表达式 | 描述 |
---|---|---|
可读 | [[ -r "$file" ]] | 检查文件是否可读。 |
可写 | [[ -w "$file" ]] | 检查文件是否可写。 |
可执行 | [[ -x "$file" ]] | 检查文件是否可执行。 |
存在 | [[ -e "$file" ]] | 检查文件是否存在。 |
目录 | [[ -d "$file" ]] | 检查文件是否是目录。 |
文件 | [[ -f "$file" ]] | 检查文件是否是普通文件(非目录、非设备文件等)。 |
符号链接 | [[ -L "$file" ]] | 检查文件是否是符号链接。 |
以某用户为所有者 | [[ -O "$file" ]] | 检查文件是否以某用户为所有者。 |
以某用户为所属组 | [[ -G "$file" ]] | 检查文件是否以某用户为所属组。 |
文件大小是否大于零 | [[ -s "$file" ]] | 检查文件大小是否大于零。 |
条件 | 表达式 |
---|---|
相等 | [[ $a == $b ]] |
不相等 | [[ $a != $b ]] |
大于 | [[ $a -gt $b ]] |
大于等于 | [[ $a -ge $b ]] |
小于 | [[ $a -lt $b ]] |
小于等于 | [[ $a -le $b ]] |
逻辑与 | [[ $a && $b ]] |
逻辑或 | [[ $a |
: | 死循环 |
(cd /data; umask 666; touch 2.txt) 再下个进程执行,不影响当前环境
{} 反之,在当前环境下执行
num ="zz yy yy" 定为一行
echo $num
num ="
ll
zz
l1
"
echo "$num"
nums="echo {1..10}"
for循环
for i in {xxx};
do
循环
done
例子:for i in {1..100};
do let sum+=i;
done;
for ((sum=0;i<100;i++));
do
let sum+=i;
done
while循环
循环控制中断循环 conuntion
循环控制退出循环 break
while CONDITION
do
循环体
done
例子:while true do
循环体
done
while read url;do
crul $url &>/dev/null |echo "$url is faild"
done <url.txt
df | sed -En '/^/dev//s#.* ([0-9]+)%.*#\1 \2#p'|while read DISK USE; do
循环体
done
until循环 while的反
until commant ;do commant done
until false ;do commant done
位置参数
bash test.sh bb zz bb ee
选择循环
selcet menu in bb zz ll ; do echo $menu;done
$ps1:影响颜色
$ps3:用于select循环中的提示符
funtion 函数调用
local 变量 本地变量,将变量定在了函数体内
return 返回会退出函数
exit 直接退出脚本
func1 () {
函数体
}
func1 (函数调用)
阶层
假设$1=3,3进入循环,$-1,所以进入2的循环,2进入1的循环,返回1,21退出2阶层到3,所以是12*3
bomb() {bomb|bomb &}; bomb
调用bomb,并在后台运行
trap
trap "finish" exit 当出现exit时,确保执行finish
数组
定义:
emp[0]=zz
emp[1]=zz1
emp[2]=zz2
title=("e" e1 e2)
num=({1..10})
关联数组(自定义数组)
declare -A 数组 使用关联数组需要先定义
emp[frist]=l1
emp[second]=l2
删除
unset num[2]
调用
echo ${title[]} 显示全部 @显示数组下标 ${#num[@]} 加#显示下标总数
echo ${num[@]:3:4} 跳过3个输出4个
echo ${url#/} #懒惰模式 找到第一个/输出 ##贪婪模式
echo ${url%/} %反向检索 %%贪婪模式
echo ${url/33/44} 替换
echo ${url/33} 删除
遍历数组
for i in ${emp[*]};do echo $i ;done
基于偏移量取字符串
返回字符串变量var的字符的长度,一个汉字算一个字符
${#var}
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,到最后的部分,
offset的取值在0 到 ${#var}-1 之间(bash4.2后,允许为负值)
${var:offset}
返回字符串变量var中从第offset个字符后(不包括第offset个字符)的字符开始,长度为number的部分
${var:offset:number}
取字符串的最右侧几个字符,取字符串的最右侧几个字符, 注意:冒号后必须有一空白字符
${var: -length}
从最左侧跳过offset字符,一直向右取到距离最右侧lengh个字符之前的内容,即:掐头去尾
${var:offset:-length}
先从最右侧向左取到length个字符开始,再向右取到距离最右侧offset个字符之间的内容,注意:-length
前空格,并且length必须大于offset
${var: -length:-offset}
基于模式取子串
其中word可以是指定的任意字符,自左而右,查找var变量所存储的字符串中,第一次出现的word, 删除字
符串开头至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以第一个word为界删左留右
${var#*word}
从var变量的值中删除以word开头的部分
${var#word}
同上,贪婪模式,不同的是,删除的是字符串开头至最后一次由word指定的字符之间的所有内容,即贪婪模
式,以最后一个word为界删左留右
${var##*word}
${var##word}
##################################################################################
其中word可以是指定的任意字符,功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,
删除字符串最后一个字符向左至第一次出现word字符串(含)之间的所有字符,即懒惰模式,以从右向左的第一
个word为界删右留左
${var%word*}
${var%word}
同上,只不过删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符,即贪婪模式,以从右向
左的最后一个word为界删右留左
${var%%word*}
${var%%word}
高级变量
高级变量用法-有类型变量
- Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是等价的
- declare [选项] 变量名
-r 声明或显示只读变量
-i 将变量定义为整型数
-a 将变量定义为数组
-A 将变量定义为关联数组
-f 显示已定义的所有函数名及其内容
-F 仅显示已定义的所有函数名
-x 声明或显示环境变量和函数
-l 声明变量为小写字母 declare –l var=UPPER
-u 声明变量为大写字母 declare –u var=lower
eval 间接引用
eval会进行两次扫描,先替换$n,然后再输出
x=y
y=zz
devl echo $$x 或 echo ${!x}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?