发行版 = 内核版 + GNU软件 + 封闭源码软件。
1991年Linux诞生。
常用的Linux发行版:
ubuntu对软件包定义了两种状态:期望状态和当前状态。
【dpkg】
最早的Deb包管理工具
dpkg + 选项 + 参数
选项 | 含义 |
---|---|
-i | 安装软件 |
-R | 安装一个目录下面所有的软件包 |
【apt】
sudo apt-get install + 软件名
sudo apt-get remove +软件名
【synaptic】
useradd 用户名
adduser 用户名
用useradd创建账户不会创建同名的用户目录、不会自动选择shell脚本、不会设置密码等。而adduser则不会出现上述问题。
login
进行登录和不同账户间切换logout
注销exit
: 退出shell界面passwd
:修改登录的口令shutdown(-h)
、 halt
(只有root用户能用)、 poweroff
shutdown(-r)
、init
、reboot
pwd
:获取当前所在的目录cd
:更改当前目录mkdir
:在当前目录下创建新的目录(后跟多个名可同时创建多个目录)rmdir
:删除一个空目录mv
:让一个目录向另一个目录移动或重命名文件。该命令的功能是把文件移动到指定的目录
mv test testdir
:将test文件移动到testdir目录下cp
:复制目录或文件
cp ex000 /dir111
:ex000被复制到dir111中cp ex111 ex111_1
:可实现复制文件后并重命名,在当前目录下存在原文件和重命名后的源文件。也就是这两个都存在。rm -rf
:删除不是空目录的目录(文件夹)(里面有东西)。删除目录或文件touch
:创建一个文件;也可以更改文档或目录的日期时间。
touch ex030308
:创建一个文件touch -at 04011011 ex030308
:修改访问时间ls
:查看目录和文件
ls -a
:查看所有文件(包括“.”开头的隐藏文件)ls -i
:可以显示文件索引节点号ls -l
:列出文件的详细信息(如创建者、创建时间、文件读写权限等)ls -m
:用 “,”来分隔每个文件和目录的名称ls -R
:列出当前工作目录下的所有文件和子目录tree
:以树状图列出文件的目录内容
tree -l
tree -i
:不以阶梯状列出文件或目录名称tree -a
:查看所有文件(包括隐藏文件)tree -s
:列出文件会目录的大小tree -t
:按文件和目录的更改时间进行排序file
:显示文件或文件系统的详细信息start
:显示文件详细信息cat
:创建和显示文件。创建并写入,然后Ctrl+D退出并保存文件。
cat > ex030401
:创建并写入cat -n ex030401
:对输出的内容以行为单位编号进行显示chmod
:改变文件权限。
chmod 【u/g/o/a】【+/-/=】【r/w/x】
chmod 777 ex111
、chmod a=rwx ex111
选项 | 解释 | 选项 | 解释 |
---|---|---|---|
u | 表示用户(user,指文件或目录所有人) | - | 表示移除权限 |
g | 表示同组用户(group,与文件或目录所有人组ID相同的用户) | = | 表示重置权限 |
o | 表示其他用户(others) | r | 表示读取文件或目录的权限(read) |
a | 表示所有用户(all) | w | 表示写入文件或目录的权限(write) |
+ | 表示添加权限 | x | 表示执行的权限(execute) |
more
:分页显示文件内容
less
:分页自由显示文件
head
:指定显示文件的前若干行
head -12 ex1111
:显示前12行内容tail
:查看文件末尾指定的若干行内容
tail -12 ex1111
:显示后12行内容对文件内容进行排序、在文件中查找指定内容、对文件内容进行剪切、粘贴和统计等。
sort
:对文件内容进行排序
sort -r ex1111
uniq
:检查文件中重复内容,可以报告或删除文件中重复的行。
uniq
命令显示文件内容时,重复内容仅显示一次grep
:在文件中查找指定内容
grep 'a' ex111
:在ex111中查找所有包含字母a的行并显示出来grep -c 'a' ex111
:显示ex111中包含字母a的行数diff
:对两个文件进行比较diff3
:对三个文件进行比较sdiff
:合并两个文件,并以交互的方式输出结果。cmp
:逐字节对不同文件进行比较
cmp -l ex111 ex222
:列出所有不一样的地方comm
:对两个有序文件进行比较
cut
:剪切数据
cut -b 2 ex111
:-b在处理中文文档时会有乱码;2–每行的第二个字符cut -c 3 ex111
:-c在不会出现乱码cut -d 'b' -f 2 ex111
:
paste
:对文件内容进行粘贴
paste ex111 ex222
:将222的内容粘贴到111中去wc
:统计指定文件中的字符数、单词数和行数,并将结果统计输出
wc -c ex111
:查看文件中的字符数wc -w ex111
:查看文件中的单词数wc -l ex111
:查看文件中的行数find
:在本地硬盘中搜索文件或目录
find -name "ex*"
:使用模糊查询查找当前工作目录下所有以”ex“开头的文件find -atime -1
:搜索一天之内被存取过的文件find / -empty
:查找系统中为空的文件或文件夹locate
:在数据库中查找文件。对于刚创建的文件,立即使用该命令会搜索不到所创建的文件。比find快。whereis
:查找指定位置的文件位置。
which
:查找可执行文件的位置
检查磁盘空间、挂载和卸载文件系统、显示和分配配额等。
df
:检查磁盘空间占用情况
df -h
:显示磁盘空间df -T
:列出文件系统的类型df -t
:查看选定文件系统的磁盘信息df -x
:不显示选定的文件系统的磁盘信息du
:查看目录或文件所占磁盘空间大小
-h
、-s
、-a
mount
:将文件系统挂载到指定的挂载点上quota
:检查磁盘的使用空间与限制、对磁盘进行配额edquota
:为用户或工作组指定磁盘配额repquota
:显示文件系统的配额信息quotaoff
:关闭指定文件系统的磁盘配额功能umount
:卸载文件系统zip
:产生具有“zip”扩展名的压缩文件
zip ex111.zip ex111
zip -d ex111.zip ex111
:删除压缩包中的ex111文件zip -m
:向压缩文件中添加文件unzip
:对.zip类型的文件进行解压
unzip -o ex111.zip
:覆盖原先文件unzip -n ex111.zip
:不覆盖原先文件zipinfo
:列出压缩文件的信息gzip
:产生具有“gz”扩展名的压缩文件gunzip
:对“gz”压缩包进行压缩bzip2
:产生具有“bz2”扩展名的压缩文件bunzip2
:解压相应格式的文件bzip2recover
:修复压缩包compress
:产生扩展名为“.z"的压缩文件uncompress
:解压“.z"的压缩文件dump
:将目录内的文件进行备份tar
:备份man
:获取命令的帮助whatis
:查看一个命令执行什么功能help
:查看一个内部命令的帮助信息info
:获取帮助clear
:清屏echo
:在显示器上显示一段文字,一般起到一个提示的作用
echo $(pwd)
:使用echo命令输出当前工作目录date
:显示时间和日期cal
:显示日期,以日历的形式ps
:查看当前进程
ps -A
:查看所有的进程ps U user01
:查看user01用户的所有进程kill
:终止某一进程last
:显示最近登录系统的用户信息history
:显示历史指令。默认保留最近执行的1000条指令如何使用vi编辑器对文件进行访问、如何在编辑文件时实现光标移动、如何实现对文本的修改以及如何更改vi编辑器的设置等
(1)命令模式
(2)插入模式
(3)底线模式
vi
:创建一个文件并进入vi编辑器:w
:对文件内容进行保存:n
:继续编辑后续文件(如果有多个文件):N
:返回之前的文件进行编辑(有多个文件):rew
:直接返回第一个文件进行编辑:q
:退出编辑器:q!
:不存盘退出文件,强制退出:wq
:保存并退出:wq!
:强制保存并退出:w 文件名
:文件另存:1,7 write 文件名
:部分文件另存:1,9 w! 文件名
:覆盖或替换掉文件中部分内容:10,12 w >> 文件名
:将当前文件中的内容添加至以后文件的末尾。(向【文件名】中追加内容):set numbet
:显示行号:set nonumber
:关闭行号操作按键 | 功能 | 操作按键 | 使用组合键移动 |
---|---|---|---|
→ | 将光标向右移动 | l | 7→ == 7l |
↓ | 将光标向下移动 | j | 5↓ == 5j 向下移动5个字符 |
← | 将光标向左移动 | h | |
↑ | 将光标向上移动 | k |
在包含单词的文档中,单词间默认以空格分开
操作按键 | 功能 | 移动多个单词 |
---|---|---|
w | 将光标移动到下一个单词开头 | 3w |
b | 将光标向前移动一个单词 | 2b |
e | 将光标移动到单词的词尾 | 5e |
操作按键 | 功能 | 示例 |
---|---|---|
f+任何字母键 | 将光标移动到文本中下一个所指定的字母 | fy |
任意数字键+| | 将光标移动到数字键指定的字符位置(每行第一个字符标记为1) | 23| |
$ | 将光标移动到当前行的行末 | $ |
^ | 将光标移动到当前行的行首 | ^ |
操作按键 | 功能 | 示例 |
---|---|---|
数字+G | 将光标移动到数字对应行的行首(若只输入G,则可直接移动到文件最后一行) | 10G |
:任意数字 | 将光标移动到数字对应行的行首 | :10 |
:$ | 将光标移动大文件最后一行行首 | :$ |
- | 将光标向上移动一行 | – |
+ | 将光标向下移动一行 | ++ |
将光标移动到屏幕上的特定位置。
操作按键 | 功能 | 示例 |
---|---|---|
M | 将光标移动至当前屏幕中间 | M |
L | 将光标移动至当前屏幕最下方 | L |
H | 将光标移动至当前屏幕最上方 | H |
通过移动屏幕上显示的内容来调整光标所在的位置。
操作按键 | 功能 | 实例 |
---|---|---|
Ctrl+D | 向下移动半屏文本内容 | Ctrl+D |
Ctrl+U | 向上移动半屏文本内容 | Ctrl+U |
Ctrl+F | 显示文件下一屏的文本内存 | Ctrl+F |
Ctrl+B | 显示文件上一屏的文本内容 | Ctrl+B |
命令 | 功能 | 命令 | 功能 |
---|---|---|---|
i | 在光标当前位置左侧插入文本 | I | 在行首插入文本 |
a | 在光标当前位置右侧插入文本 | A | 在行末插入文本 |
O(大写) | 在光标当前位置上方插入文本 | o(小写) | 在光标当位置下方插入文本 |
/字符串
:在命令模式下输入,查找匹配的字符串n
:继续向前查找(但是光标是往后走) 或者 /字符串
N
:继续向后查找 或者 ?字符串
r
:单个字符替换。将光标移动到想替换的字符处,按下r
,在输入要替换的字符即可,再按Esc返回即可替换完成R
:逐字符覆盖文本。输入的每个字符都将逐个替换光标所造位置的字符,直到按下Esc键返回命令模式为止。操作(在命令模式下) | 功能 |
---|---|
cw | 修改单词,(先要查找) |
cc | 直接替换当前行的内容 |
:s/TWO/Date(:与s之间没有空格) | 查找某行中某个单词并进行替换(这里将two替换为date) |
C | 修改某行的某段文本内容(替换到末尾) |
cf所选字符(例cfU) | 对当前光标所在位置到所选字符之间这一段文本进行替换 |
:1,$ s/owe/one(1,$表示从文件第一行到最后一行) | 在所有行上搜索并替换行内第一个目标内容 |
:g/行包含的字符串/s/旧/新 | 指定某行中的内容进行替换(g表示从文件的第一行查找至最后一行) |
:1,$ s/旧/新/g | 在所有行上搜索并替换行内所有目标内容(g表示对找到的所有目标字符串进行替换) |
复制、粘贴、剪切操作合集:
字符 | 单词 | 行 | |
---|---|---|---|
复制 | yl | yw | yy |
剪切 | x | dw | dd |
粘贴 | p | p | p |
操作 | 功能 |
---|---|
yl | 复制字符 |
p | 粘贴字符(大写P粘贴至光标上一行,p至下一行) |
x | 剪切字符 |
yf字符 | 复制光标所在位置与指定字符之间的文本内容 |
df字符 | 剪切光标所在位置与指定字符之间的文本内容 |
yw | 以单词为单位进行复制, 2yw:复制两个单词 |
dw | 以单词为单位进行剪切 |
yy | 复制行,7yy:复制7行 |
y$ | 复制当前光标处至文件末尾间的全部行 |
dd | 剪切行 |
d$ | 剪切当前光标至文件末尾间的全部内容 |
复制和移动文本:
:2 copy 15
:将第2行复制到第15行:1,6 copy 16
:将1,6行之间的文本块复制到16行:8,12 move 18
:将8,12行之间的文本块复制到18行操作 | 功能 |
---|---|
x | 删除光标所在的字符。删除单个字符 |
数字x | 删除多个字符,如7x |
dw | 删除一个单词 |
dd | 删除单行 |
D | 删除一行中的一部分。删除光标所在位置后的一部分内容 |
df字符 | 删除改行中光标到字符之间的指定文本 |
:2d | 删除指定行(这里删除第二行) |
:1,4d | 删除指定文本块 |
. | 往后接着删除 |
u | 撤销最近一次删除(也可以对覆盖替换进行撤销) |
U | 撤销一行上的所有修改 |
操作 | 功能 |
---|---|
:set number / :set nonumber(简写nu/nonu) | 显示和隐藏行号 |
:set autoindex / :set noautoindex (ai/noai) | 设置和取消字符自动缩进 |
:set showmode / :set noshowmode | 显示或隐藏当前编辑状态 |
:set ignorecase / :set noignorecase (ic/ noic) | 搜索时忽略大小写 |
:set list / :set nolist | 显示和隐藏特殊字符 |
:set showmatch / :set noshowmatch | 是否显示特殊字符的匹配 |
:set wrapmargin=数字 | 设置每行中最后一个字符到屏幕右边界的字符个数 |
:set all | 查看编辑器当前的设置 |
介绍多列内容输出column、文件内容查找grep、基本数学运算bc、文件内容排序sort、文件内容比较uniq、comm、diff,文件内容替换tr,单行数据编辑sed和数据操作工具awk。
column
:将内容多列输出参数:
-x
:输出是从左到右显示,再从上到下显示。例子:
column -x ex111 | more
:排列并显示column ex111 | more
格式:
grep string file1 file2...
。string为待查找的内容,file 是查找的文件
例如:
grep e ex111 ex222
:在这两个文件中查找“e”grep apple *
:在当前目录下的所有文件中查找“apple”grep 'my phone' ex111
grep -i Joy ex111
:在ex111中查找Joy ,忽略大小写
-i
:选项,忽略大小写-v
:输出不包含目标字符串的行-l
:只输出包含目标字符串文件的文件名-n
:输出文件中包含目标字符串的行和它的行号,两者以冒号隔开。字符 | 功能 | 例子 |
---|---|---|
. | 匹配单个普通字符 | grep '...' ex211 :查找文件中所有长度为3的字符串 |
^ | 指示某行的起始 | grep '^a' ex111 :查找所有以a开头的行 |
$ | 指示某行的末尾 | grep 't$' ex111 :查找所有以t结尾的行 |
. ^ $组合使用 | grep '^...$' ex111 :查找所有长度为3的行 |
输入命令bc启动程序,即可输入要计算的表达式
字符 | 功能 | 例子 |
---|---|---|
+ | 加法 | 1+2 |
- | 减法 | 4-2 |
* | 乘法 | 2*3(结果6) |
/ | 除法 | 8/2(结果4) |
^ | 幂运算 | 2^4(结果16) |
scale | 输出的小数部分(默认为零) | scale=2 12/7 (结果1.71) |
sort的标准排序规则是按ASCLL码表的值升序排序。
sort排序默认字段分割符是空格。
基本使用: sort 文件名
选项或符号 | 功能 | 例子 |
---|---|---|
-d | 对文件内容按字典顺序排序(只对数字、字母、空格进行排序) | sort -d ex111 |
-f | 排序时忽略字母的大小写 | sort -f ex111 |
-r | 对文件内容反序排序(降序排序) | sort -r ex111 |
-n | 对文件中的数字进行排序,按数值大小排序,而不是ASCLL码 | sort -n ex111 |
-k | 对文件内容按某一字段进行排序 | sort -k 1 ex111 :按第一个子段进行排序 |
+、- | 对文件的内容限定排序(+表示从分割符开始,-表示到分割符结束) | sort +1 -3 ex111 :比较内容限定在2,3列字段。 |
-t | 指定分隔符 | sort -k 2 -t: ex111 :以:分隔字段 |
> | 重定向符,将排序结果写入指定文件 | sort ex111 > ex222 :将排序后的结果写入ex222 |
-o | 将被排序文件重写 | sort -o ex111 ex222 |
选项 | 功能 | 例子 |
---|---|---|
-c | 可将相邻重复行的重复次数显示在行首 | uniq -c ex111 |
-d | 查看文件中相邻重复行的其中一行 | uniq -d ex111 |
-u | 查看文件中不相邻且不重复的行 | uniq -u ex111 |
删除所有重复行(包括相邻不相邻的)。先删除,然后排序再删除 | uniq ex111 、sort ex111 | uniq |
comm可实现按行比较两个有序文件的异同。
comm ex01 ex02
执行comm的结果解释:
列号 | 含义 |
---|---|
1 | 只存在于文件ex01中的行 |
2 | 只存在于文件ex02中的行 |
3 | 两个文件中都存在的行 |
comm -3 ex01 ex02 |
-3 表示不输出第三列 |
diff的输出结果是告诉用户如何将前一个文件的内容转换为后一个文件内容。
diff ex111 ex222
字母含义 | 例子内容 | 解释 |
---|---|---|
c 修改 | 1c1 < pull — >abuse |
前一文件中行用“<”开头,后一文件用“>”开头,一下两行内容同理。 将前一文件的第一行“pull”改为后一文件的第一行“abuse” “—”为分隔符 |
d 删除 | 3d2若将前一文件的第三行“hit”删除,前一文件和后一文件的第2行便相同了 |
|
a 添加 | 5a5,6 >eat >beat |
前一文件的第5行之后添加 后一文件的第5行“eat”和第6行“beat” |
功能 | 替换实例 | 解释 |
---|---|---|
替换字符 | tr 'r' 'R' < ex111 |
< ex111的意思是将文件的内容作为tr的输入。将文件中所有的’r’替换成’R’ |
替换字符 | tr '\n' '' < ex111 |
将文件中所有的换行符(\n)替换成空格 |
替换多个字符 | tr 'pe-' 'PE,' ex111 |
将文件中所有的p替换换成P,e替换成E,-替换成, |
按范围替换 | tr '[a-g]' '[1-7]' < ex111 |
将a替换为1… |
-d 删除所有指定字符 |
tr -d 'o' < ex111 |
删除文件中所有的字母’o’ |
-s 检测文件中所有连续重复的字符,并将第一个连续重复字符之后的所有连续重复字符删除 |
tr -s '' < ex111 |
删除所有连续的空格 |
结合管道替换:
“|”
为管道符,其左侧的命令的输出会作为右侧命令的输入。cat -n ex111 | tr '[a-z]' '[A-Z]'
:对文件的每行进行编号,并输出其大写字母形式。sed可实现对文件的按行编辑。
字符 | 功能 | 例子 |
---|---|---|
s | 表示替换每行的第一个单词 | sed 's/red/blue' ex111 |
g | 表示替换文件中所有的单词 | sed 's/blue/fee/g' ex111 将所有的blue替换为fee |
将所有包含count的行中的red全部替换为fee | sed '/count/s/red/fee/g' ex111 |
|
d | 删除指定行 | sed '/red/d' ex111 :删除所有包含red的行sed '3d' ex111 :删除第三行 |
^$& | 结合正则表达式 &指代了被替换的单词 |
sed '/^c/s/red/blue/g' ex111 :替换所有以c开头的行sed '/b$/d' ex111 :删除所有以b结尾的行sed 's/my/& boyfriend/g' ex111 :将所有的my替换为my boyfriend |
可以对文件内容进行各种检索,可以直接使用预定义变量,可以结合正则表达式和逻辑判断语句来使用,还可以进行简答的数学运算。
命令 | 功能 | 解释 |
---|---|---|
awk '/red/ {print $2,$3}' ex111 |
选择行并输出相应的字段 | /red/ :双斜杠中间的red是待检索的字符串print $2,$3 :指明了对符合检索条件的行所要执行的操作,其中“print”表示输出,“$2,$3”表示第二第三个字段。ex111 :待检索的文件 |
awk -F_ '/red/ {print $3,$1}' ex111 |
-F 指定字段分隔符 |
使用-F指定下划线为字段分隔符,并输出第三和第一个字段,字段间使用空格分隔。 |
awk -F0 '/ex/ {print $1 $2 $3 $4}' ex111 |
这样就可以删除指定字符 | 以0作为分隔符,这样0就被成功删除了,而变量之间以空格分隔,故所有字段均无分隔符。 |
awk 选项 '模式{操作}' 文件名
参数 | 选项 | 模式 | 操作 | 文件名 |
---|---|---|---|---|
解释 | 能使awk完成某种特定功能的参数,比如用来指定字段分隔符-F选项 | 待检查的字符串,通常是正则表达式或者关系表达式 | 对检索成功的行执行相应的操作,默认的操作是按指定格式输出检索成功行中的若干字段 | 待检索文件的命名称 |
功能 | 例子 |
---|---|
操作数据库,先输出每一列的属性名,然后再输出每一列的数据 | awk '{print "num name sex age score"; exit}' ex111_awk; awk '{print}' ex111_awk |
输出数据库中的全部字段 | awk '{print $0}' ex111 或 awk '{print}' ex111 |
awk中的一些事先定义的变量,被称为预定义变量。
预定义变量 | $n | NF(记录当前的字段总个数) | NR(记录当前的编号) |
---|---|---|---|
释义 | 当n>0时,$n表示待检索文件中的第n个字段。 当n=0时,$0表示待检索文件中的所有字段 |
在awk检索文件时,表示当前被检索行的字段个数 | 在awk检索文件时,表示当前被检索行的行号 |
例子 | 就是那个变量的例子 | awk '{print NF}' ex111 :得到文件中每行字段的个数awk '{print $NF}' ex111 :输出每行的最后一个字段,和$5是一样的 |
awk '{print NR,$0}' ex111 :输出文件中每一行的行号 |
选项 | 功能 | 例子 |
---|---|---|
-v | 设置一个自定义变量,然后才能在进行操作时使用 | awk -v test='student' '{print test}' ex111 :test为自定义变量,将其赋值为“student”后,使用print进行输出。awk -v test='student' '{print test $0}' ex111 :还可以同时使用自定义变量和预定义变量。 |
""双引号 | 通过使用双引号输出若干个字符串 | awk '{print "num:"$1,"name:"$2}' ex111 :这样双引号里的字符串被原样输出了。 |
使用数字 | awk '{print 89.8}' ex111 还可以进行运算后输出: awk 'print{89.7-2}' ex111 |
命令 | 解释 |
---|---|
awk '/[tT]/ {print}' ex111 |
在文件中查找包含字母“T”或“t”的行并输出 |
awk '/[p-z]/ {print}' ex111 |
在文件中查找包含p到z的任意一个字母的行并输出 |
awk '/^[a-s]/ {print}' ex111 |
^表示行的起始,查找所有起始字符为a到s中任意一个字母的行并输出 |
awk '/[^a-s]/ {print}' ex111 |
[^a-z]表示按字母顺序逐行查找从a到z内的所有字母,只要某行包含了从a到z以外的任意一个字符,这一行就会被输出。 |
命令 | 解释 | 备注 |
---|---|---|
awk '$3=="f" {print}' ex111 |
查找第三个字段的值为f的记录 | 在比较字符串时,一定要在待比较内容的两侧加双引号 |
awk '$1~/[Bb]us/ {print}' ex111 |
查找第一个字段中匹配/[Bb]us/的记录并输出 | awk '$1!~/[Bb]us/ {print}' ex111 :查找不匹配的记录 |
&&、||、! | 与或非 |
可以将awk命令放入一个awk文件中,方便后续调用。
awk -f ex111_awk
:使用-f
选项来调用文件ex111_awk的内容,并对文件执行文件中的操作。预定义变量的释义:
预定义变量 | FS(查找时使用的字段分隔符) | RS(查找时使用的记录分隔符) | OFS(输出时使用的字段分隔符) | ORS(输出时使用的字段分隔符) |
---|---|---|---|---|
释义 | 在awk对文件进行检索时使用的字段分隔符,默认为空格或制表符(Tab键) | 在awk对文件进行检索时使用的记录分隔符,默认为换行符 | 在awk输出检索时使用的字段分隔符,默认为空格 | 位于每一条记录的末尾,是在awk输出检索结果时使用的记录分隔符,默认为换行符。 |
例子:
BEGIN{
FS="_"
OFS="~"
}
{
print $1,$2
}
一下为一个awk文件:
/Mike/ || /Amy/ {
print $1
print $2,$4
}
使用
sh
命令来调试shell脚本,语法为sh[-nvx] script
参数说明:
序号 | 参数 | 含义 |
---|---|---|
1 | -n | 读一遍脚本中的命令但不执行,用于检查脚本中的语法错误 |
2 | -v | 一边执行脚本,一边将执行过的脚本命令输出到屏幕上显示 |
3 | -x | 提供跟踪执行信息,将执行的每一条命令与结果一次打印出来 |
4 | -e | 若有一个命令失败就立即退出 |
5 | -u | 置换时把未设置的变量看作出错 |
6 | -c | 使shell解析器从字符串而非文件中读取并执行命令 |
定义变量时的命名规则:
格式:
case VALUE in
VALUE1)
command1
command2
;;
VALUE2)
command1
command2
;;
*)
command1
command2
;;
esac
例子:
运行此脚本时,输入1-4之间的整数,将会分别输出60,70,80,100,否则将提示“error”
#!/bin/bash
echo "please input a number bewteen 1 to 4"
read NUM
case $NUM in
1) echo "your 60"
;;
2) echo "your 70"
;;
3) echo "your 80"
;;
4) echo "your 100"
;;
*) echo "error"
;;
esac
格式:
if condition
then
command1
command2
...
fi
例子:
#!/bin/bash
echo "please input a number"
read NUM
if [ "$NUM" -gt "0" ] #-gt是大于的意思
then
echo "the number is a positive num"
fi
if
开始,以fi
闭合结束,这是shell的语法规则[ ]
”进行闭包,并且在condition和方括号之间必须有空格,左右两边都要有[]
中只能有一个条件判断式if condition
then
command1
command2
...
else
command
...
fi
if condition
then
command1
command2
...
elif condition2
then
command1
...
else
command
...
fi
类型 | 命令 | 用法 |
---|---|---|
字符串判断 | str1 = str2 | 当字符串内容、长度相等时为真 |
-n str1 | 当串的长度大于0时为真 | |
-z str1 | 当串的长度为0时为真 | |
str1 | 当串str1为非空时为真 | |
\ > \ < | 比较大小,但必须转义 | |
数字的判断 | -eq | 相等 |
-ne | 不相等 | |
-le | 小于等于 | |
-lt | 小于 | |
-ge | 大于等于 | |
-gt | 大于 | |
文件的判断 | -r file | 用户可读为真 |
-w | 可写为真 | |
-f | 文件为正规文件为真 | |
-x | 可执行为真 | |
-d | 文件为目录为真 | |
-c | 文件为字符特殊文件为真 | |
-b | 文件为块特殊文件为真 | |
-s | 文件大小非0时为真 | |
-t | 当文件描述符(默认为1)指定的设备为终端时为真 | |
复杂逻辑判断 | -a | 与 |
-o | 或 | |
! | 非 |
for循环有3种结构:列表for循环、不带列表for循环、类似C语言的for循环。
列表for循环:
计算1~200之间所有偶数的和
#!/bin/bash
echo "1-200之间偶数的和"
sum=0
for i in {2..200..2}
do
sum=$(($sum+i))
done
echo "sum=$sum"
不带列表的for循环:
根据用户的输入进行相应的输出,其中$#
表示参数的个数
#!/bin/bash
sum=0
echo "number of argument is $#"
echo "what you input is:"
for argument
do
echo "$argument"
sum=$(($sum+$argument))
done
echo $sum
类C语言风格for循环:
#!/bin/bash
sum=0
for((i=2;i<=200;i=i+2))
do
let "sum=sum+i"
done
echo "the sum is:" $sum
语法:
while condition
do
command
done
例子:
让用户输入一个数,若这个数等于29则直接退出while循环,若不等于20则给出相应的提示。
#!/bin/bash
echo "please input a number bewteen 1 to 100"
read i
while [ $i -lt 101 ] && [ $i -gt 0 ]
do
if [ $i -eq 29]
then
echo "you are right"
exit 0
elif [ $i -lt 29]
then
echo "you should try a bigger one"
else
echo "you should try a smaller one"
fi
read i #循环输入
done
until中,测试的条件为假,进入循环体。
格式:
until condition
do
command
done
例子:
使用until在屏幕上输出1-10的数字。
#!/bin/bash
num=1
until ((num>10))
do
echo $num
num=$(($num+1))
done
break
:强行退出当前循环continue
:用于让脚本跳过后面的语句,并在执行下一次循环在shell中,函数必须先定义后使用。
语法:
function_name(){
list of commands
[ return value ]
}
#!/bin/bash
hello(){ #声明
echo "hello ,shell"
}
hello #调用
在shell中,函数可以通过位置变量来传递参数
语法格式:
functionName param1 param2 param3...
。当函数执行时,$1表示对应的参数1。
例子:
#!/bin/bash
sum(){
echo "the first is $1"
echo "the second is $2"
sum=$(($1+$2))
echo "the sum of params is : $sum"
echo "output all param $*"
}
sum 1 9
在shell中,函数的返回值只能是0-255之间的一个整数,返回值将保存到变量“
$?
”中。
例子:
根据用户输入的年份,判断并输出该年份是否是闰年
#!/bin/bash
leapyear(){
year=$1
if [ $[ $year%4 ] -eq 0 ] && [ $[ $year%100 ] -ne 0 ] || [ $[ $year%400 ] -eq 0 ]
then
Isleapyear=0
else
Isleapyear=1
fi
}
echo "please enter a number:"
read N
leapyear $N
case $Isleapyear in
0)
echo "this year is a leap year"
;;
1)
echo "this year is not a leap year"
;;
esac
使用
. 文件的路径
来调入
这里clock是一个函数文件
#!/bin/bash
. ./clock #此处是用空格隔开的的实心点
clock
local
变量名 | 释义 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$- | 显示shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
#!/bin/bash
for((i=1;i<9;i++))
do
for((j=1;j<i;j++))
do
echo -n "*"
done
echo
done
#!/bin/bash
iline=1
iten=9
until [ $iline -gt $iten ]
do
jline=1
until [ $jline -gt $iline ]
do
echo -ne "$iline*$jline=$((iline*jline))\t"
((jline++))
done
echo
((iline++))
done
#!/bin/bash
leapyear(){
year=$1
if [ $[ $year%4 ] -eq 0 ] && [ $[ $year%100 ] -ne 0 ] || [ $[ $year%400 ] -eq 0 ]
then
Isleapyear=0
else
Isleapyear=1
fi
}
echo "please enter a number:"
read N
leapyear $N
case $Isleapyear in
0)
echo "this year is a leap year"
;;
1)
echo "this year is not a leap year"
;;
esac
|
| $* | 以一个单字符显示所有向脚本传递的参数 |
| $$ | 脚本运行的当前进程ID号 |
| $! | 后台运行的最后一个进程的ID号 |
| @ ∣ 与 @ | 与 @∣与*相同,但是使用时加引号,并在引号中返回每个参数 |
| $- | 显示shell使用的当前选项,与set命令功能相同 |
| $? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
#!/bin/bash
for((i=1;i<9;i++))
do
for((j=1;j<i;j++))
do
echo -n "*"
done
echo
done
[外链图片转存中…(img-9fp4zbbb-1641113157033)]
#!/bin/bash
iline=1
iten=9
until [ $iline -gt $iten ]
do
jline=1
until [ $jline -gt $iline ]
do
echo -ne "$iline*$jline=$((iline*jline))\t"
((jline++))
done
echo
((iline++))
done
#!/bin/bash
leapyear(){
year=$1
if [ $[ $year%4 ] -eq 0 ] && [ $[ $year%100 ] -ne 0 ] || [ $[ $year%400 ] -eq 0 ]
then
Isleapyear=0
else
Isleapyear=1
fi
}
echo "please enter a number:"
read N
leapyear $N
case $Isleapyear in
0)
echo "this year is a leap year"
;;
1)
echo "this year is not a leap year"
;;
esac