Linux中的shell脚本

[复制链接]
发表于 2025-7-8 16:32:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
什么是shell脚本


  • shell脚本是文本的一种
  • shell脚本是可以运行的文本
  • shell脚本的内容是由逻辑和数据构成
  • shell脚本是解释型语言
用file命令可以查看文件是否是一个脚本文件
  1. file filename
复制代码

脚本书写规范

注释

单行注释

使用#号来进行单行注释

多行注释

使用
: "
注释内容
注释内容
注释内容
"
注意:冒号背面有空格

注意

在.vimrc里面注释行时
用的是"


vim用于书写脚本的设定

ts:tab键的巨细
sw:缩进巨细
ai:自动缩进
et:将tab键补齐的大空格拆分成小空格
注:当你规定了tab键的巨细时,再规定sw的缩进巨细将不生效
用vim编辑这个设置文件 
  1. vim ~/.vimrc
复制代码


自动添加新创建的特定文件的预定内容

也是编写这个设置文件
  1. vim ~/.vimrc
复制代码
如下代码块
 第一行的意思是当新创建一个以.sh或.script时自动执行下面我们本身写的一个SHELLTITLE函数
其中函数中写的是
在第1行(linux中行数从0开始计算,以是代码中写的是0而不是1)添加上“hahahahahahahahaha”这行内容
在第2行添加上日期,其格式为年/月/日
  1. autocmd BufNewFile *.sh,*.script call SHELLTITLE()
  2. func SHELLTITLE()
  3.     call append(0,"hahahahahahahahaha")
  4.     call append(1,"# Date:             ".strftime("%Y/%m/%d"))
  5. endfunc
复制代码

检验效果

以.sh结尾的新文件会自动添加

以.script结尾的新文件
也会自动添加

如果不是以.sh或.script结尾的新文件
也是不会自动添加的



脚本执行方法

创建了一个新脚本文件

里面编写的内容

注:没有可执行权限
在没有可执行权限时


. 脚本

  1. . 脚本
复制代码


source 脚本

  1. source 脚本
复制代码


sh 脚本

  1. sh 脚本
复制代码
 

当有可执行权限时


./脚本

  1. ./脚本
复制代码
 

直接执行
脚本的绝对路径

  1. 脚本的绝对路径
复制代码


脚本调试

写一个手残脚本

其中cat处本应该是cal

运行手残脚本

会发现被卡住了
假装排查代码眼残也没发现问题哈哈哈哈

那么我们就可以用sh -x 来执行脚本
调试脚本
  1. sh -x 脚本
复制代码
这次可以清楚的看到卡在了哪一步 

如许对我们的脚本排错有很大的作用
然后我们改一下我们的脚本
脚本在指定环境中运行

.        脚本
source        脚本

直接执行
脚本的绝对路径 会直接新开bash来执行脚本

exit值

查看退出值
  1. echo $?
复制代码

退出值0为正常退出,非0值都是错误退出,不正常。
修改退出值
  1. exit 你想要的退出值
复制代码

打印文本

cat&tac

正向打印&反向打印

seq

注:只能打数字
  1. seq 1 3
  2. #打印1到3
  3. seq 2 2 10
  4. #打印2到10 步长为2
  5. seq 1 2 10
  6. #打印1到10 步长为2
复制代码

echo
  1. echo 123
  2. echo "hello world"
  3. echo -n "hello world" //不换行打印
  4. echo -e "hello\tworld" //解析转义字符
复制代码

printf
  1. printf "hello vb" //不换行打印
  2. printf "hello vb\n" //换行打印
  3. printf "3%%" //打印百分号
  4. printf "%0.1f" "3.141592653579"    //保留一位小数
  5. printf "%0.2f" "3.141592653579"    //保留两位小数
  6. printf "%0.3f" "3.141592653579"    //保留三位小数
  7. printf "%.3f"  "3.141592653579"    //保留三位小数
  8. printf "%.2f"  "3.141592653579"    //保留两位小数
  9. printf "%.1f"  "3.141592653579"    //保留一位小数
  10. printf "%.0f"  "3.141592653579"    //取整数
复制代码

注:保留几位小数都是会四舍五入的
uniq

对于命令输出的字符冗余部分进行处理
注:只对有排序后的文件有效
vb里有实行素材,就是这些无序的数字
  1. -d #显示重复的行
  2. sort  -n vb  | uniq   -d
  3. -u #显示唯一的行
  4. sort  -n vb  | uniq   -u
复制代码
  1. -c #合并重复并统计重复个数
  2. sort  -n vb  | uniq   -c
复制代码

cut

用户对字符的截取
天生实行文件,我是从/etc/passwd中复制出来的
  1. cut -d : -f 1 ./test
复制代码
 指定分割符为 : 指定表现的列为第1列 对当前目录下的test文件作用

 指定分割符为 : 指定表现的列为第1列到第3列 对当前目录下的test文件作用 
  1. cut -d : -f 1-3 ./test
复制代码

 指定分割符为 : 指定表现的列为第3列到末了一列 对当前目录下的test文件作用
  1. cut -d : -f 3- ./test
复制代码

 指定分割符为 : 指定表现的列为第1列和第3列 对当前目录下的test文件作用
  1. cut -d : -f 1,3 ./test
复制代码

第一个字符到第四个字符
  1. cut -c 1-4 ./test
复制代码
第一个字符和第四个字符
  1. cut -c 1,4 ./test
复制代码

首字符到第八个字符
  1. cut -c -8 ./test
复制代码
第八个字符到末尾字符
  1. cut -c 8- ./test
复制代码


xargs

xargs 命令作用是将标准输入数据转换成命令行参数,可以或许处理管道大概标准输入并将其转换成特定命令的命令参数
原来echo的输出通过管道给touch是不能进行天生文件的操作的
以是我们需要用xargs来承接给touch(等那些不能直接接返回输出进行操作的命令)命令
  1. echo /mnt/vb{1..3} | xargs touch
复制代码

多行输入单行输出
  1. xargs < ./vb
复制代码
 指定每行输出个数
  1. xargs -n 3  < ./vb
复制代码
-n 3就是指定每行输出个数为3个 

指定分隔符
  1. echo "vb:vb:vb" | xargs -d :
复制代码
指定的是:,输出时将删除分隔符再输出 
  1. echo "aaa:abc:cba:bba" | xargs -d a
复制代码
同样如果用了字符a来进行分割的话,可以看到下方效果表现,将全部的字符a删去空位符替换并输出

用字符代替吸取值
  1. ls /mnt/* | xargs -I word rm -fr  word
复制代码

转义

在shell中有许多本身有特别功能的字符,比如空格井号等等
如果在给变量赋值或执行命令使用时我们只想使用这些符号本身那么就需要用到转义或引用
在shell中反斜杠表现转义,每个反斜杠只能转义一个字符
在shell中单引号表现强引用,我们可以把它看作批量转义,在单引号内的全部字符被视为字符本身
在shel中双引号表现弱引用,其和单引号的区别在于不能引用(\!$)
单个转义和多个转义

单个转义

可以用\
  1. echo #helloworld
  2. echo \#helloworld
复制代码
 
当我们需要转义一串字符中含有空格断开的一个井号时
我们需要用到多个转义
"XXXXXXXXX" 

注:要想打出\,则需要用'\',而不是"\"

同样的$,需要'$'才华转义,而"$"会被注释

变量



如果没加local参数



环境级别变量只在当前运行的shell中生效,shell关闭变量被释放

用户级变量只有登录系统的指定用户,此变量才生效


系统级变量是系统中的永久设定,全部用户都可以使用,系统变量通常被保存到/etc/profile中



回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表