Shell脚本基础知识-初步版

news/2024/10/6 23:18:50/文章来源:https://www.cnblogs.com/it-bt/p/18442126

本文是笔者研究生期间在阅读《Linux命令行与shell脚本编程大全》之后总结出来的一些重点知识的记录,在此重新整理输出。以便在给上个帖子 涉及到的相关知识点进行一下讲解,帮助自己复习

shell脚本的首行规范化应该是

#!/bin/bash  
# function description

其中第一行必须如此,#后面的惊叹号会告诉shell用哪个shell来运行脚本,第二行是本脚本的功能说明。

一. 引用变量与数组

● 当进行变量赋值后,要引用这个变量,则要用 $符号,而如果要某个命令的结果进行赋值则要用 $()
● 变量名称区分大小写,赋值的=前后不能有空格

days=10
guest="Katie"
echo "$guest checked in $days days ago"#!/bin/bash
testing=$(date)
echo "The date and time are: " $testing

● 一维数组,即向量,空格隔开,下标读取, */@读取所有元素

array_name=(value0 value2 value3) 
# 数组使用
my_array=(A B C D)
echo "数组的元素为: ${my_array[*]}
echo "数组的元素为: ${my_array[@]}
echo "数组的元素个数为: ${#my_array[@]}"

● 重定向输入输出

#### 输出重定向
> # 保存>> # 追加保存,不覆盖#### 输入重定向,也就是将 file 作为参数 发给这个命令,比如下面,
# wc命令可以对对数据中的文本进行计数
wc < file1

● 管道 | :一个命令的输出作为另一个命令的输入
rpm -qa | sort > rpm.list
● 其他

# 命令替换
for i in `seq 1 10`
`expr 2+2` #### echo read printf test命令
echo "It is a test"
echo "\"It is a test\"" # 转义#!/bin/sh
read name # 从标准输入中读取参数赋给name变量
echo "$name It is a test"
echo -e "OK! \n"  # -e 开启转义
echo "It is a dog" > myfileprintf "%-10s %-8s %-4s.2f\n" 郭靖 男 66.1234

二. 流程控制

2.1 for循环

## for循环 
for loop in `seq 1 5` # 命令替换
doecho "The value is: $loop"
done#或者一条命令
for var in item1 item2 item3;do echo $var;done# while循环
while condition
docommand
done#### 示例小脚本
for i in (seq 1 22) X Y M;do cat chr{i}.fa >>hg38.fa;done # () 都是做命令替换的 {}是做变量替换的
for i in `seq 1 12`;do cut -f 6,9 w${i}_transcript.gtfs >w${i}.txt;done
for i in `seq 1 12`;do sort w${i}.txt >w${i}.gtf;done
for i in `cat list.txt`;do grep -w $i whole.gff3|awk '$3=="gene"' >>result.txt;done

2.2 if-else类

### shell流程控制
# 判断 只有第一个 command正常成功执行,返回退出码0的语句中的then的 command2才会被执行
if command1
thencommand2command3
fi# 另一种形式
if command; thencommands
fi# if-then-else 语句
if command
thencommand2
elsecommand3
fi# 嵌套if
if grep $testuser /etc/passwd
thenecho "The user $testuser exists on this system."
elseecho "The user $testuser does not exist on this system."if ls -d /home/$testuser/thenecho "However, $testuser has a directory."fi
fi# elif
if command1
thencommands
elif command2
thenmore commands
fi

2.3 if中对条件的判断
除了 正常执行某个命令之外,还可以用 test 和 [ condation ] 两种形式来判断,判断条件有数值比较 字符串比较 文件比较

### 更一般性的判断语句,而不只是以command是否成功执行为判断依据
# test condition # 检查某个表达式是否成立;test可以判断 数值比较 字符串比较 文件比较 
if test conditon # 
then
fiif [ condition ] # 另一种方式
then
fi

● 数值比较 左边 对于右边的关系
-eq 相等
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于
● 字符串比较
-n 长度非0
-z 长度为0
= 相同
!= 不同


