Shell | Shell 学习(一)
一、Linux 内核是什么
- Linux内核,即Linux操作系统的核心。它主要由以下模块组成:
进程管理 定时器 中断管理 内存管理 模块管理 虚拟文件系统接口 文件系统 设备驱动程序 进程间通信 网络管理 系统引导
- Linux默认有7个运行级,从运行级0到运行级6,每一个运行级所对应的含义如下:
运行级0:关机。 运行级1:单用户模式,系统出现问题时可使用这种模式进入系统维护,典型的使用场景是在忘记root密码时可进入此模式修改root密码。 运行级2:多用户模式,但是没有网络连接。 运行级3:完全多用户模式,这也是Linux服务器最常见的运行级。 运行级4:保留未使用。 运行级5:窗口模式,支持多用户,支持网络。 运行级6:重启
- 过多种方式来访问和使用Shell
终端——Linux桌面提供基于GUI的登录系统。一旦登录你就可以通过运行X终端(XTerm)、Gnome终端(GTerm)或KDE终端(KTerm)应用程序来访问Shell。 安全Shell连接(SSH)——可以通过它远程登录服务器或工作站来访问其Shell。 控制台——一些Linux系统同样提供基于文本的登录系统。通常情况下,登录系统后就可以直接访问Shell。
- 以使用如下命令查看系统中所有可用的Shell:
cat /etc/shells
#显示如下 /bin/sh /bin/bash /sbin/nologin /bin/tcsh /bin/csh /bin/ksh
- Shell脚本是Linux/Unix编程环境的基本组成部分。Shell脚本一般由以下几部分构成:
Shell关键字——例如if…else,for do…done。 Shell命令——例如export,echo,exit,pwd,return。 Linux命令——例如date,rm,mkdir。 文本处理功能——例如awk,cut,sed,grep。 函数——通过函数把一些常用的功能放在一起。例如,/etc/init.d目录中的大部分或全部系统Shell脚本所使用的函数都包含在文件/etc/init.d/functions中。 控制流语句——例如if…then…else或执行重复操作的Shell循环。
chmod 755 myScript.sh
755
将给你读写和执行的权限,其他人将只有读和执行的权限 如果你希望你的脚本是私有的(即,只有你可以读写和
执行),则请使用700
替代
二、Bash Shell
Bash
是一个与Bourne Shell
兼容的、执行从标准输入设备或文件读取的命令的命令语言解释器。Bash是Bourne-Again Shell的缩写。- 与登录Shell相关的文件
/etc/profile——系统级的初始化文件,定义了一些环境变量,由登录Shell调用执行。 /etc/bash.bashrc或/etc/bashrc——其文件名根据不同的Linux发行版而异,每个交互式Shell的系统级的启动脚本,定义了一些函数和别名。 /etc/bash.logout——系统级的登录Shell清理脚本,当登录Shell退出时执行。部分Linux发行版默认是没有此文件。 $HOME/.bash_profile、$HOME/.bash_login、 $HOME/.profile——用户个人初始化脚本,由登录Shell调用执行。这三个脚本只有一个会被执行,按照此顺序查找,第一个存在的将被执行。 $HOME/.bashrc——用户个人的每个交互式Shell的启动脚本。 $HOME/.bash_logout——用户个人的登录Shell清理脚本,当登录Shell退出时执行。 $HOME/.inputrc——用户个人的由readline使用的启动脚本,定义了处理某些情况下的键盘映射
三、Bash命令常识
- 当用户登录时,登录Shell会调用如下脚本:
/etc/profile——当用户在运行级别3登录系统时首先运行 /etc/profile.d——当/etc/profile运行时,会调用该目录下的一些脚本 $HOME/.bash_profile、$HOME/.bash_login和$HOME/.profile——在/etc/profile运行后,第一个存在的被运行 $HOME/.bashrc ——上述脚本的中一个运行后即调用此脚本 /etc/bashrc或/etc/bash.bashrc——由$HOME/.bashrc调用运行
- 当一个交互式的非登录Shell启动时,Bash将读取并运行如下脚本:
$HOME/.bashrc——如果此文件存在即被运行。 /etc/bashrc——将被$HOME/.bashrc调用运行。 /etc/profile.d——此目录下的脚本将被/etc/bashrc或 /etc/bash.bashrc调用运行
- Bash启动脚本主要设置的环境有:
设置环境变量PATH和PS1 通过变量EDITOR设置默认的文本编辑器 设置默认的umask(文件或目录的权限属性) 覆盖或移除不想要的变量或别名 设置别名 加载函数
- Bash退出脚本
当登录Shell退出时,如果$HOEM/.bash_logout脚本存在的话,Bash会读取并执行此脚本的内容 此脚本主要用途: 使用clear命令清理你的终端屏幕输出; 移除一些临时文件 自动运行一些命令或脚本等
- Shell中的变量
变量是任何程序或脚本的重要组成部分。变量为程序或脚本访问内存中的可被修改的一块数据提供了简单的方式。 Linux Shell中的变量可以被指定为任意的数据类型,比如文本、或是数值。你也可以通过修改Shell中的变量来改变Shell的样式。 接下来就让我们来了解和学习一下Shell中的变量。
- Shell中变量的类型
Shell中有两种变量的类型:系统变量(环境变量)和用户自定义的变量(本地变量或Shell变量)。
系统变量是由Linux Bash Shell创建和维护的变量。你可以通过修改系统变量,如PS1、PATH、LANG、HISTSIZE和DISPLAY等,配置Shell的样式。
- Shell变量赋值
1. varName=VaeValue 复制语句=两边不能有空格 2. 注意Shell的默认赋值是字符串赋 如 var=1 var=$var+1 echo $var 输出 1+1 3. 在Bash中,如果要将算术表达式的数值赋值给一个变量,可以使用let命令 let var=2+1 echo $var 输出 3 4. 将命令的执行结果赋值给变量,如下所示: var='pwd' echo $var 输出 /home/yantaol 5. 或者也可以使用$(…)来实现同样的功能: var=$(pwd) echo $var 输出 /home/yantaol 6. Bash的内置命令read读入的内容赋值给变量 echo -n "输入变量值:"; read var Enter var:123 echo $var 输出 123 7. export语句的使用 Bash的内置命令export会将指定给它的变量或函数自动输出到后续命令的执行环境。export命令的语法如下所示: export [-fnp] [变量或函数名称]=[变量设置值] -f选项表示export一个函数; -n选项表示将export属性从指定变量或函数上移除; -p选项打印当前Shell所有输出的变量,与单独执行export命令结果相同。 8. 删除变量 unset 变量名 9. 命令历史 (命令历史保存在缓冲区或是默认文件~/.bash_history中,其保存命令的多少由环境变量 HISTSIZE 定义 ) history ctrl+r组合键后输入相应的关键字可以搜索历史命令 Shell命令行提示符下,可以简单地输入!!,来重复执行上一条执行过的命令 8. 回调最近一次执行的以指定字符开头的命令,如下所示:
9. 以使用由history命令列出的列表的行号来重新调用相应的历史命令 $ history …… 990 uptime 991 uptime 992 man svn 993 history 994 pwd 995 history #调用991行命令 $ !991 10. Shell中扩展的方式有8种 按扩展的先后顺序排序: 大括号扩展、 波浪号扩展、 参数和变量扩展、 命令替换、 算术扩展、 进程替换、 单词拆分 文件名扩展 大括号扩展是一种能够生成任意字符串的机制 $ echo a{b,c,d}e abe ace ade 波浪号扩展 $ echo {a..z} #按字母表顺序显示a~z的字 a b c d e f g h i j k l m n o p q r s t u v w x y z 大括号扩展也可以是嵌套的。每个扩展字符串的结果是不排序的 $ echo {a,b{1..3},c} a b1 b2 b3 c 波浪号扩展可用来指代你自己的主目录,或其他人的主目 $ cd ~ #进入你自己的主目录 $ cd ~fred #进入用户fred的主目录 如果波浪号前缀是“~+”,则它会被Shell变量PWD的值代替 $ echo ~+ /tmp 如果波浪号前缀是“~-”,则它会被Shell变量LODPWD的替代 echo ~- /home/yantaol 命令替换是用命令的输出替换命令本身,命令替换有如下两种形式: $(COMMAND) 或者 'COMMAND' Bash进行这个扩展时,先执行命令,然后用命令的标准输出结果取代命令替换,命令的标准输出结果中最后面的换行符会被删除 $ echo $(uptime) 17:10:35 up 2 days, 11:07, 0 users, load average: 0.00, 0.00, 0.00 如果Bash中没有设置-f选项,就会支持文件名扩展。Bash支持以下三种通配符来实现文件名扩展 * ——匹配任何字符串,包括空字符串。 ? ——匹配任意单个字符。 […]——匹配方括号内的任意字符。
- 命令别名
为了方便,对于频繁使用的命令可以在文件~/.bashrc
文件下为这些命令创建别名,创建别名语法如下alias name='command' name——用户定义的用于别名的任意简短的名字。 command——任意Linux命令 #alias不带任何参数即列出所有别名 $ alias
- Bash的内置命令set和shopt可以用于设置Shell选项
- 每次登录时自动设置你的Shell提示符,需要将环境变量PS1放在你的~/.bashrc文件中,并使用export命令将其输出到其他子命令
-
查看文件和目录(常用命令)
ll 、cat -n 、cat test test1 > test2、more /etc/inittab、 cat README | more 、less /etc/fstab、 head -n 5 /etc/inittab tail -n 10 /etc/inittab $ file /etc/inittab /etc/inittab: ASCII English text 使用用-i选项,可以MIME类型的格式显示文件类型的信息 使用-N选项,输出的队列可以以在文件名之后无空白填充的形式显示,其格式对比 如下: $ file -N * wc命令用于查看文件的行数、单词数和字符数等信息。其语法类似如下所示: wc filename X Y Z filename X:表示行数。 Y:表示单词数。 Z:表示字节数。 filename:表示文件名 wc /etc/inittab 53 229 1666 /etc/inittab find find /etc -name inittab 在当前目录下,查找名称为inittab的文件: find . -name inittab 找出当前目录下,文件名不区分大小写是example的所有文件: $ find . -iname example 找出当前目录下,目录名是tmp的目录: find . -type d -name tmp 找出当前目录下,文件权限是777的所有文件: find . -type f -perm 0777 找出当前目录下,文件权限不是777的所有文件: find . -type f ! -perm 777 找出/etc/目录下所有只读文件: find /etc -type f ! -perm /a+w 找出你账号的主目录下的所有可执行文件: find ~ -type f -perm /a+x 出/tmp目录下的.log文件并将其删除: find /tmp/ -type f -name "*.log" -exec rm -f {} /; 找出当前目录下的所有空文件: find . -type f -empty 找出当前目录下的所有空目录 find . -type d –empty 找出/tmp目录下的所有隐藏文件: find /tmp/ -type f -name ".*" 找出/tmp目录下,所有者是root的文件和目录: find /tmp/ -user root 找出/tmp目录下,用户组是developer的文件和目录: find /tmp/ -group developer 找出你账号的主目录下,3天前修改的文件: find ~ -type f -mtime 3 找出你账号的主目录下,30天以前修改的所有文件: find ~ -type f -mtime +30 找出你账号的主目录下,30天以前60天以内修改的所有文件: find ~ -type f -mtime +30 -mtime -60 找出/etc目录下,一小时以内变更过的文件: find /etc -type f –cmin -60 找出/etc目录下,一小时以内访问过的文件: find /etc -type f -amin -60 找出你账号的主目录下,大小是50MB的所有文件: find ~ -type f -size 50MB 找出你账号的主目录下,大于50MB小于100MB的所有文件: find ~ -type f -size +50MB -size -100MB
-
操作文件和目录(常用Shell命令)
touch命令实例:创建文件 touch命令就可用于创建、变更和修改文件的时间戳。它是 Linux操作系统的标准程序。touch命令有如下选项。 -a:只改变访问时间。 -c:不创建任何文件。 -m:只改变修改时间。 -r:使用指定文件的时间替代当前时间。 -t:使用[[CC]YY]MMDDhhmm[.ss]替代当前时间。 你可以同时使用-c和-t选项,来明确设置文件的时间,命令格式如下所示: touch -c -t YYMMDDHHMM filename 如果想使用文件myeffyl的时间戳更新文件effyl的时间戳,那么可以使用-r选项: touch -r myeffyl effyl mkdir -p /home/yantaol/backup/old mkdir -p -m a=rwx backup/old cp 使用-p选项,可以使复制一个文件到新文件时,保留源文件的所有者、用户组、权限、修改和访问时间,以及一些扩展属性等信息: 使用-R或-r选项,可以递归地复制一个目录,即将一个目录及其下的所有文件和子目录都复制到另一个目录 cp -a * /home/yantaol/backup -a:存档模式。相当于-dpR。 -d:保留软链接。 -p:保留权限、所有权和时间戳等信息。 -R:递归地复制目录。 ln 软链接又称符号链接,是一类特殊的文件,这个文件包含了另一个文件或目录的路径名(绝对路径或相对路径)。在对符号文件进程读或写操作时,系统会自动把该操作转换为对源文件或目录的操作,但输出链接文件时,系统仅仅删除链接文件,而不删除源文件或目录本身。软链接可以链接不同文件系统的文件 硬链接可以理解为一个文件的一个或多个文件名。它引用的是文件在文件系统中的物理索引(也称为inode)。当你移动或删除原始文件时,硬链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。硬链接的文件不需要用户有访问原始文件的权限,也不会显示原始文件的位置,这样有助于文件的安全。如果你删除的文件有相应的硬链接,那么这个文件依然会被保留,直到所有对它的引用都被删除,即硬链接数为0。硬链接只能链接同一文件系统中的文件。 使用-s选项,可以创建一个软链接 ln -s /full/path/of/original/file /full/path/of/symbolic/link/file ls -l /home/yantaol/lib/ library.so 在目录/home/yantaol/lib下创建一个软链接library.so,链接到/home/yantaol/src/ library.so: ln -s /home/yantaol/src/library.so /home/yantaol/lib 当前目录下,创建文件src_original.txt的硬链接,名称为dst_link.txt。两个文件的inode编码应该相同: ln src_original.txt dst_link.txt #注意: Linux 不允许给目录创建硬链接 mv命令实例:重命名文件或目录 rm命令实例:删除文件或目录
-
管理文件或目录权限
ls -l:显示文件和目录权限
chmod命令根据相应的模式修改每个给定文件的权限。这里的模式有两种:一种是符号表达式模式,另一种是八进制位模式。
$ chmod [OPTION]…[ugoa][[+-=][rwxug]][,…] FILE…
字母“ugoa”的组合控制哪些用户对文件的访问权限将被改
u:指文件或目录的所有者。
g:指文件或目录的用户组的成员。
o:指不在文件或目录的用户组中的其他用户。
a:指所有用户,即(ugo)注意:如果使用chmod命令的符号表达式模式时,不给出“ugoa”的组合,则得到的结果和使用“a”相同。
操作符“+-=”表示权限的授予或撤销。
+:选定的权限将被添加。
-:选定的权限将被移除。
=:文件只拥有选定的权限。
赋予所有人对文件读、写和执行的权限:chmod ugo+rwx example.sh
chmod 777 example.sh
赋予文件的所有者和用户组成员读写权限,其他用户只读权限:$ chmod 664 example.sh
使用-R选项,chmod 命令可以递归地修改目录权限
如:chmod -R 755
将chmod命令与find命令结合使用find . -type d -exec chmod -R 775 {} /
chown命令用于修改文件或目录的所有者和用户组信息
chown [OPTION]… [OWNER][:[GROUP]] FILE
将文件example.sh的所有者修改为rootchown root example.sh
同时修改文件example.sh的所有者和用户组:chown yantaol:yantaol example.sh
chown
不能修改软连所指向目录的所有者或者用户组需要使用-H
选项:chown -R -H yantaol:yantaol linux_symlnk
chgrp
命令与chown
类似,只是不能修改其所有者 -
设置
seruid
和setgid
权限位setuid
(设置用户标识)是允许用户以文件所有者的权限执行一个程序的权限位setgid
(设置组标识)是允许用户以用户组成员的权限执行一个程序的权限位
四、文本处理
- sort命令实例:文本排序
不使用任何选项,sort命令简单地将文件内容按字母顺序排序:
$ sort example.txt
abc
def
def
ghi
jkl
mno
使用-u选项,sort命令可以移除所有重复的行(上例中,重复的记录“def”被移除)
使用-n选项,可以使so
rt命令将数字按数值的大小排序:(否则按照首字母排序,100 会排到20前面)
使用-r选项,可以使sort命令以倒序方式排序
如果一个文件有多个列(例中,每列以逗号“,”分隔)
指定sort命令按照第二列的字符串顺序将文件内容排序:
sort -t ',' -k2,2 example.txt
-t选项用于指定列的分隔
-k选项用于指定进行排序的
指定sort命令按照第二列的数值顺序的倒序将文件内容排序:
sort -t ',' -k2n,2 example.txt
- uniq文本去重
uniq
命令用于移除或发现文件中重复的条目使用uniq命令,不带有任何选项时,它将移除文件中重复的行并显示单一行: uniq example.txt 使用-c选项,可以统计重复行出现的次数: uniq -c example.txt 2 aaa 3 bbb 1 ccc 使用-d选项,只显示文件中有重复的行并只显示一次: uniq -d example.txt aaa bbb 使用-D选项,与-d选项类似,但它显示文件中所有重复的行 uniq -D example.txt aaa aaa bbb bbb bbb 使用-u选项,只显示文件中不重复的行: uniq -u example.txt ccc cat example.txt 使用-w选项,可以限制uniq命令只比较每行的前N个字符。例如,下面的实例中,限制uniq命令只比较每行的前3个字符是否重复: uniq -w 3 example.txt 使用-s选项,可以避免uniq命令比较每行的前N个字符,即跳过每行的前N个字符,只比较后面的字符。例如,下面的实例中,避免uniq命令比较每行的前3个字符,只比较后面的字符是否重复: uniq -s 3 example.txt 使用-f选项,可以避免uniq命令比较前N列,即跳过前N列(这里列以空格分隔),只比较后面的字符。 避免uniq命令比较第一列的内容,只比较后面的字符是否重复: uniq -f 1 example.txt
3. tr命令:替换或删除字符
tr命令语法
tr [OPTION]... SET1 [SET2]
tr功能:转换字符,如果把SET1和SET2同时指定,并没有指定-d选项,那么tr命令将把每个s1的都换成s2的
下面将所有小写转换为大写
echo LinuxShell | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
LINUXSHELL
下面的实例同样可以将字符串中的所有小写字母转换为大写字母:
echo linuxShell | tr [:lower:] [:upper:]
echo linuxShell | tr a-z A-Z
使用tr命令转换一个文件中的内容,并将转换的结果输出到另一个文件:
tr '{}' '()' < inputfile > outputfile
使用-s选项压缩重复的空格
使用-d选项删除指定字符
echo "The Linux Shell" | tr -d a-z
T L S
#删除数字
echo "my username is yantaol123" | tr -d [:digit:]
my username is yantaol
将-c和-d选项结合使用,删除字符串中除数字以外的所有字符:
echo "my username is yantaol123" | tr -cd [:digit:]
- grep命令 查找字符串
grep [OPTION]… PATTERN [FILE]… grep [OPTION]… [ -e PATTERN | -f FILE] [FILE]… 使用-i选项,可以强制grep命令忽略搜索关键字的大小写: grep -i YantaoL /etc/passwd 使用-r选项,可以递归搜索指定目录下的所有文件 grep -r yantaol /etc/ grep -R yantaol /etc/ 将-r选项与-l选项结合使用,grep命令可以只打印输出包含匹配指定模式的行的文件的名字: grep -rl yantaol /etc/ /etc/passwd /etc/shadow 使用-w选项,就可以强制grep命令只匹配包含指定单词的行,,查找文件/etc/passwd中只包含指定单词yantao grep -w yantaol /etc/passwd 使用-c选项,grep命令可以报告文件或文本中模式被匹配的次数 使用-n选项,grep命令可以显示每一个匹配的行的行号 使用-v选项,grep命令可以输出除匹配指定模式的行以外的其他所有行: 用--color选项,grep命令在输出中将匹配的字符串以彩色的形式标出
- diff命令实例:比较两个文件
diff命令语法 diff [OPTION]… from-file to-file 使用-w选项,diff命令将在比较两个文件时忽略空格 使用-y选项,diff命令可以并排的格式输出两个文件的比较结果 使用-y选项时,每行显示的内容不完整,可以与-W选项结合使用,指定并列输出格式的列宽,使每行的内容可以完整地显示 diff -yw –W 160 nsswitch.conf nsswitch.conf.org 使用-c选项,diff命令会以上下对比的格式输出两个文件的比较结果: diff -cw nsswitch.conf nsswitch.conf.org
- 其他常用命令
hostname 使用hostname命令修改你的系统的主机名: hostname yantaol-system 注意:上述命令只是临时地修改系统的主机名。当系统重启后,这个新修改的主机名将不会被使用 w命令用于显示登录的用户及他们当前运行的进程 命令输出的第一行内容与uptime命令默认输出的内容相同。第三行分别显示的是:登录账号的用户名、tty名称、从哪台主机登录、登录时间、空闲时间、tty上的所有进程所使用的CPU时间、当前进程所使用的CPU时间以及当前运行的进程。 who命令的语法如下所示:(who与w相似,比w强大) who [OPTION]… [ FILE | ARG1 ARG2 ] 直接使用who命令,不知道任何参数,将显示当前登录的所有用户的信息 使用-b选项,who命令可以显示系统的启动时间 使用-l选项,who命令会显示出系统登录进程 使用-m选项,who命令将只显示与当前标准输入关联的用户信息 使用-r选项,who命令将显示系统的运行级别 使用-q选项, who命令将只显示所有登录用户的用户名和登录的用户数 uptime 查看系统运行时间 uname 查看系统信息 使用-n选项,uname命令将只打印系统的主机名,其输出与hostname命令相同 使用-r选项,uname命令将打印内核版本信息 使用-m选项,uname命令将打印系统的硬件名 使用-p选项,uname命令将打印系统的处理器类型的信息 使用-i选项,uname命令将打印系统的硬件平台信息 使用-a选项,uname命令将打印上述所有示例中的信息 date 使用-d或--date选项,你可以指定日期和时间的字符串值,date命令会将此输入的字符串转换为相应的日期时间格式: date --date="10/1/2013" 使用-f或--file选项,date命令可以从文件中读取多个日期时间字符串,并将其转换为相应的日期时间格式打印输出 date --file=datefile 使用-s或--set选项,date命令可以设定系统的日期和时间 使用-u或--utc或--universal选项,date命令将打印输出世界标准时间 使用-r选项,date命令可以打印输出指定文件的最近修改时间 用格式化选项来自定义date命令打印输出的时间和日期的格式 date +%<format-option> id命令显示用户属性 id命令用于打印输出用户的uid、gid、用户名和组名等用户身份信息 使用-u选项,id命令将只打印输出用户的uid 使用-u选项和-n选项结合使用,可以打印输出账号的用户名,而不是uid 使用-g选项,id命令将只打印输出账号当前起作用的gid 使用-G选项,id命令将打印输出账号所属于的所有群组的id 使用-G与-n选项结合使用,可以打印输出账号所属于的所有群组的名称
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281358.html