本文章是学习了Linux的学习记录,着重记录了我对于Linux各命令的用法与感悟,欢迎各位大佬批评指正
记录者:CYH-BI
记录日期:2023年7月7日
本篇文章将使用虚拟机并安装centos 进行实操。关于虚拟机的安装请看其他教程,篇幅过长,不一展示。
Linux起初由Linus Torvalds与1991年编写,本质上是一个UNIX操作系统。目前的发行版本有Linux内核、shell环境、桌面软件、各类系统管理软件和应用软件共同构成的一个完整的Linux操作系统。在终端输入命令后,系统将命令输给内核执行,将返回的结果输出到指定位置。
文件系统结构与window系统类似(但差异较大),Linux系统含有一个根目录(/),该目录下又含有众多二级目录,如:
路经的使用于window类似,比如我要进入某用户(lh)目录下的my目录,那么全路径为:/home/lh/my
第一个 / 表示根目录,lh用户在home目录下,my目录在lh下。
shutdown
功能:关闭、重启系统
命令格式:
shutdown [选项] 时间
主要参数:
-r (reboot) :重启系统
-h (halt) :关闭系统
-P (poweroff) :关机(关闭系统与电源)
用法举例:
shutdown -h 5 #5分钟后关机
shutdown -r #立即重启系统
shutdown -r 5 #5分钟后重启系统
#上述太麻烦了,花里胡哨的,我一般使用下面的
reboot #重启系统
poweroff #立即关机
clear :清除当前屏幕(或终端)上显示的内容
su :普通用户转root用户,普通用户是 $ 开头,root 用户是 # 开头。该命令需要输入密码,且密码不可见,需要盲打。
man (manual):显示命令的说明手册
命令格式:
man 命令名
如果你某个命令忘记了如何使用或者是命令有哪些参数,该命令可以给出详解,举例如下
[cyh@localhost Desktop]$ man shutdown #回车,弹出说明文档,按q退出
man 命令麻烦了一点,我更喜欢命令加 –help 来显示用法,比如:
[cyh@localhost Desktop]$ shutdown --help #直接在屏幕输出各参数以及用法
shutdown [OPTIONS...] [TIME] [WALL...]
Shut down the system.
--help Show this help
-H --halt Halt the machine
-P --poweroff Power-off the machine
-r --reboot Reboot the machine
-h Equivalent to --poweroff, overridden by --halt
-k Don't halt/power-off/reboot, just send warnings
--no-wall Don't send wall message before halt/power-off/reboot
-c Cancel a pending shutdown
[cyh@localhost Desktop]$
history :查看你使用过的所有命令,默认显示所有,可以指定显示条数(最近的)
命令格式:
history [查看命令行数]
用法举例:
[cyh@localhost Desktop]$ history 10 #显示最后10行
448 vim log2.sh
449 cat log2.sh
450 bash log2.txt
451 bash log2.sh
452 who
453 who -q
454 man shutdown
455 shutdown --help
456 history -10
457 history 10
ls (list)命令
功能:默认显示当前目录下的文件列表。如果所给参数是指定到某文件,则列出该文件有关信息
主要选项:
-a (all):表示列出目录所有项,包括以“ . ”开始的隐藏文件
-l (list):以列表形式列出文件
-d (directory):仅列出目录本身信息
-R(recursive):递归列出子目录内容
部分举例如下:
[cyh@localhost Desktop]$ ls #在我的桌面上有6个文件,使用ls命令显示
gen2go.txt gene2go log2.sh log2.txt log.txt shiyan5
[cyh@localhost Desktop]$ ls ./shiyan5 #列出shiyan5中所有文件,"./"表示当前文件路径,是"/home/cyh/Desktop"的简写,与ls /home/cyh/Desktop/shiyan5是一样的
guess_number.sh identical_line.sh
identical_filebreaklines2.sh identical_user.sh
identical_filebreaklines.sh sum_and_product2.sh
identical_file.sh
[cyh@localhost Desktop]$ ls -l #-l参数,以列表形式列出文件
total 218464
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 63 Jul 6 09:37 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 2 cyh cyh 233 Apr 22 03:27 shiyan5
[cyh@localhost Desktop]$ ls -a #表示列出目录所有项,包括以“ . ”开始的隐藏文件,结果显示有两个隐藏文件
. .. gen2go.txt gene2go log2.sh log2.txt log.txt shiyan5
[cyh@localhost Desktop]$ ls -d #仅列出目录本身信息
.
[cyh@localhost Desktop]$ ls -R #递归列出子目录,在shiyan5文件中,含有子文件,也一一列出
.:
gen2go.txt gene2go log2.sh log2.txt log.txt shiyan5
./shiyan5:
guess_number.sh identical_line.sh
identical_filebreaklines2.sh identical_user.sh
identical_filebreaklines.sh sum_and_product2.sh
identical_file.sh
[cyh@localhost Desktop]$ ls -lR #参数可以叠加使用,以列表的形式递归列出文件
.:
total 218464
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 63 Jul 6 09:37 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 2 cyh cyh 233 Apr 22 03:27 shiyan5
./shiyan5:
total 28
-rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
-rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
-rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh-rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
-rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
-rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
-rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
pwd (print working directory)命令,字面意思,打印当前的目录(工作目录)完整路径
命令格式:
pwd [选项]
举例如下:
[cyh@localhost Desktop]$ pwd
/home/cyh/Desktop
cd (change directory)更改当前目录,不加参数转跳到用户的主目录
命令格式:
cd [选项] [文件或目录路径]
举例如下:
[cyh@localhost Desktop]$ cd ./shiyan5 #更改路径到shiyan5
[cyh@localhost shiyan5]$ pwd #显示当前目录完整路径
/home/cyh/Desktop/shiyan5
[cyh@localhost shiyan5]$ cd #不加任何参数,转跳至用户主目录,可看下行"~"
[cyh@localhost ~]$ cd /home/cyh/Desktop/shiyan5 #使用全路径
[cyh@localhost shiyan5]$ #到达shiyan5目录
[cyh@localhost shiyan5]$ cd .. #返回上一层目录
[cyh@localhost Desktop]$ cd ../.. #返回上两层目录
stat 获取某文件基本信息
命令格式:
stat 文件或路径
举例:
[cyh@localhost shiyan5]$ ll #查看以下该目录下有什么文件
total 28
-rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
-rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
-rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh
-rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
-rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
-rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
-rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
[cyh@localhost shiyan5]$ stat ./sum_and_product2.sh #查看该目录下sum_and_product2.sh文件,结果如下所示
File: ‘./sum_and_product2.sh’
Size: 185 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 78261 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ cyh) Gid: ( 1000/ cyh)
Context: unconfined_u:object_r:user_home_t:s0
Access: 2023-04-22 02:56:37.126073472 -0400
Modify: 2023-04-22 02:56:33.784094697 -0400
Change: 2023-04-22 02:56:33.785094676 -0400
Birth: -
[cyh@localhost shiyan5]$
touch 命令
更新一个文件的访问和修改时间,如果没有该文件则新建该文件(我一般用来新建文件)
命令格式:
touch 文件或路径目录
举例:
[cyh@localhost Desktop]$ touch first_file.txt #在桌面上新建first_file.txt文件
[cyh@localhost Desktop]$ ll #查看以下桌面文件,ll为' ls -l '的简写
total 218464
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 63 Jul 6 09:37 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 2 cyh cyh 233 Apr 22 03:27 shiyan5
[cyh@localhost Desktop]$
mkdir 命令:新建目录
部分参数:
-p 递归创建目录
-m 给文件赋予某权限(请看下一个命令)
命令格式:
mkdir 目录路径
举例:
[cyh@localhost Desktop]$ mkdir first_dir #在当前目录下创建first_dir文件夹
[cyh@localhost Desktop]$ ls -l #查看结果中是否有first_dir文件(结果第一个就是)
total 218464
drwxrwxr-x. 2 cyh cyh 6 Jul 11 12:14 first_dir
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 63 Jul 6 09:37 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 2 cyh cyh 233 Apr 22 03:27 shiyan5
看到这里,新手就有疑惑了,有很多东西看不懂,比如,使用 ll -l 命令返回结果怎么看,那么请看如下:
drwxrwxr-x. 2 cyh cyh 6 Jul 11 12:14 first_dir
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
在这里我截取了部分文件信息,我拆开来解释:
drwxrwxr-x. 2 cyh cyh 6 Jul 11 12:14 first_dir
第一个字母 d ,表示这是一个目录(directory),如果是 - ,代表这是个文件
rwxrwxr-x ,r 代表可读(read), w 代表可写(write),x 代表可执行,- 代表没有
前三个表示管理员(root)对该文件所拥有的权限(rwx,可读可写可执行)
中间三个表示该文件的拥有者对该文件所拥有的权限(rwx,可读可写可执行)
左后三个表示除了上面两种,其他人对该文件所拥有的权限(r-x,可读不可写可执行)
rwx可用数字表示,r=4,w=2,x=1
cyh 第一个表示用户名,第二个表示所属组
6 Jul 11 12:14 创建或修改日期
创建一个最高权限的first_file2目录
mkdir -m 777 first_file2
第一个7,表示管理员拥有的权限,4+2+1 (rwx),同理,第二个表示目录所属者,第三个所属组其他人
mv 命令
功能:移动或重命名文件或目录
命令格式:
mv [选项] 源文件或目录路径 目标文件或目录路径
主要选项:
-b (backup):如果存在同名文件,覆盖前先备份原来的文件。
-f (force):强制覆盖同名文件
使用举例:
[cyh@localhost first_dir]$ touch test1 test2 #先创建两个文件
[cyh@localhost first_dir]$ ll #查看一下结果,该命令为 ls -l 的缩写
total 0
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test2
[cyh@localhost first_dir]$ mv -b test2 test1 #将test2改名为test1
[cyh@localhost first_dir]$ ll #查看一下结果,该命令为 ls -l 的缩写,test1~表示备份文件
total 0
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
[cyh@localhost first_dir]$ mv test1 /home/cyh/Desktop/shiyan5 #将test1移动到这个目录
[cyh@localhost first_dir]$ ll /home/cyh/Desktop/shiyan5 #查看结果,有test1文件
total 28
-rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
-rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
-rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh
-rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
-rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
-rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
-rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1
[cyh@localhost first_dir]$
cp (copy)复制文件或目录
命令格式:
cp [选项] 源文件或者目录路径 目标文件或路径
主要选项:
-f (force):强制覆盖同名文件
-b (backup):如果存在同名文件,覆盖前先备份原来的文件。
-r (recursive):以递归的方式复制文件(一个目录里可能还有目录,该该项可以复制目录里面的所有所有)
举例:
[cyh@localhost first_dir]$ ll #查看first_dir内容
total 0
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
[cyh@localhost first_dir]$ cp /home/cyh/Desktop/shiyan5/test1 /home/cyh/Desktop/first #将shiyan5中的test1文件复制到first_dir中
_dir
[cyh@localhost first_dir]$ ll #再次查看first_dir内容
total 0
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:22 test1
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
[cyh@localhost first_dir]$ ll /home/cyh/Desktop/shiyan5 #查看shiyan5内容,test1还在
total 28
-rw-rw-r--. 1 cyh cyh 361 Apr 22 03:24 guess_number.sh
-rw-rw-r--. 1 cyh cyh 228 Apr 22 02:16 identical_filebreaklines2.sh
-rw-rw-r--. 1 cyh cyh 338 Apr 22 02:05 identical_filebreaklines.sh
-rw-rw-r--. 1 cyh cyh 205 Apr 22 01:01 identical_file.sh
-rwxrw-r--. 1 cyh cyh 191 Apr 21 02:18 identical_line.sh
-rwxrw-r--. 1 cyh cyh 214 Apr 21 03:06 identical_user.sh
-rw-rw-r--. 1 cyh cyh 185 Apr 22 02:56 sum_and_product2.sh
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1
[cyh@localhost first_dir]$ cp -r /home/cyh/Desktop/shiyan5 /home/cyh/Desktop/first_di #复制目录,将shiyan5整个目录复制到first_dir中
r
[cyh@localhost first_dir]$ ll #查看一下first_dir中的内容,存在shiyan5且是个目录
total 0
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:26 shiyan5
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:22 test1
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
[cyh@localhost first_dir]$ ll /home/cyh/Desktop #查看一下桌面上的shiyan5还在不在,答案是在
total 218464
drwxrwxr-x. 3 cyh cyh 48 Jul 13 01:26 first_dir
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 63 Jul 6 09:37 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:11 shiyan5
[cyh@localhost first_dir]$
当一个目录里有许多文件时,复制该目录时,应使用递归复制(-r),否则报错哦!
rm (remove):该命令用于删除文件或目录
命令格式:
rm [选项] 文件或路径
-f (force):强制删除文件
-r (recursive):递归的意思,可以删除某目录下的所有文件基子目录
用法举例:
[cyh@localhost first_dir]$ ll #查看该目录下有什么
total 0
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:26 shiyan5
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:22 test1
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:05 test1~
[cyh@localhost first_dir]$ rm test1~ #删除test1~备份文件
[cyh@localhost first_dir]$ ll #查看结果,删掉了
total 0
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:26 shiyan5
-rw-rw-r--. 1 cyh cyh 0 Jul 13 01:22 test1
[cyh@localhost first_dir]$ rm -r /home/cyh/Desktop/first_dir #递归删除first_dir目录中的内容
[cyh@localhost first_dir]$ ll #查看结果,显示温控
total 0
[cyh@localhost first_dir]$
有些文件需要还能加参数 -f ,但是请谨慎操作,一旦使用 -f 删除,就永久删除,无法找回。
rmdir :删除目录,特别注意只能删除空目录
用法举例:
[cyh@localhost shiyan1]$ ll
total 0
drwxrwxr-x. 2 cyh cyh 6 Jul 29 09:58 shiyan2
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
[cyh@localhost shiyan1]$ rmdir shiyan_feikng
rmdir: failed to remove ‘shiyan_feikng’: Directory not empty #提示错误,目录不为空
[cyh@localhost shiyan1]$ ll shiyan2 #shiyan2为空
total 0
[cyh@localhost shiyan1]$ rmdir shiyan2 #空目录删除
[cyh@localhost shiyan1]$ ll
total 0
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
cat (concatenate) :查看文件内容
命令格式:
cat [选项] 文件路径
-n 显示行号(number)
用法举例:
[cyh@localhost shiyan1]$ cat sample.txt #当前目录下查看sample.txt文件内容
The linux system is great
I like it
2023.07.29
[cyh@localhost shiyan1]$ cat -n sample.txt #显示行号
1
2 The linux system is great
3 I like it
4 2023.07.29
[cyh@localhost shiyan1]$ cat --help #其他参数详细如下
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s), or standard input, to standard output.
-A, --show-all equivalent to -vET
-b, --number-nonblank number nonempty output lines, overrides -n
-e equivalent to -vE
-E, --show-ends display $ at end of each line
-n, --number number all output lines
-s, --squeeze-blank suppress repeated empty output lines
-t equivalent to -vT
-T, --show-tabs display TAB characters as ^I
-u (ignored)
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
--help display this help and exit
--version output version information and exit
With no FILE, or when FILE is -, read standard input.
Examples:
cat f - g Output f's contents, then standard input, then g's contents.
cat Copy standard input to standard output.
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'cat invocation'
more :显示内容,首先显示一个屏幕的内容,如果内容过多,一个屏幕显示不下,需要按Enter 键显示下一行,按Space 显示下一屏的内容,按Ctrl + c 退出。
命令格式:
more 文件路径
用法举例,我手套有个人类基因组功能注释文件,很大。
[cyh@localhost Desktop]$ more gen2go.txt
9606 1 GO:0003674 ND enables molecular_function - Function
9606 1 GO:0005576 HDA located_in extracellular region 27068509 Component
9606 1 GO:0005576 IDA located_in extracellular region 3458201 Component
9606 1 GO:0005576 TAS located_in extracellular region - Component
9606 1 GO:0005615 HDA located_in extracellular space 16502470 Component
9606 1 GO:0005886 IBA is_active_in plasma membrane 21873635 Component
9606 1 GO:0008150 ND involved_in biological_process - Process
9606 1 GO:0031093 TAS located_in platelet alpha granule lumen -Component
9606 1 GO:0034774 TAS located_in secretory granule lumen - Component
9606 1 GO:0062023 HDA located_in collagen-containing extracellular
matrix 27559042 Component
--More--(0%)
tail :显示文本文件末尾部分,默认显示10行
命令格式:
tail [选项] 文件路径
-n 指定显示行数
用法举例:
[cyh@localhost Desktop]$ tail gen2go.txt #默认显示最后10行
9606 124188214 GO:0003677 IEA enables DNA binding - Function
9606 124188214 GO:0005634 IEA located_in nucleus - Component
9606 124188214 GO:0030527 IEA enables structural constituent of chromatin - Function
9606 124188214 GO:0046982 IEA enables protein heterodimerization activity - Function
9606 125316803 GO:0005515 IPI enables protein binding 32958672 Function
9606 125316803 GO:0005615 IDA located_in extracellular space 32958672 Component
9606 125316803 GO:0005730 IDA located_in nucleolus 32958672 Component
9606 127138866 GO:0003674 ND enables molecular_function - Function
9606 127138866 GO:0008150 ND involved_in biological_process -Process
9606 127138866 GO:0016020 IEA located_in membrane - Component
[cyh@localhost Desktop]$ tail -n 2 gen2go.txt #指定显示最后两行
9606 127138866 GO:0008150 ND involved_in biological_process -Process
9606 127138866 GO:0016020 IEA located_in membrane - Component
[cyh@localhost Desktop]$ tail --help #查看其他参数及参数详解
Usage: tail [OPTION]... [FILE]...
Print the last 10 lines of each FILE to standard output.
With more than one FILE, precede each with a header giving the file name.
With no FILE, or when FILE is -, read standard input.
Mandatory arguments to long options are mandatory for short options too.
-c, --bytes=K output the last K bytes; or use -c +K to output
bytes starting with the Kth of each file
-f, --follow[={name|descriptor}]
output appended data as the file grows;
an absent option argument means 'descriptor'
-F same as --follow=name --retry
-n, --lines=K output the last K lines, instead of the last 10;
or use -n +K to output starting with the Kth
--max-unchanged-stats=N
with --follow=name, reopen a FILE which has not
changed size after N (default 5) iterations
to see if it has been unlinked or renamed
(this is the usual case of rotated log files);
with inotify, this option is rarely useful
--pid=PID with -f, terminate after process ID, PID dies
-q, --quiet, --silent never output headers giving file names
--retry keep trying to open a file if it is inaccessible
-s, --sleep-interval=N with -f, sleep for approximately N seconds
(default 1.0) between iterations;
with inotify and --pid=P, check process P at
least once every N seconds
-v, --verbose always output headers giving file names
--help display this help and exit
--version output version information and exit
wc (word count) 显示文件行数,单词数,字节数等
命令格式:
wc [选项] 文件列表或目录
-c (character) :显示文件字节数
-l (line) :显示行数
-w (word) : 显示单词数
用法举例:
[cyh@localhost shiyan1]$ wc -clw sample.txt #查看文件行数4,单词数9,字节数48
4 9 48 sample.txt
[cyh@localhost shiyan1]$ cat sample.txt #确认文件(第一行什么都没有,没有内容,也是一行)
The linux system is great
I like it
2023.07.29
[cyh@localhost shiyan1]$ wc --help #查看全部选项详解
Usage: wc [OPTION]... [FILE]...
or: wc [OPTION]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. With no FILE, or when FILE is -,
read standard input. A word is a non-zero-length sequence of characters
delimited by white space.
The options below may be used to select which counts are printed, always in
the following order: newline, word, character, byte, maximum line length.
-c, --bytes print the byte counts
-m, --chars print the character counts
-l, --lines print the newline counts
--files0-from=F read input from the files specified by
NUL-terminated names in file F;
If F is - then read names from standard input
-L, --max-line-length print the length of the longest line
-w, --words print the word counts
--help display this help and exit
--version output version information and exit
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'wc invocation'
date 查看时间(电脑或服务器系统显示时间),也可以修改系统时间
举例:
[cyh@localhost shiyan1]$ date #2023年7月29号下午十点45分55秒星期六
Sat Jul 29 10:45:55 EDT 2023
我一般用于查看脚本运行了多少时间,在命令前后各一个,如下
[cyh@localhost Desktop]$ cat log2.sh #先查看一下脚本内容
#!/bin/bash
echo $(date "+%Y-%m-%d %H:%M:%S") #显示运行for循环结束前系统时间
for i in {1,2,3} #for循环
do
echo "I like R " #循环输出该内容
done
echo $(date "+%Y-%m-%d %H:%M:%S") #显示运行for循环结束后系统时间
[cyh@localhost Desktop]$ bash log2.sh #运行脚本,时间太短,
2023-07-29 10:54:34
I like R
I like R
I like R
2023-07-29 10:54:34
[cyh@localhost Desktop]$
who :列出当前系统的登入用户
命令格式:
who [选项]
-q 显示当前所有登录的用户名及当前在线人数
用法举例:
[cyh@localhost Desktop]$ who #我远程登入使用两个窗口,所以有pts/0与pts/1之分
cyh :0 2023-07-29 09:56 (:0)
cyh pts/0 2023-07-29 09:57 (192.168.1.9)
cyh pts/1 2023-07-29 10:10 (192.168.1.9)
[cyh@localhost Desktop]$ who -q #一个root(cyh),其他是远程登录的不同窗口(可以认为一个账户户不同登入)
cyh cyh cyh
# users=3
[cyh@localhost Desktop]$
在看到这里,观众老爷们会问,什么是文本编辑。这个问题好哇!很容易理解,其实就是编辑文本,像word一样,改变文本内容。常用的文本编辑器是vi ,不同的发行版也有其他的文本编辑器,比如:gedit 、Emacs 、nano 等。我一般使用vim ,vim 是vi 的升级版。
vim 编辑器有三种工作模式:命令模式、编辑模式、末行模式。
命令模式
使用 vi [文件路径] ** 就可以启动vim** 编辑器进入命令模式,文件路径可以指定编辑文件所在位置,如果文件不存在就会创建一个新的文件。使用vi [文件路径] ** 命令后会转调至编辑页面,此时文件还无法输入字符。需要按某个字母就可以进行编辑,并且编辑器最后一行会显示“–INSERT–”** 就表明进入编辑模式可以进行编辑。字母有以下:
编辑模式
在使用命令模式按相应所需字符后,就可以进入编辑模式,该模式下就可以进行文本编辑。如果需要退出就需要按Esc 键重新回到命令模式
末行模式
当文本编辑完成后,按Esc 键由编辑模式回到命令模式,在按 : 号(冒号) 就可以进入末行模式,并在编辑器底部显示 “ : ” ,后面接末行模式下命令提示符,命令提示符如下:
用法举例:
vim /home/cyh/Desktop/sample.txt #使用该命令后会进入编辑器,进入命令模式
#按命令模式中你所需要的字符,例如 i ,在当前光标位置输入文本,编辑器底部出现--INSERT--,进入编辑模式
# 编辑文本.... 编辑后按Esc键,退出编辑模式,进入命令模式,按冒号进入末行模式,编辑器底部出现冒号
#在冒号后输入末行模式你需要的字符后回车,系统按你输入的指令执行
该部分是在学习前面部分的进阶。灵活度与难度较大。但勤加练习又很简单
通配符号有好多种,包括 ** * ** 、? 、[ ] 、- 、! 等
***** 用于用于表示任意长度的任何字符
用法举例:
[cyh@localhost etc]$ cd /etc/abrt
[cyh@localhost abrt]$ ll
total 12
-rw-r--r--. 1 root root 850 Oct 1 2020 abrt-action-save-package-data.conf
-rw-r--r--. 1 root root 2118 Oct 1 2020 abrt.conf
-rw-r--r--. 1 root root 31 Oct 1 2020 gpg_keys.conf
drwxr-xr-x. 2 root root 95 Mar 12 09:47 plugins
[cyh@localhost abrt]$ ls -l /etc/abrt/*.conf #查看该文件下以.conf结尾的文件
-rw-r--r--. 1 root root 850 Oct 1 2020 /etc/abrt/abrt-action-save-package-data.conf
-rw-r--r--. 1 root root 2118 Oct 1 2020 /etc/abrt/abrt.conf
-rw-r--r--. 1 root root 31 Oct 1 2020 /etc/abrt/gpg_keys.conf
? 表示任意一个字符,能够更准确的找到忘记文件名有摸棱两可的文件。
用法举例:
[cyh@localhost Desktop]$ ll
total 218464
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 124 Jul 29 10:53 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 3 cyh cyh 45 Jul 29 10:09 shiyan1
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:11 shiyan5
[cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/???.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 /home/cyh/Desktop/log.txt
[cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/????.txt
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 /home/cyh/Desktop/log2.txt
[cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/??.txt
ls: cannot access /home/cyh/Desktop/??.txt: No such file or directory
[cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/l??.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 /home/cyh/Desktop/log.txt
[cyh@localhost Desktop]$
由上面的结果可以看出,必须是一个问号匹配一个字符。
[ ] 、- 用于指定符号或者是数值的范围,! 表示非(相反的)
用法举例:
[cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/[a-z]*.* #显示a到z开头的所有格式的文件
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 /home/cyh/Desktop/first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 /home/cyh/Desktop/gen2go.txt
-rw-rw-r--. 1 cyh cyh 124 Jul 29 10:53 /home/cyh/Desktop/log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 /home/cyh/Desktop/log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 /home/cyh/Desktop/log.txt
[cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/[g-k]*.* #显示g到k开头的所有格式的文件
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 /home/cyh/Desktop/gen2go.txt
[cyh@localhost Desktop]$ ls -l /home/cyh/Desktop/[!g-k]*.* ##显示除g到k开头外的所有格式的文件
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 /home/cyh/Desktop/first_file.txt
-rw-rw-r--. 1 cyh cyh 124 Jul 29 10:53 /home/cyh/Desktop/log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 /home/cyh/Desktop/log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 /home/cyh/Desktop/log.txt
[cyh@localhost Desktop]$
特殊字符有:分号(; )、& 、转义字符( \ ** )、输入重定向(< 、<<** )、输出重定向(>、>> )、管道符 (| )等
分号(; )
当需要连续运行几条命令并且不想写脚本时,这是命令之间就可以使用分号( ; )隔开,且命令是连续运行的,输出结果是连续运行后的输出结果。
举例如下:
[cyh@localhost Desktop]$ ll #先查看以下桌面的文件
total 218464
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 124 Jul 29 10:53 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 3 cyh cyh 45 Jul 29 10:09 shiyan1
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:11 shiyan5
[cyh@localhost Desktop]$ cd ~ #返回到根目录
[cyh@localhost home]$ cd /home;cd cyh;cd Desktop;cd shiyan1 #使用分号连续执行命令
[cyh@localhost shiyan1]$ #返回结果,目录更该到了shiyan1
正则表达式是一种由特定语法规则定义的模式匹配工具。 在Linux系统中,正则表达式常用于文本处理、日志分析、配置文件修改等任务。 Linux系统中最常见的正则表达式工具是grep、sed和awk。
以下是部分符号含义:
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次。 |
. | 匹配除了换行符外的任意一个字符。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式0次或一次。 |
^ | 匹配行首。例如:^hello会匹配以hello开头的行。 |
$ | 匹配行尾。例如:hello&会匹配以hello结尾的行。 |
[] | 匹配中括号中指定的任意一个字符,只匹配一个字符。例如:[aoeiu]匹配任意一个元音字母;[0-9]匹配任意一位数字;[a-z][0-9]匹配小写字母和一位数字组成的两位字符。 |
[^] | 匹配除中括号中字符以外的任意一个字符。例如:[0-9]匹配任意一位非数字字符;[a-z]匹配任意一位非小写字母。 |
\ | 转义符。用于取消特殊符号的含义。 |
{n} | 表示其前面的字符恰好出现n次。例如:[0-9]{4}匹配任意4位数字,[1][3-8][0-9]{9}匹配手机号码。 |
{n,} | 表示其前面的字符出现不小于n次。例如:[0-9]{2,}表示两位及其以上的数字。 |
{n,m} | 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]{6,8}匹配6到8位的小写字母。 |
[[:XXX:]] | grep工具预定义的一些类,如[[:alpha:]]匹配一个字母。 |
懒得举例了:看这位博主得吧:Linux操作:正则表达式 - 知乎 (zhihu.com)
输入重定向(< 、<< )、输出重定向(>、>> )
一、
输出重定向(>、>> )定向添加某些内容到某地(某文件),可以与echo 命令搭配使用
> 定向添加某些内容到某地(某文件),方式是覆盖输入,就是源文件内容会被覆盖
>> 定向添加某些内容到某地(某文件),方式是在文件末尾加入
例如:
添加内容:I like Linux system 到桌面上 shiyan1 文件夹中 sample.txt 文件中
1、末尾加入,使用 **>> ** , 请谨慎使用,执行前务必检查
[cyh@localhost shiyan1]$ pwd #查看当前目录
/home/cyh/Desktop/shiyan1
[cyh@localhost shiyan1]$ ll #检查是否含有sample.txt文件
total 4
-rw-rw-r--. 1 cyh cyh 48 Jul 29 10:09 sample.txt
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
[cyh@localhost shiyan1]$ cat sample.txt #先查看以下sample.txt里面的内容
The linux system is great
I like it
2023.07.29
[cyh@localhost shiyan1]$ echo "I like Linux system" >>./sample.txt #添加指定内容
[cyh@localhost shiyan1]$ cat sample.txt #查看是否添加了指定内容
The linux system is great
I like it
2023.07.29
I like Linux system
[cyh@localhost shiyan1]$
2、覆盖加入(全部覆盖掉),使用 > ,请谨慎使用,执行前务必检查
[cyh@localhost shiyan1]$ echo "I like Linux system" >./sample.txt
[cyh@localhost shiyan1]$ cat sample.txt
I like Linux system
3、多文件合并
使用多文件合并可以使用cat 命令。
[cyh@localhost shiyan1]$ ll #先查看文件内容(非必须)
total 16
-rw-rw-r--. 1 cyh cyh 80 Aug 17 05:14 cdx.sh
-rw-rw-r--. 1 cyh cyh 94 Aug 17 21:26 ne.txt
-rw-rw-r--. 1 cyh cyh 20 Aug 17 04:52 sample.txt
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
-rw-rw-r--. 1 cyh cyh 14 Aug 17 05:14 z
[cyh@localhost shiyan1]$ cat sample.txt > ne.txt #将sample.txt的内容定向覆盖输入到ne.txt文件中
[cyh@localhost shiyan1]$ cat sample.txt #查看sample.txt文件内容
I like Linux system
[cyh@localhost shiyan1]$ cat ne.txt #查看覆盖后的ne.txt文件内容
I like Linux system
[cyh@localhost shiyan1]$ cat cdx.sh #查看cdx.sh内容
#!/bin/bash
z=3
cat ne.txt > z
while read z
do
echo "the number is ${z} "
done
#这行是空的,无内容
[cyh@localhost shiyan1]$ cat cdx.sh sample.txt >> ne.txt #将两个文件按先后顺序在ne.txt文件末尾加入,结果显示,输入的两个文件只要是cat能看的都可以
[cyh@localhost shiyan1]$ cat ne.txt #查看结果
I like Linux system
I like Linux system
#!/bin/bash
z=3
cat ne.txt > z
while read z
do
echo "the number is ${z} "
done
I like Linux system
[cyh@localhost shiyan1]$
二、
输入重定向(< 、<< )。和输出相似。
用法举例:
[cyh@localhost shiyan1]$ cat < ne.txt #将文件内容重定向入cat查看。
1
2
6
7
23
99
[cyh@localhost shiyan1]$ cat << stop >ne.txt #键盘输入内容,以stop为终止关键字,定向入cat,定向输入到ne.txt文件(覆盖输入)
> The linux is great
> I like it
> stop #结束关键字,在这个之前的内容会被覆盖输入
[cyh@localhost shiyan1]$ cat ne.txt #查看结果
The linux is great
I like it
[cyh@localhost shiyan1]$ cat << end >> ne.txt #同上,在末尾加入
> hallo
> hi
> end
[cyh@localhost shiyan1]$ cat ne.txt #查看结果
The linux is great
I like it
hallo
hi
[cyh@localhost shiyan1]$ cat << lalala >>ne.txt #以lalala结尾
> hhhhhhhhhhhhh
> llllllllllll
> lelelelalala lalala #这行也有个lalala字符串,但是并没有结束输入
> lalala #从输入内容来看,关键字必须占新的一行,否者无法识别
总结:输入输出方面,搞清楚输入输出方向。例如,在举个例子:
[cyh@localhost shiyan1]$ echo "" >ne.txt #将文件里的内容删除(第一行不为空,只是没有内容)
[cyh@localhost shiyan1]$ cat ne.txt #查看文件
[cyh@localhost shiyan1]$ ll #找一下文件,举个例子
total 16
-rw-rw-r--. 1 cyh cyh 80 Aug 17 05:14 cdx.sh
-rw-rw-r--. 1 cyh cyh 1 Aug 17 21:44 ne.txt
-rw-rw-r--. 1 cyh cyh 20 Aug 17 04:52 sample.txt
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
-rw-rw-r--. 1 cyh cyh 14 Aug 17 05:14 z
[cyh@localhost shiyan1]$ cat < cdx.sh >ne.txt #将cdx.sh内容重定向入cat命令,定向输出到ne.txt
[cyh@localhost shiyan1]$ cat ne.txt #查看结果
#!/bin/bash
z=3
cat ne.txt > z
while read z
do
echo "the number is ${z} "
done
[cyh@localhost shiyan1]$
错误输出重定向
在 > 前面加一个2,可以将命令执行过程产生的错误信息于结果区分开来,但都是输出在总端上,因此可以使用重定向输入到文件中保存。
举例:
[cyh@localhost shiyan1]$ ll #查看以下有哪些文件
total 16
-rw-rw-r--. 1 cyh cyh 80 Aug 17 05:14 cdx.sh
-rw-rw-r--. 1 cyh cyh 80 Aug 17 21:45 ne.txt
-rw-rw-r--. 1 cyh cyh 20 Aug 17 04:52 sample.txt
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
-rw-rw-r--. 1 cyh cyh 80 Aug 17 21:55 z
[cyh@localhost shiyan1]$ cat cdx1.sh 2> error.txt #该命令会报错,因为没有这个文件,将信息输入到error.txt文件
[cyh@localhost shiyan1]$ cat error.txt #查看文件内容,是报错提示信息
cat: cdx1.sh: No such file or directory
[cyh@localhost shiyan1]$ ll /home/cyh 2>> error.txt #附加重定向,运行后结果在屏幕输出
total 4
drwxr-xr-x. 4 cyh cyh 137 Jul 29 10:53 Desktop
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Documents
drwxr-xr-x. 3 cyh cyh 19 Mar 15 11:03 Downloads
-rw-rw-r--. 1 cyh cyh 359 Jun 1 01:05 guss.sh
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Music
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Pictures
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Public
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Templates
drwxrwxr-x. 2 cyh cyh 42 Apr 7 07:50 test1
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Videos
[cyh@localhost shiyan1]$ cat error.txt #结果显示,并没有输入在文件中,为什么???因为2表示的是将错误信息输入到文件中,上步命令并没有报错,所以并不会在文件中添加任何信息
cat: cdx1.sh: No such file or directory
那么,我们需要将屏幕输出结果于错误信息都输出到某文件,又该如何操作呢??这是后我们就需要改一下命令,如下:
[cyh@localhost shiyan1]$ ll /home/cyh > error.txt 2>&1 #将屏幕输出结果定向入error.txt文件。并且错误信息也可以输入
[cyh@localhost shiyan1]$ cat error.txt
total 4
drwxr-xr-x. 4 cyh cyh 137 Jul 29 10:53 Desktop
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Documents
drwxr-xr-x. 3 cyh cyh 19 Mar 15 11:03 Downloads
-rw-rw-r--. 1 cyh cyh 359 Jun 1 01:05 guss.sh
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Music
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Pictures
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Public
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Templates
drwxrwxr-x. 2 cyh cyh 42 Apr 7 07:50 test1
drwxr-xr-x. 2 cyh cyh 6 Mar 12 10:18 Videos
[cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>&1 #cyh1文件是没有的
[cyh@localhost shiyan1]$ cat error.txt #将错误信息成功输入到文件
ls: cannot access /home/cyh1: No such file or directory
到这里我们据可以发现为什么没有附加重定向呢?上述代码是不是又两个 > 呢?那怎么操作呢??
看到这里,我们应该了解了。一个 > 是覆盖,两个是末尾附加,那么应该该哪一个呢?我们举例试一下就知道了:
[cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>&1 #先生成一个结果
[cyh@localhost shiyan1]$ cat error.txt #查看一些错误信息,预期结果,没有问题
ls: cannot access /home/cyh1: No such file or directory
[cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>>&1 #我们修改后面为两个>号
-bash: syntax error near unexpected token `&' #报错,没有&这个东西
[cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>>1 #我们删掉&
[cyh@localhost shiyan1]$ cat error.txt #查看结果,结果没有,整个文件为空,所以不行
[cyh@localhost shiyan1]$ ll /home/cyh1 > error.txt 2>&1 #我们修改前面的,先把结果生成一个进去,更好展示
[cyh@localhost shiyan1]$ ll /home/cyh1 >> error.txt 2>&1 #修改前面的
[cyh@localhost shiyan1]$ cat error.txt #展示结果,符合预期,所以我们秩序记住,在文件前面的才是重定向的
ls: cannot access /home/cyh1: No such file or directory
ls: cannot access /home/cyh1: No such file or directory
& 用于后台执行命令,当执行文件需要一定时间时,我们可以挂在后台执行,当前总端就可以执行其他任务。我一般会搭配nohup 使用
举例如下:
[cyh@localhost shiyan1]$ cat cdx.sh & #在结尾加一个& 后台运行,不好用
[1] 3655 #进程号(ID)
[cyh@localhost shiyan1]$ #!/bin/bash
z=3
cat ne.txt > z
while read z
do
echo "the number is ${z} "
done
^C #按Ctrl+c结束,不好用
[1]+ Done cat cdx.sh
[cyh@localhost shiyan1]$ nohup bash cdx.sh & #加一个nohup
[1] 3695
[cyh@localhost shiyan1]$ nohup: ignoring input and appending output to ‘nohup.out’ #它说日志文件输出在‘nohup.out’中
#这里按一个回车
[1]+ Done nohup bash cdx.sh
[cyh@localhost shiyan1]$ ll #我们查看一下是否有‘nohup.out’文件
total 20
-rw-rw-r--. 1 cyh cyh 80 Aug 17 05:14 cdx.sh
-rw-rw-r--. 1 cyh cyh 80 Aug 17 21:45 ne.txt
-rw-------. 1 cyh cyh 137 Aug 17 21:55 nohup.out #在这里
-rw-rw-r--. 1 cyh cyh 20 Aug 17 04:52 sample.txt
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
-rw-rw-r--. 1 cyh cyh 80 Aug 17 21:55 z
[cyh@localhost shiyan1]$ cat nohup.out #查看以下内容
#!/bin/bash
z=3
cat ne.txt > z
while read z
do
echo "the number is ${z} "
done
cdx.sh: line 4: read: read error: 0: Bad file descriptor
[cyh@localhost shiyan1]$ #总结:不好用
到这里,我一般会重定向与**&** 搭配使用,在这里举一个转录组序列比对的例子:
脚本内容:
#!/bin/bash
#maker:YongHongChen
#date:2023-04-24
#This script used to match sequence by hisat2
#the "GRCh38_index" is index file which contain "*.1.ht2" "*2.ht2" ... "*.8.ht2"
#" -p 3 " is thread
#" -1 " input one file;" -2 " input second file;their are can use .fa.gz/.fq format,their were all trimed
#" -S " is a output option that it will generate .sam format file
# Attention: the sam file is so big,if you input 1G .fq file,it will generate about 10G result
a=1
b=2
echo $(date "+%Y-%m-%d %H:%M:%S") #This command is uesd to generate the current time
for i in {1,2,3}
do
echo "ly${i}_${a} and ly${i}_${b} are begin"
hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${b}_paired.fq.gz -S /home/cyh/rna_seq1/hisat2_ed1/ly${i}_mached.sam
echo "ly${i}_${a} and ly${i}_${b} are finish"
echo "NT${i}_${a} and NT${i}_${b} are begin"
hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/NT${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/NT${i}_${b}_paired.fq.gz -S /home/cyh/rna_seq1/hisat2_ed1/NT${i}_mached.sam
echo "NT${i}_${a} and NT${i}_${b} are finish"
done
echo "All complete"
echo $(date "+%Y-%m-%d %H:%M:%S")
执行脚本:
[cyh@localhost shiyan1]$ nuhup bash hisat2.sh >hisat2.txt 2>&1
将所有信息全部输入hisat2.txt文件,包括总端输出信息以及错误信息。
管道符 | ,可以把一系列命令连接起来,把前一个命令的输出结果作为输入输给后面的一个命令,一个接一个。如果你接触过 R 语言中的 %>% 就非常号理解。
用法举例:
[cyh@localhost shiyan1]$ cd /home/cyh/Desktop #更改当前目录
[cyh@localhost Desktop]$ ll #查看当前目录
total 218464
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 124 Jul 29 10:53 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 3 cyh cyh 123 Aug 17 22:54 shiyan1
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:11 shiyan5
[cyh@localhost Desktop]$ cat gen2go.txt | more #使用管道符,将文件的内容more一下
9606 1 GO:0003674 ND enables molecular_function - Function
9606 1 GO:0005576 HDA located_in extracellular region 27068509 Component
9606 1 GO:0005576 IDA located_in extracellular region 3458201 Co
mponent
9606 1 GO:0005576 TAS located_in extracellular region - Co
mponent
9606 1 GO:0005615 HDA located_in extracellular space 16502470 Component
9606 1 GO:0005886 IBA is_active_in plasma membrane 21873635 Co
mponent
9606 1 GO:0008150 ND involved_in biological_process - Pr
ocess
9606 1 GO:0031093 TAS located_in platelet alpha granule lumen -Component
9606 1 GO:0034774 TAS located_in secretory granule lumen - Co
mponent
9606 1 GO:0062023 HDA located_in collagen-containing extracellular
matrix 27559042 Component
--More
脚本内容举例:(不要在乎是否看懂)脚本将序列比对软件(hisat2 )生成的结果 sam 文件给 samtools 排序并转换为 bam 文件。
#!/bin/bash
#maker:YongHongChen
#date:2023-04-24
a=1
b=2
echo $(date "+%Y-%m-%d %H:%M:%S") #This command is uesd to generate the current time
for i in {1,2,3}
do
echo "ly${i}_${a} and ly${i}_${b} are begin"
hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${b}_paired.fq.gz -S | samtools sort -@ 20 -o /home/chyh/rna_seq1/samtools_result/ly${i}.bam /home/cyh/rna_seq1/hisat2_ed1/ly${i}_mached.sam
echo "ly${i}_${a} and ly${i}_${b} are finish"
done
echo "All complete"
echo $(date "+%Y-%m-%d %H:%M:%S")
在这之前,我举例过几个脚本的例子,UU们可能疑惑不知怎么写,那么接下来,我们看看脚本编写,这里我们只用 bash ,不用perl 举例。对 perl 感兴趣的去看其他大佬的文章。
在运行脚本前,我们得又一个脚本文件(这里以**.sh** 文件举例)。
1、创建脚本文件
[cyh@localhost shiyan1]$ touch frist_script.sh #先创建脚本
[cyh@localhost shiyan1]$ ll #查看一下是否创建成功
total 0
-rw-rw-r--. 1 cyh cyh 0 Aug 17 23:16 frist_script.sh
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
[cyh@localhost shiyan1]$ vim frist_script.sh #编写脚本
vim frist_script.sh #创建并编写脚本
2、编写脚本与文本编辑操作一样,直接参考前面得,这里不加以描述。
3、编写内容
如果你编写得是 .sh 的文件,那么就由 bash 执行,如果是 .pl 文件,那么就由 perl 执行。第一行必须是编译方式的描述,并且格式固定
#!/bin/sh
或
#!/bin/bash
如果是 perl 的
#!/bin/perl 或 #!/usr/bin/perl #perl解释器路径
其他内容写你需要的命令。
脚本举例:(for循环后面讲)
#!/bin/bash #如何是bash的第一行必须为这个,或者可以写成 #!/bin/sh
#maker:YongHongChen #创建者名 (非必须,有最好)
#date:2023-04-24 #创建时间(非必须,有最好)
a=1
b=2
echo $(date "+%Y-%m-%d %H:%M:%S") #This command is uesd to generate the current time
for i in {1,2,3}
do
echo "ly${i}_${a} and ly${i}_${b} are begin"
hisat2 -p 3 /home/cyh/Desktop/hugene_dir/GRCh38_index -1 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${a}_paired.fq.gz -2 /home/cyh/rna_seq1/trimmomatic_ed1/ly${i}_${b}_paired.fq.gz -S | samtools sort -@ 20 -o /home/chyh/rna_seq1/samtools_result/ly${i}.bam /home/cyh/rna_seq1/hisat2_ed1/ly${i}_mached.sam
echo "ly${i}_${a} and ly${i}_${b} are finish"
done
echo "All complete"
echo $(date "+%Y-%m-%d %H:%M:%S")
非首行内容
非首行内容写你需要的命令。(注释除外,注释使用**#** 号)
上述脚本中含有变量 a 与 b ,后面再讲,如果学过 C或python ,那就很好理解了
4、执行脚本
bash frist_script.sh #bash 脚本文件
perl frist_script.pl #perl脚本
如果弹出没有权限执行,则给予权限
chmod u+x frist_script.sh #设置可执行权限
注意:执行脚本本身就可以当作执行一条命令,所以脚本里面套一个脚本是可以的。
编写脚本内容之前,我们需要了解一些基础知识。
变量有环境变量与内部变量,环境变量可以理解为整个系统下的默认的变量,在整个系统下通用的变量,是在命令行定义的变更,举个例子:我在终端写 a=3 那么不在重启前,不改变数值前 a=3 。类似于C语言函数外的变量。
变量的定义注意事项(大多编程语言都是这样)
参数变量 | 作用 |
---|---|
$n | N 为数字,$0 代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}。 |
$* | 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体。 |
$@ | 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待。 |
$# | 这个变量代表命令行中所有参数的个数。 |
当我们定义了变量后,就需要取它的值,我们使用** ∗ ∗ 取 值 , 例 如 : ∗ ∗ ** 取值,例如:** ∗∗取值,例如:∗∗a** 取变量a的值
* ∗ ∗ 用 法 有 ∗ ∗ ** 用法有** ∗∗用法有∗∗ 、"$"、$0、 1 、 1、 1、n、KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲、@、$ 、 ? 、 ?、 ?、()、、 、 {}、 、{#}、 [ ] 、 []、 []、-、 ! 、 !、 !、$ 等
上面常用的有 , , ,{},$[] ,用于取值。
[ ] ∗ ∗ 中 括 号 里 写 的 是 表 达 式 , ∗ ∗ []** 中括号里写的是表达式,** []∗∗中括号里写的是表达式,∗∗() 里写的是命令,$? 判断上一个命令是否运行成功。例如:
[cyh@localhost Desktop]$ echo $[5+6]
11
[cyh@localhost Desktop]$ echo $(seq 2 10)
2 3 4 5 6 7 8 9 10
[cyh@localhost Desktop]$ echo $? #判断上一条命令是否执行成功,返回0表示成功
0
[cyh@localhost Desktop]$ lll
bash: lll: command not found...
[cyh@localhost Desktop]$ echo $? #返回非0表示失败,返回值0-255,超出部分%256取余
127
[cyh@localhost Desktop]$
内部变量理解为局部变量,脚本中的变量,脚本中的变量不会影响终端中的变量,在C语言中全局变量不会受到局部变量影响。
[cyh@localhost shiyan1]$ a=0 #全局变量,我定义了一个变量a,它的值为0
[cyh@localhost shiyan1]$ echo $a #我们可以使用echo输出值
0
[cyh@localhost shiyan1]$ cat frist_script.sh
#!/bin/bash
a=1 #脚本中的局部变量
a1=2 #定义变量a1
echo "a=$a"
echo "a1=$a1" #输出变量a1的值,注意需要使用$符号取值
echo "a3=$a3" #这个a3是没有定义的,所以预计会输出空值
[cyh@localhost shiyan1]$ bash frist_script.sh #执行脚本
a=1
a1=2
a3=
[cyh@localhost shiyan1]$ echo $a #执行脚本后全局变量值未改变
0
[cyh@localhost shiyan1]$ echo $a1 #找不到脚本局部变量值,没有被定义的变量为空
[cyh@localhost shiyan1]$
变量只要是赋予它值就一定会改变变量值吗?
不一定,只读变量就不可以随意改变值,只读变量只能查看,不能更改,那么要改变值,咋办??只能重启。
[cyh@localhost Desktop]$ readonly a="tai ku la" #设置只读变量
[cyh@localhost Desktop]$ echo $a #输出a值
tai ku la
[cyh@localhost Desktop]$ a="na zheng shi tai ku la" #更改a值,发现报错
-bash: a: readonly variable
[cyh@localhost Desktop]$
字符串就是一串字符,一个英文句子就是一个字符串,要输出字符串,我们需要用引号包起来。
[cyh@localhost shiyan1]$ echo "I like Linux"
I like Linux
字符串截取 expr substr
从某位置截取指定长度的字符
[cyh@localhost shiyan1]$ expr substr "I like linux" 2 7 #从第二个位置,截取长度为7的子字符,注意空格也占一个位置
like l
字符串定位 expr index
在字符串中查找某元素,返回位置。
[cyh@localhost shiyan1]$ expr index "I like linux" ik #在字符串中查找ik,返回的位置
4
[cyh@localhost shiyan1]$ expr index "I like linux" o #若没有找到,返回0
0
字符串匹配 expr macth
两个字符串,后一个在前一个匹配。默认从起始位置匹配,没有匹配到就返回0值,匹配到就返回能匹配的字符个数
[cyh@localhost shiyan1]$ expr match "I like linux" " li"
0
[cyh@localhost shiyan1]$ expr match "I like linux" "I li"
4
[cyh@localhost shiyan1]$ expr match "I like linux" "I lig" #元素得一样,否者不能匹配
0
计算字符长度 expr length
返回长度数值,一个字符算一个,空格也算
[cyh@localhost shiyan1]$ expr length "I like linux"
12
$变量名 表示取值。
说人话就是C语言中得 if 条件语句等
shell 脚本定义格式如下:
写法一:
if [ 条件表达式 ];then
命令1
elif [ 条件表达式 ];then
命令2
else
命令3
fi #fi 是if反过来写
写法二:
if [ 条件表达式 ]
then
命令1
elif [ 条件表达式 ]
then
命令2
else
命令3
fi
这是多条件分支。也有单个的。如果学过C语言,那就不难了。
if [ 条件表达式 ]
then
命令1
fi
注意:if 后面有个空格,中括号里与条件表达式之间前后有空格,不然会报错。
到这里,UU们蠢蠢欲动了,但是有个问题?条件表达式些啥呢?
接下来我们看看条件表达式,很明显,就是一个式子。
字符串比较
这一部分,是用来比较字符与字符串的
= | 比较两个字符是否相等 |
---|---|
!= | 比较两个字符是否不相等 |
< 或 > | 比较两个字符串长度 |
-n | 判断字符串长度是否大于0 |
-z | 判断字符串长度是否等于0 |
… | … |
用法举例:
[cyh@localhost shiyan1]$ vim frist_script.sh #编写脚本
[cyh@localhost shiyan1]$ cat frist_script.sh #看一下脚本内容
#!/bin/bash
a="I like linux"
b="I like linua"
c="like"
if [ a!=b ]
then
echo "a=b"
elif [ a!=c ]
then
echo "a!=c"
fi
if [ a>b ]
then
echo "a>b"
fi
if [ -n a ]
then
echo "a length > 0"
fi
[cyh@localhost shiyan1]$ bash frist_script.sh #执行脚本
a=b
a>b
a length > 0
[cyh@localhost shiyan1]$
数值比较
这一部分是数值的比较
-eq | 比较两个数是否相等 |
---|---|
-ge | 比较一个数是否大于或等于另一个数 |
-le | 比较一个数是否小于或等于另一个数 |
-gt | 比较一个数是否大于另一个数 |
-lt | 比较一个数是否小于另一个数 |
-ne | 比较两个数是否不相等 |
… | … |
用法举例:
[cyh@localhost shiyan1]$ vim frist_script_number.sh #编写脚本
[cyh@localhost shiyan1]$ cat frist_script_number.sh #查看脚本内容
#!/bin/bash
a=1
b=2
c=1
d=3
if [ $a -eq $b ] #判断等于
then
echo "a=b"
else
echo "a!=b"
fi
if [ $d -gt $b ] #判断大于
then
echo "d>b"
else
echo "d
fi
if [ $d -lt $c ] #判断小于
then
echo "d
else
echo "d>c"
fi
if [ $a -ne $c ] #判断不相等
then
echo "a!=c"
else
echo "a=c"
fi
[cyh@localhost shiyan1]$ bash frist_script_number.sh #执行脚本
a!=b
d>b
d>c
a=c
[cyh@localhost shiyan1]$
文件属性判断
该部分用于判断文件属性
-d | 确定文件是否为目录 |
---|---|
-f | 确定文件是否为普通文件 |
-e | 确定文件是否存在 |
-r | 确定是否对文件设置读许可 |
-w | 确定是否对文件设置写许可 |
-x | 确定是否对文件设置执行许可 |
-s | 确定文件名是否具有大于零的长度 |
… | … |
用法举例:
[cyh@localhost shiyan1]$ ll #查看当前目录文件内容
total 8
-rw-rw-r--. 1 cyh cyh 0 Aug 18 04:51 b
-rw-rw-r--. 1 cyh cyh 291 Aug 18 05:03 frist_script_number.sh
-rw-rw-r--. 1 cyh cyh 193 Aug 18 04:51 frist_script.sh
drwxrwxr-x. 3 cyh cyh 21 Jul 29 09:59 shiyan_feikng
[cyh@localhost shiyan1]$ vim diff_file.sh #创建编写脚本
[cyh@localhost shiyan1]$ cat diff_file.sh #查看脚本内容
#!bin/bash
a="/home/cyh/Desktop/shiyan1/diff_file.sh"
b="/home/cyh/Desktop/shiyan1/file.txt"
if [ -d $a ] #$a表示取a的值
then
echo "$a is not a directory"
else
echo "$a is a file"
fi
if [ -e $b ]
then
echo "file.txt had exist"
else
echo "file.txt not find"
fi
if [ -r $a ]
then
echo "the diff_file.sh is readable"
else
echo "the diff_file.sh is not readable"
fi
[cyh@localhost shiyan1]$ bash diff_file.sh #执行脚本,并返回结果
/home/cyh/Desktop/shiyan1/diff_file.sh is a file
file.txt not find
the diff_file.sh is readable
逻辑操作符
逻辑操作符常见的主要有 && 、|| 、! ,就是或与非啦!这部分内容与C语言 中的类似。
在这之前,我们接触了单个**&** ,与单个**|** ,在这部分我们可以联系起来。
& 表示任务在后台执行
&& 表示前一条命令执行成功时,才执行后一条命令 。
[cyh@localhost Desktop]$ ll #查询目录内容
total 218464
-rw-rw-r--. 1 cyh cyh 0 Jul 11 12:07 first_file.txt
-rw-rw-r--. 1 cyh cyh 28788565 Jun 13 04:00 gen2go.txt
-rw-rw-r--. 1 cyh cyh 194901303 Jun 13 03:58 gene2go
-rw-rw-r--. 1 cyh cyh 124 Jul 29 10:53 log2.sh
-rw-rw-r--. 1 cyh cyh 985 Jul 6 09:38 log2.txt
-rw-r--r--. 1 root root 236 Jul 5 23:12 log.txt
drwxrwxr-x. 3 cyh cyh 109 Aug 19 05:12 shiyan1
drwxrwxr-x. 2 cyh cyh 246 Jul 13 01:11 shiyan5
[cyh@localhost Desktop]$ cat log2.sh && echo "good" #查看已有的文件后输出good
#!/bin/bash
echo $(date "+%Y-%m-%d %H:%M:%S")
for i in {1,2,3}
do
echo "I like R "
done
echo $(date "+%Y-%m-%d %H:%M:%S")
good
[cyh@localhost Desktop]$ cat log22.sh && echo "good" #文件不存在,即无法执行echo
cat: log22.sh: No such file or directory
[cyh@localhost Desktop]$
| 表示管道,上一条命令的输出,作为下一条命令参数(输入)
[cyh@localhost ~]$ echo "I like linux" | wc -l
1
|| 表示上一条命令执行失败后,才执行下一条命令
[cyh@localhost Desktop]$ cat log22.sh || echo "good" #执行失败后执行输出good
cat: log22.sh: No such file or directory
good
case 语句
该语句类似于C 语言中的switch 语句,case 只能判断一种条件。
格式如下:
case $变量名 in
“值1”)
如果变量的值等于值1,则执行此程序1
;; #注意两个分号结尾一个语句
… … … …
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac #倒过来写结束程序
举例如下:
[cyh@localhost Desktop]$ vim case.sh #编写脚本
[cyh@localhost Desktop]$ cat case.sh #查看脚本
#!/bin/bash
read -p "please input number:" -t 30 number #使用read 从键盘输入一个数给变量number
case $number in
"20")
echo "you input number is 20" ;;
"30")
echo "you input number is 30" ;;
*)
echo "you input number is other" ;;
esac
[cyh@localhost Desktop]$ bash case.sh #执行脚本
please input number:30
you input number is 30
[cyh@localhost Desktop]$ bash case.sh #输入数据50
please input number:50
you input number is other
分支语句还有许多,但大多不常用。
for循环
与其他编程语言类似。
写法格式一:
for 变量 in 值1 值2 值3…
do
语句
done
写法格式二:
#for ((变量赋值;测试条件表达式;迭代过程))
for ((i=1;i<=10;i++)) #该写法与C类似,但是注意有两个括号,括号里的数值只是举例,i为变量名
do
语句
done
for ((i=1;i<=10;i++));do 语句;done #如果这样写注意分号
写法三:
for 变量名 in {值1,值2,值3…} #使用大括号将取值括起来,并用逗号隔开
do
语句
done
举例:(脚本)
#!/bin/bash
#maker:YongHongChen
#date:2023-07-08
#This script used to match sequence by hisat2
#the "GRCh38_index" is index file which contain "*.1.ht2" "*2.ht2" ... "*.8.ht2"
#" -p 3 " is thread
#" -1 " input one file;" -2 " input second file;their are can use .fa.gz/.fq format,their were all trimed
#" -S " is a output option that it will generate .sam format file
# Attention: the sam file is so big,if you input 1G .fq file,it will generate about 10G result
a=1
b=2
echo $(date "+%Y-%m-%d %H:%M:%S") #打印当前时间
for i in {1,2,3} #取值我使用括号括起,表示从括号里面取值
do
echo "ly${i}_${a} and ly${i}_${b} are begin"
hisat2 -p 20 --dta -x /home/chenyh/ly_NT_RNAseq/reference_GRCh38/GRCh38_index -1 /home/chenyh/ly_NT_RNAseq/fastp_result/ly${i}_${a}_trimmed.fq.gz -2 /home/chenyh/ly_NT_RNAseq/fastp_result/ly${i}_${b}_trimmed.fq.gz -S /home/chenyh/ly_NT_RNAseq/hisat2_result/ly${i}_mached.sam
echo "ly${i}_${a} and ly${i}_${b} are finish"
done
echo "All complete"
echo $(date "+%Y-%m-%d %H:%M:%S")
[cyh@localhost Desktop]$ vim for.sh
[cyh@localhost Desktop]$ cat for.sh
#!/bin/bash
sum=0
for ((i=0;i<=50;i++))
do
sum=$(( $sum+$i ))
done
echo "the sum of 1+2+3+...+50=$sum"
[cyh@localhost Desktop]$ bash for.sh
the sum of 1+2+3+...+50=1275
while 循环
用法格式:
while [ 条件判断式 ] #注意while后面有个空格,条件判断式两端有空格,否则报错
do
语句
done
用法举例:
#!/bin/bash
i=1
sum=0
#如果变量i的值小于等于50,则执行循环
while [ $i -le 100 ]
do
sum=$(( $sum+$i ))
i=$(( $i+2 ))
done
echo "The sum of 1+2+3+…+50 is: $sum"
[cyh@localhost Desktop]$ vim while.sh #编写脚本
[cyh@localhost Desktop]$ cat while.sh #查看内容
#!/bin/bash
i=1
sum=0
#如果变量i的值小于等于50,则执行循环
while [ $i -le 100 ]
do
sum=$(( $sum+$i ))
i=$(( $i+2 ))
done
echo "The sum of 1+2+3+…+50 is: $sum"
[cyh@localhost Desktop]$ bash while.sh #执行脚本
The sum of 1+2+3+…+50 is: 2500
[cyh@localhost Desktop]$
循环语句还有多个,比如until 等。这里不一一举例。
在循环过程中,会有不同的需求,例如,符合条件需要终止循环,以及退出本轮循环。
break :终止循环。
continue :退出本轮循环,继续下轮循环。
举例如下:
[cyh@localhost Desktop]$ vim while.sh #编写脚本
[cyh@localhost Desktop]$ cat while.sh #查看脚本
#!/bin/bash
i=1
sum=0
#如果变量i的值小于等于50,则执行循环
while [ $i -le 100 ]
do
if [ $i -lt 45 ]
then
sum=$(( $sum+$i ))
i=$(( $i+2 ))
continue; #退出本轮循环,后续语句不执行
echo "$i < 45"
fi
echo "$i > 45"
break; #结束循环
done
echo "The sum of 1+2+3+…+45 is: $sum"
[cyh@localhost Desktop]$ bash while.sh #执行脚本
45 > 45
The sum of 1+2+3+…+45 is: 484
[cyh@localhost Desktop]$
Linux 有多个用户,主要类型如下:
在这部分有许多关于用户管理的相关命令,如下:
useradd 命令
功能:增加用户账号,但是要使用root 用户创建。
用法格式:useradd [选项] 用户名
主要参数:
-e (expire):使用“YYYY-MM-DD”的格式指定用户账号过期日期
-d (directory):该选项后面指定路劲参数,用于指定用户主目录路径
-G :该选项后面需给出组群ID或组群名称参数,用于指定用户所属的附加组群
-g :该选项后面需给出组群ID或组群名称参数,用于指定用户所属的初始组群
-u :该参数用于指定用户UID,需在后面给出数字参数
-r :创建的用户为系统用户
举例:
useradd -u 1000 cyh #添加普通用户,UID为100
useradd -r cyh #添加系统用户
passwd 命令
功能:设置用户密码。(需要root账户)
格式:
passwd [选项] [用户]
部分选项:
-d (delete):删除用户账户密码,用户登入不需要密码
-l (lock):锁定用户账户
-u (unlock):解锁用户账号
-S (status):查看用户密码状态
用法举例:
[root@localhost cyh]# passwd -S cyh #查看用户的密码状态
cyh PS 1969-12-30 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@localhost cyh]# passwd cyh #更改用户(cyh)密码
Changing password for user cyh.
New password: #输入密码的过程密码密码不会显示,不是你的键盘失灵
Retype new password:
passwd: all authentication tokens updated successfully.
id 命令
功能:查看用户账号UID,GID
格式:
id 用户名
用法举例:
[root@localhost cyh]# id cyh
uid=1000(cyh) gid=1000(cyh) groups=1000(cyh),10(wheel)
userdel 命令
功能:删除用户账户
格式:
userdel [选项] 用户名
参数:
-r :删除用户的主目录和邮件文件内容
一、使用yum 安装软件。
我安装软件通常使用两种方式,然而Linux安装软件有多种方式,目前centos 可以使用yum 进行软件的安装与升级。但是,并不是所有软件yum 都含有,可以把yum 理解为手机应用商店。
yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
yum 是基于rpm 的软件在线管理器,部分参数如下:
install [软件名列表] :安装列表中的软件。
update [软件名列表]:更新列表中的软件包。(不另加任何参数情况下)
remove [软件名列表]:移除列表中的软件包。(删除/卸载软件)
list [软件名列表]:列出软件包的各种信息。
clean [软件名列表]:清除yum 缓存。另加参数all 删除所有缓存。
…
yum常用命令
列出所有可更新的软件清单命令:yum check-update
更新所有软件命令:yum update
仅安装指定的软件命令: yum install
仅更新指定的软件命令:yum update
列出所有可安裝的软件清单命令:yum list
删除软件包命令:yum remove
查找软件包命令:**yum search **
清除缓存命令:
我使用yum 安装软件的步骤。
我们需要的软件包不清楚yum 源中是否有,我可以查询一下,以samtools 软件为例:
下面例子中出现了该包的一些信息,但是没有显示可以安装,可能yum 源中没有。
[cyh@localhost Desktop]$ yum search samtools
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
* base: ftp.sjtu.edu.cn
* centos-sclo-rh: ftp.sjtu.edu.cn
* centos-sclo-sclo: ftp.sjtu.edu.cn
* elrepo: dfw.mirror.rackspace.com
* epel: ftp.cse.buffalo.edu
* extras: ftp.sjtu.edu.cn
* updates: ftp.sjtu.edu.cn
ius 209/209
================================= N/S matched: samtools ==================================
samtools.x86_64 : Tools for nucleotide sequence alignments in the SAM format
Name and summary matches only, use "search all" for everything.
[cyh@localhost Desktop]$
对于yum 源中有的软件包,只需要使用install 安装。(需要使用管理员账户)
[root@localhost Desktop]# yum install gcc #
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Could not get metalink https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=x86_64 error was
14: curl#6 - "Could not resolve host: mirrors.fedoraproject.org; Unknown error"
* base: mirrors.bfsu.edu.cn
* centos-sclo-rh: mirrors.bfsu.edu.cn
* centos-sclo-sclo: mirrors.bfsu.edu.cn
* elrepo: mirror-hk.koddos.net
* epel: dfw.mirror.rackspace.com
* extras: mirrors.bfsu.edu.cn
* updates: mirrors.bfsu.edu.cn
http://mirrors.qlu.edu.cn/centos/7.9.2009/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirrors.qlu.edu.cn; Unknown error"
.
.
.
http://mirrors.bfsu.edu.cn/centos/7.9.2009/updates/x86_64/Packages/kernel-headers-3.10.0-1160.95.1.el7.x86_64.rpm: [Errno 14] curl#6 - "Could not resolve host: mirrors.bfsu.edu.cn; Unknown error"
Trying other mirror.
Error downloading packages:
glibc-headers-2.17-326.el7_9.x86_64: [Errno 256] No more mirrors to try.
kernel-headers-3.10.0-1160.95.1.el7.x86_64: [Errno 256] No more mirrors to try.
glibc-devel-2.17-326.el7_9.x86_64: [Errno 256] No more mirrors to try.
gcc-4.8.5-44.el7.x86_64: [Errno 256] No more mirrors to try.
cpp-4.8.5-44.el7.x86_64: [Errno 256] No more mirrors to try.
对于使用yum ,可以另外装一些源,源可以理解为不同得应用商店。
这部分自行百度(没有空写了)。我安装得源有Remi 、EPEL 、php 等。
对于yum 源中没有的软件包,我们可以直接浏览器找到官网复制下载链接。 linux 下使用wget 命令下载(或其他)。后续直接解压(部分需要编译)
一:对于不需要编译的软件,以Hisat2 软件为例:
1、使用 **wget **下载 **Hista2 **安装包(该地址可能会变,仅供参考)
[root@localhost Desktop]# wget ftp://ftp.ccb.jhu.edu/pub/infphilo/hisat2/downloads/hisat2-2.1.0-Linux_x86_64.zip
2、解压(压缩包为**.zip** 文件,使用unzip 解压)
[root@localhost Desktop]# unzip unzip /home/cyh/biosoft/hisat2-2.1.0-Linux_x86_64.zip
3、配置环境,将信息写入 ~/.bashrc 或者 /etc/profile
[root@localhost Desktop]# vim ~/.bashrc #编辑该该文件
export PATH="/你的全路径/hisat2-2.1.0: $PATH" #在~/.bashrc文件末尾输入这行内容,路径是你自己的
[root@localhost Desktop]# source ~/.bashrc #重启文件,立即生效
二、对于需要编译的软件(以samtools 为例)
#安装依赖,该软件需要依赖
[root@localhost Desktop]# yum install bzip2-devel ncurses-libs ncurses-devel xz-devel zlib-devel
[root@localhost Desktop]# wget https://github.com/samtools/samtools/releases/download/1.17/samtools-1.17.tar.bz2 #download packages
[root@localhost Desktop]# tar -jxvf samtools-1.17.tar.bz2 #解压
解压后,你会得到一个文件夹,文件名一般是软件名称带版本信息,例如:samtools-1.17
进入该文件,你会看到文件里面含有configure 的文件夹(与之同级的还有许多源代码文件),含有这个文件的一般都是需要编译的。
在于configure 同级目录里输入以下内容:(注意路径是你的路径,不是我的)
[root@localhost Desktop]# ./configure --prefix=/home/lh/biosoft/samtools-1.17 #进入samtools-1.17文件,注意路径是你的目录,需要全路径
然后依次执行下面语句,不会报错就不要管他,千万不要中断,让他跑,可能会要一点时间,取决你的电脑编译速度于软件大小。(注意:make命令你电脑得先有或者这个命令安装过了)
[root@localhost Desktop]# make #编译
[root@localhost Desktop]# make install #编译后安装
最后按上述方法配置好环境。
我的建议是,不能死磕yum ,有可能你需要的包没有或很难安装或者有各种各样的依赖。:在安装软件部分,最稳妥,最方便,最不会掉进坑的技巧是直接浏览器搜索某软件如何安装,例如:linux下samtools软件如何安装。有大量教程避免走弯路。
本文结束,如果您能看到这里,那么对于Linux,应该是比较熟悉了。但是,也许你会发现一个问题,本篇博客并不是Linux系统得全部内容,以上便是我总结得,常用得一些命令与知识点,里面有些知识解释得并不全面,如果,你感兴趣,可以自行探索。然后对于以上内容有问题,可以留言。