Linux Shell 常用命令 - 01篇
0. 在线使用 Linux Shell
JS/UIX - Terminal
地址:https://www.masswerk.at/jsuix/index.html
进入后,点击open terminal即可。它提供简单的终端环境,没有自带gcc等编译套件,不过练习基本命令和shell脚本还是可以的。
1. 常用命令
1.1 ls 命令 - 显示指定工作目录下的内容
显示指定工作目录下的内容(列出目前工作目录所含之文件及子目录)
语法:
ls [-alrtAFR] [name...]
参数:
-a: 显示所有文件及目录 (.开头的隐藏文件也会列出)
-l: 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
ls -l 可写作 ll
常用写法:
>ll
>ls -al
结合 grep
使用:(关于 grep
的详细介绍见系列文章2)
示例:查看文件 log.txt 是否存在于当前目录下:
>ls | grep log.txt
log.txt
>ls -al | grep log.txt
-rw-rw-r--. 1 mozhiyan mozhiyan 0 4月 15 17:26 log.txt
(关于 Linux 管道使用竖线|
的详细介绍见系列文章2)
1.2 cat: 查看文件内容
1.3 touch: 创建文件
此时,若想往text2中写入内容,可用 echo "hello word">>text2
>>
代表在末尾追加,若使用>
则会把之前的内容覆盖:
当然,也可直接使用 vim text2
对文件进行编辑
注:无论是 echo "hello">file
还是 echo "hello">>file
,如果file不存在都会先创建file文件
类似的用法有:cat ./result.lst>>aa.txt
(将result.lst文件中的内容追加到aa.txt的末尾)
1.4 mv - 为文件或目录改名、或移入其它位置
👆注:若test目录不存在,则该命令将text4重命名为test
1.5 rm - 删除一个文件或者目录
删除文件:rm 文件名
删除文件夹:rm -r 文件夹名
。-r
将目录及以下之档案亦逐一删除
-f
直接删除,无需逐一确认,见如下示例:
删除当前目录下的所有文件及目录:
rm -rf *
文件一旦通过rm
命令删除,则无法恢复,所以须格外小心地使用该命令。
1.6 cp - 复制文件或文件夹
语法:
cp [options] source dest
参数:
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件。
例如,将当前路径下的a.txt复制到另外一个文件夹下:
>cp a.txt /data/test/
将文件夹xgb_pipeline复制到另一个路径下:
>cp -r xgb_pipeline /data/test/
将当前路径下的多个文件复制到另一个路径下:
>cp a.txt b.json /data/test/
2. 压缩打包命令 - tar、zip、unzip
来自 https://blog.csdn.net/weixin_44901564/article/details/99682926
打包与压缩的区别:
打包是指将多个文件或者目录放在一起,形成一个总的包,这样便于保存和传输,但是大小是没有变化的。压缩是指将一个或者多个大文件或者目录通过压缩算法使文件的体积变小以达到压缩的目的,可以节省存储空间。
tar命令可以进行打包或压缩、解压,zip与unzip主要进行压缩与解压。
(用于压缩时,tar与zip的主要区别:tar命令主要用于unix系统下,zip命令主要用于windows 系统下。例如想要在unix系统压缩文件后传给windows系统使用,一般会使用zip命令,进行解压更加方便)
2.1 tar命令
tar命令常用参数
参数 | 描述 |
---|---|
-z |
是否同时具有gz属性 |
-j |
是否同时具有bz2属性 |
-J |
是否同时具有xz属性 |
-x |
解压缩、提取打包的内容 |
-t |
查看压缩包内容 |
-c |
建立一个压缩,打包文档 |
-C |
切换到指定目录,表示指定解压缩包的内容和打包的内容存放的目录 |
-v |
显示压缩或者打包的内容 |
-f |
使用文件名,在f后面要接压缩后的文件的名字,只要用到tar命令,-f选项是必须要用的,-f参数在使用的时候一定排在其他参数的后面,在最右边 |
-p |
保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件 |
-P |
保留绝对路径 |
2.1.1 打包
2.1.2 压缩
Linux主要有三种压缩方式:
- gzip:是公认的压缩速度最快,压缩大文件的时候与其他的压缩方式相比更加明显,历史最久,应用最广泛的压缩方式
- bzip:压缩形成的文件小,但是可用性不如gzip
- xz:是最新的压缩方式,可以自动提供最佳的压缩率
建议压缩的时候标明后缀:
参数 | 描述 | 命名方式 |
---|---|---|
-z |
用于gzip压缩方式 | 文件名.tar.gz |
-j |
用于bzip2压缩方式 | 文件名.tar.bz2 |
-J |
用于xz压缩方式 | 文件名.tar.xz |
2.1.3 解压
tar命令在解压时不需要指明压缩的方式,它会自己选择跟压缩方式对应的方式去解压
(解压命令 tar -xf Golden.apk.tar.gz
)
2.1.4 补充
a.在打包和压缩的过程中,我们有时会看到这样的语句:tar: 从成员名中删除开头的“/”,这个并不是报错,是因为没有加上-P选项,没有保留原来的绝对路径去打包或者压缩,提取打包的内容跟解压一样,下面举一个例子:
解压的时候同理,如果在压缩文件的时候使用了-P选项,那么在解压时也要加上-P选项,不然也会出现tar: 从成员名中删除开头的“/”
b.在使用tar压缩或者打包的时候,可以通过增加 --exclude
来达到排除指定的文件的目的
压缩文件同理。
c. 使用 -r
选项增加.tar归档文件的内容
通过 tar --help
命令查看帮助
-r
选项的作用:把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中
使用实例:
(先将1进行归档,再追加2)
1.归档操作
生成.tar文件,目录归档完毕
2.将calculating_time.sh追加进入.tar文件中
查看.tar文件的归档信息:
可以看到calculating_time.sh文件已经被追加到档案的末尾了。
2.2 zip命令和unzip命令
在使用 zip 跟 unzip 命令之前先查看系统有没有安装这两个命令的包,没有的话要自己安装。
查看有没有安装zip跟unzip命令的命令:
rpm -q zip unzip
如果安装了,则会显示出命令的版本号
2.2.1 zip命令
基本用法:
zip [参数] [压缩包名] [压缩的目录或者文件的路径]
示例:
>zip -r xgb_pipeline.zip xgb_pipeline
zip命令常用参数
参数 | 描述 |
---|---|
-m |
将文件压缩后,删除原文件 |
-o |
将压缩文件内的所有文件的最新变动时间设为压缩的时间 |
-q |
安静模式,在压缩的时候不显示指令执行的过程 |
-r |
递归压缩,将自定目录下的所有子文件以及文件一起处理 |
-x |
”文件列表“,压缩时排除文件列表中的文件 |
实例
2.2.2 unzip命令
直接使用:
unzip xxx.zip
便可解压到当前目录下。
基本用法:
unzip [参数] [压缩文件] (-d [目录]) //如果不使用括号内的内容,则解压文件到当前工作目录
unzip命令常用参数
参数 | 描述 |
---|---|
-c |
将解压缩的结果显示到屏幕上(显示每一个目录下的每一个文件的内容),同时对字符做适当的转换,但是并没有解压压缩包 |
-l |
显示压缩文件内所包含的文件 |
-t |
检查压缩文件是否正确 |
-v |
执行时显示压缩文件的详细信息 |
-q |
安静模式,执行时不显示任何信息 |
-d |
指定文件解压后存储的目录 |
-x |
指定不要处理压缩文件中的那些文件 |
实例
a.将harry.zip压缩包解压缩的结果显示出来:
具体会显示到每一个文件跟每一个文件的内容
b.显示jihe.zip压缩包里面所包含的文件
c.检查dajihe.zip压缩文件是否正确
全部OK表示全部文件都是正确的
d.不解压压缩文件dajihe.zip,查看压缩包里面的内容(查看显示的文件列表还包含压缩比率)
使用-v
显示的信息比使用-l
显示的信息更加详细
e.将dajihe.zip压缩包解压到/opt/目录下:
注:
unzip -l dajihe.zip
unzip -v dajihe.zip
unzip -c dajihe.zip
都不会解压,只是查看
unzip dajihe.zip会解压
3.Linux属主权限,chgrp,chown,chmod
【示例】可使用 chmod +x 文件名
使文件变为可执行文件,例如:
👆 输入i
进行编辑模式,完成后,按esc
再输入:wq
保存并退出
👆 可以看到此时run.sh处于不可执行状态
成功执行
4. shell 命令行参数
参考
http://c.biancheng.net/cpp/view/2739.html
http://blog.csdn.net/jake_tian/article/details/97274630
运行脚本时通过命令行传递给脚本的参数称为命令行参数。
变量 | 含义 |
---|---|
$0 |
当前脚本的文件名 |
$n |
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,获取第一个参数是$1,获取第二个参数是$2,以此类推 |
$# |
传递给脚本或函数的参数个数 |
$* |
传递给脚本或函数的所有参数。 |
$@ |
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同 |
$? |
上个命令的退出状态,或函数的返回值。 |
例:有脚本如下:(test.sh)
#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "Second Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"
运行:
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
关于$?
:上条命令的返回值。0表示没有错误,其他任何数值表示有错误。
(参考:
https://blog.csdn.net/aLLLiyyy/article/details/103184367
https://blog.csdn.net/weixin_39928768/article/details/111582889)
例如:如果上条命令执行失败,则重复尝试3次,shell脚本如下:
cnt=0
python test.py
while(($?==1 && cnt<3))
do
sleep 30 # 休眠30s
let cnt++
python test.py
done
5. shell 变量
(参考:
https://www.runoob.com/linux/linux-shell-variable.html
http://c.biancheng.net/view/743.html)
定义变量时,变量名不加$
,如:
>a=10
注:变量名和等号之间不能有空格
使用一个定义过的变量时,在变量名前加 $
,如:
>a=10
>echo $a
>echo ${a}
变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。
已定义的变量,可以被重新定义:
>a=10
>echo $a
10
>a=20
>echo $a
20
注:第二次赋值的时候不能写成 $a=20
,使用变量时才加 $
将命令的结果赋值给变量:
两种方式:
variable=`command`
variable=$(command)
第一种方式把命令用反引号包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;第二种方式把命令用$()包围起来,区分更加明显,推荐使用这种方式。
例:
6. shell 字符串
6.1 单引号
str='this is a string'
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
例:
your_name='runoob'
str='Hello, I know you are $your_name'
echo $str
运行结果:
Hello, I know you are $yourname
- 单引号字符串中不能出现单独一个的单引号(转义后也不行),但可成对出现,作为字符串拼接使用
6.2 双引号
your_name="runoob"
str="Hello, I know you are \"$your_name\"!"
echo $str
运行结果:
Hello, I know you are "runoob"!
your_name='runoob'
str="Hello, I know you are '$your_name'!"
echo $str
运行结果:
Hello, I know you are 'runoob'!
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
7. shell 基本运算符
参考 https://www.runoob.com/linux/linux-shell-basic-operators.html
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如expr。expr是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加:
#!/bin/bash
val=`expr 2 + 2` # 或写为 val=$(expr 2 + 2)
echo "两数之和为: $val"
# 结果
两数之和为: 4
👆 注:表达式和运算符之间要有空格,例如 2+2
是不对的,必须写成 2 + 2
另一种写法,利用(())
:(详细介绍见系列文章2)
7.1 算数运算符
注:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b]
是错误的,必须写成 [ $a == $b ]
。(方括号之间要有空格,运算符和变量之间也要有空格)
(关于方括号的详细介绍见系列文章2)
7.2 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
7.3 布尔运算符
7.4 逻辑运算符
7.5 字符串运算符
FYI
系列文章篇2:
Linux Shell 常用命令 - 02篇