Linux中的shell脚本

什么是shell脚本

  • shell脚本是文本的一种
  • shell脚本是可以运行的文本
  • shell脚本的内容是由逻辑和数据组成
  • shell脚本是解释型语言

用file命令可以查看文件是否是一个脚本文件

bash 复制代码
file filename

脚本书写规范

注释

单行注释

使用#号来进行单行注释

多行注释

使用

: "

注释内容

注释内容

注释内容

"

注意:冒号后面有空格

注意

在.vimrc里面注释行时

用的是"

vim用于书写脚本的设定

ts:tab键的大小

sw:缩进大小

ai:自动缩进

et:将tab键补齐的大空格拆分成小空格

注:当你规定了tab键的大小时,再规定sw的缩进大小将不生效

用vim编辑这个配置文件

bash 复制代码
vim ~/.vimrc

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

也是编写这个配置文件

bash 复制代码
vim ~/.vimrc

如下代码块

第一行的意思是当新创建一个以.sh或.script时自动执行下面我们自己写的一个SHELLTITLE函数

其中函数中写的是

在第1行(linux中行数从0开始计算,所以代码中写的是0而不是1)添加上"hahahahahahahahaha"这行内容

在第2行添加上日期,其格式为年/月/日

bash 复制代码
autocmd BufNewFile *.sh,*.script call SHELLTITLE()
func SHELLTITLE()
    call append(0,"hahahahahahahahaha")
    call append(1,"# Date:             ".strftime("%Y/%m/%d"))
endfunc

检验效果

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

以.script结尾的新文件

也会自动添加

如果不是以.sh或.script结尾的新文件

也是不会自动添加的

脚本执行方法

创建了一个新脚本文件

里面编写的内容

注:没有可执行权限

在没有可执行权限时

. 脚本

bash 复制代码
. 脚本

source 脚本

bash 复制代码
source 脚本

sh 脚本

bash 复制代码
sh 脚本

当有可执行权限时

./脚本

bash 复制代码
./脚本

直接执行脚本的绝对路径

bash 复制代码
脚本的绝对路径

脚本调试

写一个手残脚本

其中cat处本应该是cal

运行手残脚本

会发现被卡住了

假装排查代码眼残也没发现问题哈哈哈哈

那么我们就可以用sh -x 来执行脚本

调试脚本

bash 复制代码
sh -x 脚本

这次可以清楚的看到卡在了哪一步

这样对我们的脚本排错有很大的作用

然后我们改一下我们的脚本

脚本在指定环境中运行

. 脚本

source 脚本

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

exit值

查看退出值

bash 复制代码
echo $?

退出值0为正常退出,非0值都是错误退出,不正常。

修改退出值

bash 复制代码
exit 你想要的退出值

打印文本

cat&tac

正向打印&反向打印

seq

注:只能打数字

bash 复制代码
seq 1 3
#打印1到3
seq 2 2 10
#打印2到10 步长为2
seq 1 2 10
#打印1到10 步长为2

echo

bash 复制代码
echo 123
echo "hello world"

echo -n "hello world" //不换行打印

echo -e "hello\tworld" //解析转义字符

printf

bash 复制代码
printf "hello vb" //不换行打印
printf "hello vb\n" //换行打印

printf "3%%" //打印百分号

printf "%0.1f" "3.141592653579"    //保留一位小数
printf "%0.2f" "3.141592653579"    //保留两位小数
printf "%0.3f" "3.141592653579"    //保留三位小数
printf "%.3f"  "3.141592653579"    //保留三位小数
printf "%.2f"  "3.141592653579"    //保留两位小数
printf "%.1f"  "3.141592653579"    //保留一位小数
printf "%.0f"  "3.141592653579"    //取整数

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

uniq

对于命令输出的字符冗余部分进行处理

注:只对有排序后的文件有用

vb里有实验素材,就是这些无序的数字

bash 复制代码
-d #显示重复的行
sort  -n vb  | uniq   -d
-u #显示唯一的行
sort  -n vb  | uniq   -u
bash 复制代码
-c #合并重复并统计重复个数
sort  -n vb  | uniq   -c

cut

用户对字符的截取

生成实验文件,我是从/etc/passwd中复制出来的

bash 复制代码
cut -d : -f 1 ./test

指定分割符为 : 指定显示的列为第1列 对当前目录下的test文件作用

指定分割符为 : 指定显示的列为第1列到第3列 对当前目录下的test文件作用

bash 复制代码
cut -d : -f 1-3 ./test

指定分割符为 : 指定显示的列为第3列到最后一列 对当前目录下的test文件作用

bash 复制代码
cut -d : -f 3- ./test

指定分割符为 : 指定显示的列为第1列和第3列 对当前目录下的test文件作用

bash 复制代码
cut -d : -f 1,3 ./test

第一个字符到第四个字符

bash 复制代码
cut -c 1-4 ./test

第一个字符和第四个字符

bash 复制代码
cut -c 1,4 ./test

首字符到第八个字符

bash 复制代码
cut -c -8 ./test

第八个字符到末尾字符

bash 复制代码
cut -c 8- ./test

xargs

xargs 命令作用是将标准输入数据转换成命令行参数,能够处理管道或者标准输入并将其转换成特定命令的命令参数

原本echo的输出通过管道给touch是不能进行生成文件的操作的

所以我们需要用xargs来承接给touch(等那些不能直接接返回输出进行操作的命令)命令

bash 复制代码
echo /mnt/vb{1..3} | xargs touch

多行输入单行输出

bash 复制代码
xargs < ./vb

指定每行输出个数

bash 复制代码
xargs -n 3  < ./vb

-n 3就是指定每行输出个数为3个

指定分隔符

bash 复制代码
echo "vb:vb:vb" | xargs -d :

指定的是:,输出时将删除分隔符再输出

bash 复制代码
echo "aaa:abc:cba:bba" | xargs -d a

同样如果用了字符a来进行分割的话,可以看到下方效果显示,将所有的字符a删去空位符替代并输出

用字符代替接收值

bash 复制代码
 ls /mnt/* | xargs -I word rm -fr  word

转义

在shell中有很多本身有特殊功能的字符,比如空格井号等等

如果在给变量赋值或执行命令使用时我们只想使用这些符号本身那么就需要用到转义或引用

在shell中反斜杠表示转义,每个反斜杠只能转义一个字符

在shell中单引号表示强引用,我们可以把它看作批量转义,在单引号内的所有字符被视为字符本身

在shel中双引号表示弱引用,其和单引号的区别在于不能引用(\!$)

单个转义和多个转义

单个转义

可以用\

bash 复制代码
echo #helloworld

echo \#helloworld

当我们需要转义一串字符中含有空格断开的一个井号时

我们需要用到多个转义

"XXXXXXXXX"

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

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

变量

如果没加local参数

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

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

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

相关推荐
A小辣椒1 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒5 小时前
TShark:基础知识
linux
AlfredZhao7 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao1 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式