shell既是应用程序,也是一种脚本语言。
开头以bash为解释器:
#!/bin/bash
变量:系统变量、用户变量、环境变量
系统变量:
HOME:当前用户的主目录
PATH:定义了Shell在查找命令时应该搜索的目录列表。
USER 或 USERNAME(取决于系统):当前登录的用户名。
PWD:当前工作目录的路径。
SHELL:当前Shell的路径。
UID 和GID:当前用户的用户ID(UID)和组ID(GID)。
RANDOM:生成一个0到32767之间的随机整数。
HOSTNAME:当前系统的主机名。
用户变量:
定义变量:变量名=变量值
eg: age= 10
引用变量:
使用$符号引用
删除变量:
unset 变量名
键盘输入:
read 参数 变量名
-p:提示信息,eg:read -p "请输入一个数字" num
-t:规定时间内输入的有效,秒为单位。eg:read -t 10 lock
-n:指定输入字符数,eg:read -n 2 times
-s:隐藏输入的数据
接受用户的参数
$$是shell的PID
$?:上一个条件判断的结果,0为真,其他为假
判断用户参数,
文件测试:判定文件存在或者权限是否满足,返回值0是真,1是假。
-d:是否为目录
-e:是否存在
-f:是否为文件
-r/-w/x:是否有读/写/执行权限
逻辑判断
与:&&或者 -a,前面的命令执行成功才执行后面的命令
或:|| 或者-o,前面的命令执行失败才执行后面的命令
非:!,将判断结果取反
管道符
A|B,A命令的结果作为B的输入
重定向符
覆盖写:>
追加写:>>
0:标准输入,
1:标准输出,
2:错误输出,
eg,将错误信息输出到err.log,将信息输出到out.log之中:cmd 2>err.log 1>out.log
eg,将cmd >alloutput.log 2>&1,2>&1:重定向符号组合,用于将标准错误重定向到标准输出所指向的位置。
整数比较
-eq:是否等于,equal
-ne:是否不等于,not equal
-gt:是否大于,greater than
-lt:是否小于,less than
-ge:是否大于等于,greater than or equal
-le:是否小于等于,less than or equal
字符串比较
=:比较字符串内容是否想等
!=:比较字符串内容是否不等
-z:判断字符串内容是否为空
if条件测试
if 条件测试
then
elif 命令2
then
else 命令3
fi
for循环
这个 Bash 脚本的目的是读取一个密码,并尝试根据 user.txt 文件中列出的用户名来创建用户
for 变量名 in 取值列表
do
命令序列
done
while循环
whlie 测试条件
do
命令序列
done
case条件测试
case 变量值 in
模式1)
;;
命令序列1
模式2)
;;
命令序列2
*)
命令序列3
esac
corn:用于定期执行任务的守护进程。它允许用户设置周期性被执行的任务,并以指定的时间间隔(分钟、小时、每天、每周、每月或每年)运行,字段的顺序是:
分钟(0 - 59)
小时(0 - 23)
日期(1 - 31)
月份(1 - 12 或 JAN-DEC)
星期(0 - 7,其中 0 和 7 都表示星期日,或者使用 SUN-SAT)
(可选)要运行命令的用户
例如,要在每天的中午 12 点运行某个命令,你可以使用以下 cron 表达式:
复制代码0 12 * * * /path/to/your/command
如何设置 Cron Jobs
编辑用户的 crontab 文件:
使用 crontab -e 命令编辑当前用户的 crontab 文件。这将打开一个文本编辑器,你可以在其中添加或修改 cron 表达式和命令。
查看用户的 crontab 文件:
使用 crontab -l 命令查看当前用户的 crontab 文件内容。
删除用户的 crontab 文件:
使用 crontab -r 命令删除当前用户的 crontab 文件。
grep:文本搜索工具,它允许你在文件中搜索特定的字符串或模式,并将匹配的行打印出来。
eg:grep -i "hello" example.txt
可选参数
-i:忽略大小写
-n:显示匹配行号
-v:反选,显示不匹配的行号
awk:文本处理工具,主要用于模式扫描和文本/数据提取。它通常用于处理结构化文本文件,如 CSV、日志文件等。
$NF代表最后一列,倒数第二列可以用$(NF-1)表示
awk 'NR>=2 && NR<=4 {print $2, $3, $4, $5, $6}' data.txt NR>=2,NR<=4{print}',取2-4行
awk -v OFS="---" 'NR==2,NR==4{print $1, $2}' hello.txt -v:定义或者修改awk内置变量,OFS:输出分隔符,默认是空格
grep -n "^$" file1:查找空行并打印出行号,^ 表示行的开始,$ 表示行的结束。当这两者之间没有字符时,它们就匹配一个没有任何字符的行,即空行。
sed:流编辑器(stream editor),对输入流(或文件)的每一行进行文本替换、删除、添加和其他操作。通常用于自动编辑文件、脚本和命令输出。
替换,使用 s 命令将 file.txt 中所有的 "apple" 替换为 "orange","g"表示全局替换。
eg:sed 's/apple/orange/g' file.txt
sed '2,9s/^mo/hi/' hello.txt 替换2-9行mo开头为hi
sed -e '2,9s/^mo/hi/' -e 's/^can/yes/g' hello.txt -e:可以多次编辑
sed 's/^[[:space:]]/#/g' hello.txt:将以"空格"开头的行空格替换为"#"
[[:space:]]+,一个或多个空格
sed -r 's/^/@/' hello.txt:开头加@
sed 's/^[md].*[oe]$/ggggg/' hello.txt 以m或d开头,o或e结尾的行,并替换为ggggg,.*代表长度任意
删除,使用 d 命令删除 file.txt 中包含 "banana" 的所有行:
eg:sed '/banana/d' file.txt
sed -i '2,$d' test.log:表示直接删除2和2后面的所有行。2表示2及后面所有行,$d表示删除。
sed '2,$d' input.log > output.log:删除2和2后的所有行,并将数据保存到ouput.log,ouput.log不存在会自己创建
sed -i '100d' inputfile # 删除第100行
sed -i '100,200d' inputfile # 删除从第100行到第200行的内容
sed '/^peach/,/^dsd/d' hello.txt:从“peach”开头删除到“dsd”开头的行
插入和追加
使用 i 命令在当前行之前插入文本。
sed 'iPrefix: ' file.txt
其他技巧:
生成序列
for i in {1..6};do
echo $i;done
清空一个文本
>test.txt
序列迭代
$(seq 1 6) 或者{1..6},取值1,2,3,4,5,
算数运算:
1、((a=1+1))
2、let a=1+1
3、a=$(expr 1 + 1),+两边要空开
3、乘法:a=$(expr 4 \* 2)
4、除法:a=$(expr 4 / 2)
自加
((i++)
let i++,let命令中的变量不需要使用$前缀
遍历test.txt文件中的内容:
for i in $(cat test.txt)
目录或文件要用""起来
eg: find . -name "8001.go":(.) 表示当前目录,-name "*.go" 是用于匹配文件名的表达式。
计算指定目录($rec_path)下所有.txt文件的总大小(以字节为单位)
total_size=$(find "$rec_path" -type f -name "*.txt" -exec stat -c%s {} \; | awk '{sum+=$1} END {print sum}')
1+...+50
seq 1 50 | awk '{sum+=$1} END{print sum}'
echo {1..50} | tr ' ' '\n' | awk '{sum+=$1} END{print sum}' # tr 是一个字符转换或删除工具。tr ' ' '\n' 是将输入中的空格字符( ' ')替换为换行符(\n)。
创建一个以1开始,8结束的,步长为2的数列
方法一:seq 1 2 8
方法二:{1..8..2}
字符串切片输出
phone="01086013387"
formatted_phone="${phone:0:3}-${phone:3}"
echo "$formatted_phone"
正则表达式()捕获组
^(010|0[2-9][0-9]),匹配010,020-099,匹配严谨,只匹配开头的
^010|0[2-9][0-9],匹配010,020-099,匹配宽松,例如22029,239022会匹配
标签:shell,语言,eg,用户,命令,sed,txt,log
From: https://www.cnblogs.com/larks-islands/p/18244745