< 小

test比较数值用 文本代码(eq,lt)来比较,而比较字符串用 标准数学符号(>=)来比较,比较字符串使用标准的ASCII码顺序,数值< 大写字母< 小写字母

# 节选自 《linux命令行与shell脚本大全》第三版 P245 
# -n -z 检查一个变量是否含有数据 可以用来判断 自己写的shell程序的命令行参数是否完备
cat test10.sh
$ cat test10.sh
#!/bin/bash
# testing string length
val1=testing
val2=''
#
if [ -n $val1 ]
thenecho "The string '$val1' is not empty"
elseecho "The string '$val1' is empty"
fi
#
if [ -z $val2 ]
thenecho "The string '$val2' is empty"
elseecho "The string '$val2' is not empty"
fi
#
if [ -z $val3 ]
thenecho "The string '$val3' is empty"
elseecho "The string '$val3' is not empty"
fi
$
$ ./test10.sh
The string 'testing' is not empty
The string '' is empty
The string '' is empty
$

● 文件比较
-d file 检查file是否存在并是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并是一个文件
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧
更多参见 P246 12.4.3
● 复合条件测试
[ condtion1 ] && [ condtion2 ]
[ condtion1 ] || [ condtion2 ]
2.4 Case

# case
case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac

例子

case $USER in
rich | barbara)
echo "Welcome, $USER"
echo "Please enjoy your visit";;
testing)
echo "Special testing account";;
jessica)
echo "Do not forget to log off when you're done";;
*)
echo "Sorry, you are not allowed here";;
esac

三.处理命令行输入参数

在命令行获取参数,默认的 执行脚本被认为是 $0,那么 后面每隔一个空格 的参数就依次是 $1, $2 ......。

# 1.命令行参数  位置参数  parameters
(basename $0), $1 ~ $9   ${10} (参数检测 -n -z ) 
# 2.特殊参数变量
$# : 命令行参数总和  最后一个参数 ${!#}	 $* $@ 所有的参数
# 3.移动变量
shift n
## 4.处理选项options -a  getopt/getopts
case  --双破折线  区分 parameter -- option   -a num1 -c num2
# getopt / getopts 格式化命令行或参数  P300
getopt ab:cd -a -b test1 -c -d test2 test3
# 5. 选项标准化 默认的选项表示的意思  
-c 计数 -r 递归 -q 安静
### 6.获得用户输入
echo -n "Enter your name: " # 用户输入与提示文字 在一行,类似表单
read name # read 将输入结果放进一个变量中
echo "Hello $name, welcome to my program. "
# 或者 一行搞定
read -p "Please enter your age: " age 
# 超时 -t
if read -t 5 -p "Please enter your name: " name
thenecho "Hello $name, welcome to my script"
elseechoecho "Sorry, too slow! "
fi
# -s 隐藏读取 比如密码  实际上,数据会被显示,只是 read命令会将文本颜色设成跟背景色一样
read -s -p "Enter your password: " pass## 从文件读取 实用
count=1
cat test | while read line
doecho "Line $count: $line"count=$[ $count + 1]
done
echo "Finished processing the file"

四.重定向深入理解

### 1.输入与输出
#文件描述符 非负整数 0标准输入 1标准输出 2标准错误
<  >  2>  1>  &>
### 2.脚本重定向
## 临时重定向
cat test8
#!/bin/bash
# testing STDERR messages
echo "This is an error" >&2
echo "This is normal output"
$
$./test8 2>test9 # 错误的信息被重定向
## 永久重定向
$ cat test10
#!/bin/bash
# redirecting all output to a file
exec 1>testout # or exec 2>testerror
echo "This is a test of redirecting all output"
echo "from a script to another file."
echo "without having to redirect every individual line"
### 3.重定向输入
exec 0< testfile
while read line

BTW:
阅读完上面的内容,基本上就能看懂上期我发的 简单可靠的SpringBoot Jar包启动脚本了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/806240.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习系列之1----直观解释Transformer

