学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页B站泷羽sec
本人第一篇文章,以后也会经常跟新监督自身学习
首先建立一个x.sh文件
vim x. sh
可以利用 #!/bin/bash ,#!/bin/dash ,#!/bin/sh 这种其实不管用哪种脚本解释器 最后调用的还是这个dash
(#! ,由 “#” 和 “!” 两个字符组成的特殊标记。当一个可执
行文件以这两个字符开头时,内核会将该行的其余部分作为解释
器的路径来读取,并使用该解释器来执行这个文件的后续内容。
/bin/bash 是指 bash解释器的路径。)
比如我们用 echo hello word 保存退出,运行一下 ./x.sh
如果写进去之后没有权限,无法执行要加执行权限 +x
第二种办法
比如说我们新建一个 1.sh vim 1.sh,直接编辑模式输入echo longyusec.com 我们默认是没有权限的 但是我们利用 sh1.sh 照样执行成功 bash 1.sh 一样成功我们执行脚本是在当前目录下执行的,但是如果你的脚本在别的目录你就要去到那个目录,或者指定好对应路径 这三个可以临时提高基本权限直接执行(bash、dash、sh)
第三种办法
利用source 1.sh执行和sh命令差不多,只不过这个命令就是对颜色加深标注了
变量声明和定义
举例 定义一个name变量,name=“xiaoyu”
再利用echo $name 打印出来,这就是简单的变量声明
比如 age=27
echo $age
打印出来的age=27
写复杂点,比如说 echo my name is $name,and my age is $age years old
然后就直接打印出了 姓名,和年纪
-般来说加双引号和不加效果是一样的 echo"my name is $name,and my age is $age years old”
加单引号效果是一样的 echo’my name is $name,and my age is $age years old’你会发现他并没有把变量赋值打印出来,而是直接把变量写进来了,区别就是不加或者双引号可以输出变量,但是加入单引号他会把变量当字符串输出出来
变量拼接
echo “my name is $name,and my age is $ageyears old”
这个例子中 years与age之间没有空格 所以打印出来为空,因为变量没有事先定义 所以为空
解决办法 将变量用双引号括起来 它就会做一个区分
cho “my name is
n
a
m
e
,
a
n
d
m
y
a
g
e
i
s
"
name,and my age is "
name,andmyageis"age"years old’
那么除了”"还能用什么呢 用{花括号也是可以的
echo "my name is KaTeX parse error: Expected '}', got 'EOF' at end of input: …and my age is {age}years old’
这样输出的变量会将输出内容利用花括号框起来上面详的全部是临时的一个变量,变量是由数字,字符串下划线组成,但是不能以数字开头例如9name 这种是不行的,变量中间最好不要有空格
比如说 long yu 如果非要用这种可以加个下划线long_yu_="xiaoyu"这种我们怎么查看我们定义的变量呢 比如说利用set命令,比如说set l grep name,怎么删除变量呢 我们使用 unset name 再次查看 set l grep name 就发现没有了(grep检索文本中的内容)
set |grep name 查看变量名为name的变量
unset name 删除name这个变量
拓展:
基础语法
1. 基本的 Shell 脚本结构
Shell 脚本通常以 #!
开头,表示脚本的解释器。例如:
bash
#!/bin/bash
# 这是一个简单的脚本
echo "Hello, world!"
#!/bin/bash
是解释器声明,告诉操作系统使用bash
来执行脚本(还有上面提的sh、dash)。echo
用来输出文本。
2. 变量
在 Shell 脚本中,变量不需要声明类型,直接赋值即可:
bash
#!/bin/bash
name="John"
echo "Hello, $name!"
name="John"
声明一个变量name
并赋值。$name
用来访问变量的值。
3. 条件语句
Shell 支持常见的条件语句,如 if
,else
和 elif
:
bash
#!/bin/bash
age=20
if [ $age -lt 18 ]; then
echo "You are a minor."
else
echo "You are an adult."
fi
[ $age -lt 18 ]
检查age
是否小于 18,-lt
是小于的比较操作符。
4. 循环
Shell 支持 for
、while
和 until
循环。
for
循环:
bash
#!/bin/bash
for i in {1..5}; do
echo "Number: $i"
done
while
循环:
bash
#!/bin/bash
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
((count++))
done
until
循环:
bash
#!/bin/bash
count=1
until [ $count -gt 5 ]; do
echo "Count: $count"
((count++))
done
5. 函数
Shell 脚本支持函数定义和调用:
bash
#!/bin/bash
greet() {
echo "Hello, $1!"
}
greet "Alice"
greet
是函数名,$1
表示第一个参数。
6. 输入和输出
- 用户输入:
bash
#!/bin/bash
echo "Enter your name:"
read name
echo "Hello, $name!"
- 命令输出到文件:
bash
#!/bin/bash
echo "This is a test" > output.txt
- 从文件读取:
bash
#!/bin/bash
while read line; do
echo $line
done < input.txt
常用命令
-
文件操作
-
创建文件或目录:
bash
-
touch file.txt
mkdir new_directory
删除文件或目录:
bash
rm file.txt
rm -r directory
复制文件:
bash
cp file.txt backup.txt
移动文件:
bash
-
mv file.txt /path/to/destination
文件权限
-
查看文件权限:
bash
ls -l file.txt
修改文件权限:
bash
-
chmod 755 file.txt
查找文件
-
查找文件:
bash
-
find /path/to/search -name "file.txt"
管道与重定向
-
管道:将一个命令的输出传递给另一个命令:
bash
ps aux | grep bash
重定向:将输出写入文件:
bash
-
-
echo "Some text" > file.txt
-
Shell 脚本示例:备份文件
以下是一个简单的备份脚本,定期备份某个目录下的文件:
bash
#!/bin/bash
# 设置源目录和目标目录
source_dir="/home/user/documents"
backup_dir="/home/user/backup"
# 获取当前日期
current_date=$(date +%Y-%m-%d)
# 创建备份文件夹(如果不存在)
mkdir -p "$backup_dir/$current_date"
# 备份文件
cp -r "$source_dir"/* "$backup_dir/$current_date"
echo "Backup completed successfully!"
文件内容替换:
-
1.替换文本(Substitution)
最常见的
sed
用法是替换文本。它的基本语法是:bash sed 's/pattern/replacement/' file
-
s
:表示替换操作。 -
pattern
:要匹配的模式(可以是正则表达式)。 -
replacement
:替换文本。 -
示例:
-
将文件中所有的
apple
替换为orange
:bash
sed 's/apple/orange/' file.txt
将文件中所有的
apple
替换为orange
,并修改原文件内容(使用-i
选项):bash sed -i 's/apple/orange/g' file.txt
-
-i
:表示直接修改文件。 -
g
:表示全局替换(替换每行中的所有匹配项)。如果不加g只会替换第一个匹配的 -
2. 删除行(Delete)
-
删除包含特定模式的行:
bash
sed '/pattern/d' file.txt
这会删除所有包含
pattern
的行。删除第 2 行:
bash sed '2d' file.txt
删除从第 2 行到第 4 行的内容:
bash sed '2,4d' file.txt
删除空行:
bash
-
sed '/^$/d' file.txt
3. 插入文本(Insert)
-
在指定行前插入文本:
bash
sed '2i This is inserted text' file.txt
2i
:表示在第 2 行之前插入文本。
在指定行后插入文本:
bash
-
sed '2a This is appended text' file.txt
2a
:表示在第 2 行之后插入文本。
4. 替换行内容(Change)
-
替换指定行的内容:
bash
-
sed '2c This is the new content' file.txt
这会将第 2 行的内容替换为
This is the new content
。
5. 打印行(Print)
-
打印指定的行:
bash
sed -n '2p' file.txt
这会打印第 2 行的内容。
打印第 2 到第 4 行的内容:
bash
-
sed -n '2,4p' file.txt
6. 多条命令
-
可以将多个
sed
命令一起使用,通过-e
选项或者将多个命令放在一个-e
参数中。bash
sed -e 's/apple/orange/' -e 's/banana/pear/' file.txt
或者将多个命令放在一个脚本文件中:
bash sed -f script.sed file.txt
script.sed
可以包含多条sed
命令。7. 正则表达式
sed
支持常见的正则表达式语法,可以用来处理复杂的模式匹配。1. 匹配数字
-
查找包含数字的行:
bash
-
sed '/[0-9]/p' file.txt
2. 匹配行首和行尾
-
匹配行首(以 “apple” 开头的行):
bash
sed '/^apple/p' file.txt
匹配行尾(以 “pie” 结尾的行):
bash sed '/pie$/p' file.txt
-
-
-
-
后台执行进程
-
使用
&
将进程放到后台运行:bash
./long-running-process.sh &
使用 jobs
查看后台任务:
bash
jobs
使用 fg
将后台进程切换到前台:
bash
fg %1 # 将后台的第一个任务切换到前台
使用 nohup
命令保持进程在会话结束后继续运行:
bash
-
nohup ./long-running-process.sh &
9. 信号与trap
在 shell 脚本中,处理信号和错误非常重要。trap
命令允许你在接收到某些信号时执行特定操作。
-
捕获信号:
bash
# 捕获 SIGINT(Ctrl+C)信号并执行某个清理操作
trap "echo 'Caught SIGINT signal'; exit" SIGINT
常见信号:
SIGINT
:用户按下 Ctrl+C 发送的信号。SIGTERM
:程序的终止信号。SIGKILL
:强制杀死进程的信号(无法被捕获)。
bash
-
# 捕获 SIGTERM 信号 trap "echo 'Terminated by user'; exit" SIGTERM
10. 正则表达式
Shell 中的许多工具(如 grep
、sed
、awk
)都支持正则表达式。学习正则表达式能够让你更有效地处理文本。
grep 中的正则表达式
-
查找包含某个模式的行:
bash
# 查找以 "error" 开头的行
grep "^error" logfile.txt
查找包含数字的行:
bash
-
grep "[0-9]" logfile.txt
sed 中的正则表达式
-
使用
sed
删除包含特定模式的行:bash
sed '/error/d' logfile.txt # 删除包含 "error" 的行
使用 sed
替换文本:
bash
-
sed 's/old/new/g' file.txt # 将 "old" 替换为 "new"
awk 中的正则表达式
-
使用
awk
按列处理文件:bash
awk '{ print $1, $3 }' file.txt # 打印第一列和第三列
使用 awk
基于模式进行过滤:
bash
-
awk '/error/ { print $0 }' logfile.txt # 查找包含 "error" 的行
11. 调试技巧
调试 shell 脚本可以帮助你发现和解决问题。以下是一些调试技巧。
-
-x
选项:启用脚本调试模式,显示每个命令及其参数。bash
# 在脚本开头启用调试模式
set -x
-e
选项:脚本中任意命令失败时立即退出。
bash
# 在脚本开头启用错误检查
set -e
打印变量:通过 echo
打印变量值,有助于调试脚本。
bash
echo "Variable value: $my_var"
标签:shell,name,编程,echo,sed,file,txt,bash
From: https://blog.csdn.net/Free_Sea_/article/details/143758987