Abstract 这个系列主要用来记录我自己这种的AI小白的学习之路,通过将所学所知总结下来,记录下来。之前总喜欢记录在笔记本上,或者ipad上,或者PC端的Typora上,但总是很难回头检索到一些系统的知识,因此我觉得博客是一个不错的选择,因为时不时我就会登录网站翻看过去的痕迹…

PARTI-Oracle关系数据结构-表和表簇

2. 表和表簇 2.1. 模式对象简介 数据库模式是数据结构的逻辑容器,这些数据结构称为模式对象。模式对象的例子有表和索引。模式对象是通过 SQL 创建和操作的。 一个数据库用户拥有密码和各种数据库权限。每个用户拥有一个与其同名的模式。模式包含了属于该用户的数据。例如,hr…

chrome-截图录屏插件-Awesome Screenshot

💖简介 Awesome Screenshot 截图录屏是一款浏览器扩展程序,它可以帮助用户进行网页截图、编辑图片以及录制屏幕视频 📖版本 4.4.22 🌟功能截图:可以截取整个网页(即使是需要滚动才能看到的部分)、可见部分或者选定区域。 编辑:截图后可以直接在浏览器中对图片进行编…

PART1-Oracle关系数据结构-表和表簇

2. 表和表簇 2.1. 模式对象简介 数据库模式是数据结构的逻辑容器,这些数据结构称为模式对象。模式对象的例子有表和索引。模式对象是通过 SQL 创建和操作的。 一个数据库用户拥有密码和各种数据库权限。每个用户拥有一个与其同名的模式。模式包含了属于该用户的数据。例如,hr…

Python - [05] 爬虫

题记部分 001 || 爬虫的工作原理(1)获取数据。爬虫程序会根据提供的网址,向服务器发起请求,然后返回数据。 (2)解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 (3)提取数据。爬虫程序再从中提取出我们需要的数据。 (4)储存数据。爬虫程序把这些有…

(三)Style样式

一:定义样式作用于按钮<Window x:Class="WpfTest.WindowStyle"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/ex…

20240930模拟赛

T1连珠风暴 (necklace.pas/c/cpp) 问题描述:给定M种颜色的珠子,每种颜色珠子的个数均不限,将这些珠子做成长度为N的项链。 问能做成多少种不重复的项链. 并且两条项链相同,当且仅当两条项链通过旋转或是翻转后能重合在一起,且对应珠子的颜色相同。样例输入:2 5样例输出…

9.23 ~ 9.30

集训9.23 集训第一天。 早晨因为太多人没拿早读资料被老登 D 了。 不是哥们你不早说 现在我上哪给你找资料去 😅 上午模拟赛。 发现 T1 的图挂了,于是看形式化题意;初始有一张 \(n\) 个点的完全图,接着删除 \(m\) 条边。 询问有多少长度为 \(13\) 的序列 \(p_1,...,p_{13}…

实时语音交互,打造更加智能便捷的应用

随着人工智能和自然语言处理技术的进步,用户对智能化和便捷化应用的需求不断增加。语音交互技术以其直观的语音指令,革新了传统的手动输入方式,简化了用户操作,让应用变得更加易用和高效。 通过语音交互,用户可以在不方便使用触屏操作例如驾驶、烹饪时通过语音指令进行操作…

基于大模型搭建运力业务的“小红书”

作者:京东物流 朱飞 一、背景问题 1、职能人员(运营管理人员)日常工作所涉及的知识信息包括业务最新SOP、发文、操作手册等,获取渠道较分散,很多都依靠线下传递(发邮件、咚咚分享等),目前运力业务各种Sop、操作手册等文档上千个,累计文字过百万,缺乏统一查询入口,需…

能力有限公司

曹明杰 202201170101 性格:外向、乐观、善于团队合作。他总是能够迅速适应新环境,并且有很强的领导能力。 擅长的技术:打游戏 兴趣爱好:阅读小说、旅行探索新地方。 项目角色:项目负责人、爬虫工程师 一句话宣言:乐观的编程领袖,以Python和云计算技术引领创新,热爱科幻…