打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
linux shell 学习笔记(四)
一、shell 命令的格式如下:
$ 命令 [选项] [参数]
选项是包括一个或多个字母的代码,前面必有一个“-”号(“-”区别选项与参数),选项可以用于改变命令执行动作的类型。具体见下例
二、bash配置文件
[xiaochen@host ~]$ ls .bash*
.bash_history  .bash_logout  .bash_profile  .bashrc
*.bash_history记录了用户以前输入的命令
*.bash_logout 退出shell时要用的命令
*.bash_profile 登录Bash时要执行的命令,以及配置的Bash环境变量。
*.bashrc 每次打开新的Bash时,要执行的命令,以及配置的Bash环境变量。
注:由于“.bash_profile”经常被设置成先读到“.bashrc”的内容,所以如果图省事的话,右以把所有配置都放进“.bashrc”中
以上的文件是每一位用户都有的设置。系统级的设置存储在文件“/etc/profile"文件“/etc/bashrc"及目录“/etc/profile.d"中
用户就优先把自己的个性化设置存放在用户根目录配置文件中,当系统级与用户级的设置发生冲突时,将优先采用用户级的设置。

三、bash的提示符
命令echo $PS1可以显示当前的设定
[xiaochen@host ~]$ echo $PS1
[\u@\h \W]\$
可以对shell进行设置来显示用户当前所在目录。{详见 man bash}
方法:
[xiaochen@host ~]$ cd /etc/profile.d
[xiaochen@host profile.d]$ export PS1="\u@\h \w\\$"
xiaochen@host /etc/profile.d$
[xiaochen@host ~]$ gedit .bashrc
即先采用环境变量测试,找到了合适的设置后加到.bashrc中


四、环境变量
在shell配置文件中一般定义了很多的环境变量。命令“set“可以列出所有当前定义的所有环境变量。
环境变量可以分为三种:系统变量,环境变量和用户变量。
shell 常用的系统变量
表示方法        描述
$n            $1表示第一个参数,$2表示第二个参数……
$#            命令行参数的个数
$0            当前程序的名称
$?            前一个命令或函数的返回码
$*            以“参数1,参数2,参数3……”形式保存所有参数
$@            以“参数1”,“参数2”……形式保存所有参数
$$            本程序的PID(进程ID号)
$!            上一人命令的PID

常用的shell环境变量
名称            描述
PATH            命令搜索路径,以冒号为分隔符。注意与DOS下不同的量,当前目录不在系统路径里。
HOME            用户根目录的路径名。命令"cd"的默认参数
COLUMNS        定义了命令编辑模式下可使用命令行的长度
EDITOR        默认的行编辑器
VISUAL        默认的可视编辑器
HISTFILE        命令历史文件
HISTSIZE        命令历史文件最多可包含的命令条数
IFS            定义Shell使用的分隔符
LOGNAME        用户登录名
MAIL            指向一个需要shell监视其修改时间的文件。当该文件修改后,shell将提醒用户查收新邮件
MAILCHECK        shell检查邮件的周期,单位是秒
SHELL            shell的路径名
TERM            终端类型
PS1            主命令提示符
PS2            二级命令提示符,命令执行过程中要求输入数据时用
PS3            select的命令提示符
PS4            调试命令提示符
MANPATH        寻找手册页的路径
LD_LIBRARY_PATH    寻找动态链接库文件的路径,以冒号分隔

所有的环境变量都在shell配置文件中定义,一般来说,变量名用大写
在linux系统中,当设置一个变量时,直接用名称,而不需要加符号“$"。例如:PATH=/usr/bin:/bin:/usr/local/bin
而要获变量值的话,就要在变量名前加符号“$"。例如:
[xiaochen@host ~]&echo $PATH
/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/xiaochen/bin
如果在变量名前没有符号"$",变量名会被当作普通文本。
[xiaochen@host ~]&echo PATH
PATH

注:处理“$PATH”时需要注意:该变量不能替换,而是要将新的字符添加到原来的值中。在大多数情况下,不能用"/PATH=/some/directory",因为这将删除"$PATH"中其他的所有目录。只能进行添加:PATH=$PATH:/some/directory
也就是说,PATH的值被设成当前的值(以$PATH来表示)+新添加的目录
[xiaochen@host ~]&echo $PATH
/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/xiaochen/bin:/some/directory
[xiaochen@host ~]&echo $PATH
/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/xiaochen/bin
新的变量仅是一个局部变量,仅在当前终端中有用。若要定义一个全局变量,就要将局部变量输出(export)
export PATH=$PATH:/some/directory
如果要将目录永久添加到环境变量“$PATH”中就必须把“export"那行命令添加到用户要目录下的“bash_profile"文件中。注意:不能放到.bashrc中,否则会导致PATH意外加长。


五、Bash的功能
1)自动补齐     Tab键的使用
2)命令行的历史事件
history命令的使用
“!”的使用
[xiaochen@host ~]&!P
PATH=$PATH:/some/directory
[xiaochen@host ~]&!65    //65是指的事件号
cd /
[xiaochen@host /]&!!    //!!是指上一事件
cd /
也可以使用搜索模式 必须用?括起来
[xiaochen@host ~]&!?echo PATH?
echo PATH
PATH

系统保存的历史事件数保存在HISTSIZE变量中。其默认值是1000,不过可以修改
[xiaochen@host ~]&echo $HISTSIZE
1000
[xiaochen@host ~]$ echo $HISTSIZE
100

历史事件被保存在一个文件中,文件名由变量HISTSIZE指定。通常其默认名是.bash_history"

shell 还支持对历史命令的增量搜索。“Ctrl+r"
(reverse-i-search)`P': echo PATH按回车就可运行,但按方向键左或右就可以进行编辑

3)编辑命令行快捷键
Ctrl+k    删除从光标到行尾的部分
Ctrl+u    删除从光标到行首的部分
Ctrl+w    删除从光标到当前单词开头的部分
Ctrl+a    将光标移到行首
Ctrl+e    将光标移动到行尾
Ctrl+y    插入最近删除的单词
Alt+d        删除从光标到当前单词结尾的部分
Alt+a        将光标移动到当前单词的开头
Alt+e        将光标移动到当前单词的结尾
!$        重复前一个命令最后的参数
<注:也可以使用功能键及方向键>

4)命令的组合
注:为了看起来更清楚,命令之间在符号之间增加了空格。而在实际中并不需要这么做。如 ls -a;du -hs 与ls -a;du -hs等价;
组合方式一:
command1 ;command2
特点:先执行命令1,不管命令1是否出错,命令2都要执行

组合方式二:
command1 && command2
特点:只有在命令1正确运行后才能执行命令2

组合方式三:
command1 || command2
特点:如果第一个命令执行失败了,就执行每二个命令

组合方式四:
(command1 ;command2:……)在当前shell中执行
{command1 ;command2:……}在子shell中执行

5)任务调度(jobbing)与后台化(backgrounding)
方法一:
在命令的后面加一个&
命令jobs可以列出当前终端中运行着的命令与程序
[xiaochen@host ~]$ gedit &
[1] 5376
[xiaochen@host ~]$ jobs
[1]+  Done                    gedit
方法二:
先使用快捷键 ctrl+z 挂起终端中正在运行的程序,然后使用 bg 命令将其放到后台去执行。
如:
[xiaochen@host ~]$ less /etc/bashrc

[1]+  Stopped                 less /etc/bashrc
[xiaochen@host ~]$ bg
[1]+ less /etc/bashrc &

[1]+  Stopped                 less /etc/bashrc
注:一些应用程序,很可能还在测试期(beta),尽管在后台运行,也会在终端中输出一些信息。可以使用如下的命令,来使它到输出信息以/dev/null文件(叫碎纸机(shredder)) command &>/dev/null &

6)命令的替换
语法:
command1 $(command2)
或command1 'command2'

7)文件名匹配
通配符(wildcard)
*        匹配文件名中任何字符串,包括空格串
?        匹配文件名中的任何单个字符
[...]        匹配“[]”中所包括的任何字符
[!...]        匹配“[]”中非感叹号“!”之后的字符
如[!0-9]表示非数字开头的字符串

8)输入与输出重定向
在shell中执行命令的时候,每个进程都和3个打开的文件相联系,并使用文件描述符来引用这些文件。系统中实际上有12个文件描述符,0,1,2分别是标准输入、标准输出和标准错误输出。
*stdin: 标准输入,使用文件描述符 0
*stdout:标准输出,使用文件描述符 1
*stderr:标准错误输出,使用文件描述符2

几个命令的介绍
a)echo
作用:来显示文本或变量,也可以把字符串输入到文件。
形式:echo string
如:
[xiaochen@host ~]$ echo "hellO"
hellO
[xiaochen@host ~]$ echo $HOME
/home/xiaochen
选项-n可以禁止输出后换行
[xiaochen@host ~]$ echo -n "hellO"
hellO[xiaochen@host ~]$

如果想把一个字符串输出到一个文件中,就可以使用重定向符号“>”
[xiaochen@host ~]$ echo "hello hello">test
[xiaochen@host ~]$ cat test
hello hello
[xiaochen@host ~]$ echo "shit what are you doing">test
[xiaochen@host ~]$ cat test
shit what are you doing
[xiaochen@host ~]$ echo "hello hello">>test
[xiaochen@host ~]$ cat test
shit what are you doing
hello hello
由上可知:使用>会覆盖原来的内容,而使用>>则只是追加,这样可以根据需要进行灵活选择

b)read
可以从键盘或文件的某一行文本中读入信息,并将其赋给生个变量。如果只指定了一个变量,那么命令read将会把所有的输入赋给该变量,直到遇到第一个文件结束符或回车。
其一般形式为:read variblel varible2
[xiaochen@host ~]$ read string
this is a test of read
[xiaochen@host ~]$ echo $string
this is a test of read

[xiaochen@host ~]$ read name name2
chenhao pengyong
[xiaochen@host ~]$ echo $name
chenhao
[xiaochen@host ~]$ echo $name2
pengyong

[xiaochen@host ~]$ read name name2
xiaochen xiaoming xiaohua
[xiaochen@host ~]$ echo $name
xiaochen
[xiaochen@host ~]$ echo $name2
xiaoming xiaohua
这表明录输入文过长时,shell将把超长部分全部赋给最后一个变量

c)cat
cat命令可以用来显示文件内容、创建文件,还可以用它来显示控制字符。
一般形式:cat [option要]filename1 filename2 ……
用途:一个简单的文字编辑器.
如:
[xiaochen@host ~]$ vi file1
[xiaochen@host ~]$ vi file2
[xiaochen@host ~]$ vi file3
[xiaochen@host ~]$ cat file1
hello
one

[xiaochen@host ~]$ cat file2
l love it!
[xiaochen@host ~]$ cat file3
fedora a great system!
[xiaochen@host ~]$ cat file1 file2 file3 >bigfile
[xiaochen@host ~]$ cat bigfile
hello
one
l love it!
fedora a great system!

[xiaochen@host ~]$ cat >file4
hello hello what are you doing?
why?
are you ok?
[xiaochen@host ~]$ cat file4
hello hello what are you doing?
why?
are you ok?
如上所示,如果想建一个文件并且输入一些内容,就可以使用cat命令,用cat把输出定向到该文件,就可以了。这时输入是键盘,输出是文件,当想结束输入时按下ctrl+d组合键即可。

常用文件重定向命令
命令                                    意义
command >filename                    把标准输出重定向到一个新文件中
command >>filename                    把标准输出重定向到一个文件中(追加方式)
command > filename 2>&1            把标准输出和标准错误一起重定向到一个文件中
command 2> filename             把标准错误重定向到一个文件中
command 2>> filename            把标准错误以追加方式重定向到一个文件中
command >> filename 2>&1        把标准错误和标准输出一起重定向到一个文件中(追加方式)
command < filename >filename2        把command以文件filename作为标准输入,以文件filename2作为标准输出
command <filename                命令 command以文件filename作为标准输入
command << deliniter            从标准输入中读入,直到遇到分界符delimiter分界符
command <&m                    把文件描述符m作为标准输入
command >&m                    把标准输出重定向到文件描述符m中
command <&-                    关闭标准输入

例子:
把文件/etc/passwd的用户ID域按照用户名排列。该命令的输出重定向到文件 sort.out中
[xiaochen@host ~]$ cat /etc/passwd | awk -F: '{print $1}' | sort 1>sort.out
[xiaochen@host ~]$ cat sort.out
adm
apache
avahi
backuppc
bin
daemon
dbus
ftp
games
gdm
gopher
haldaemon
halt
hsqldb
jetty
lighttpd
lp
mail
mailnull
mysql
named
news
nfsnobody
nobody
nscd
ntp
openvpn
operator
polkituser
postgres
pulse
root
rpc
rpcuser
rpm
shutdown
smmsp
sshd
sync
tcpdump
tomcat
torrent
uucp
vcsa
virtualftp
xiaochen

[xiaochen@host ~]$ cat /etc/passwd | awk -F: '{print $1}' | sort >sort.out
也可以达到相同的效果

注意:管道的使用
管道也是一种输出重定向方式
管道可以把一个命令的输出传递给另一个命令作为输入。管道用符号"|"表示。它的使用方法是:
command1 | command2
例如,可以对一个文件进行排序,然后管道输送到打印机
[xiaochen@host ~]$ sort file3 | lp
还可以在多个命令间进行重定向
如:
[xiaochen@host ~]$ cat /etc/passwd | awk -F: '{print $1}' | sort >sort.out


9)shell中的快捷方式(别名)
别名(alias)
例如:~就代表了用户的根目录
别名定义的语法是:
alias shortcut='command'
删除一个别名使用unalias
不带参数将列出当前系统定义的所有别名
[xiaochen@host ~]$ alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
注:如果命令中有空格,就需要使用引号。同时单引号与双引号是有区别的
同时,别名不能重复,但一个命令可以有多个别名。

补充说明:几种引号的说明
单引号
由单引号括起来的字符都作为普通字符出现。如:
[xiaochen@host ~]$ string='$PATH'
[xiaochen@host ~]$ echo $string
$PATH
双引号
由双引号括起来的字符,除符号$,\,',"仍是特殊字符外,其余的字符都作为普通字符来对待。
$用指定变量的值来代替这个变量和符号$
\ 转义字符
[xiaochen@host ~]$ string="$PATH"
[xiaochen@host ~]$ echo $string
/usr/lib64/qt-3.3/bin:/usr/kerberos/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/xiaochen/bin
反引号`
它被shell解释为命令行
[xiaochen@host ~]$ pwd
/home/xiaochen
[xiaochen@host ~]$ string="current directory is `pwd`"
[xiaochen@host ~]$ echo $string
current directory is /home/xiaochen
再如
[xiaochen@host ~]$ today=`date`
[xiaochen@host ~]$ echo Today is $today
Today is 2008年 07月 08日 星期二 19:11:27 CST

10)控制bash的工作方式
bash中有一些特殊的变量,能控制bash以不同的方式工作。如 变量“noclobber"能防止在重定向输出时意外地覆盖一个文件。通过命令 set可以设置变量 noclobber的值。命令 set 有两个参数:一个是指定变量开(on)或关(off),另一个就是特殊变量的变量名。
要使某一特殊变量有效,用“-o”选项;要使其关,就用+O选项

$set -o noclobber
$set +o noclobber

此外,还有两个特殊变量也较用
ignoreeof 用来禁止ctrl+d 来退出shell
noglob 让shell不扩展文件名中一些特殊的字符或字符串。例如,字符“*"等不再为通配符。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux Shell脚本面试25问 - 博客 - 伯乐在线
Shell:语法规范
linux超级基础系列——shell变量(本地变量和环境变量)
Shell脚本编程30分钟入门
Linux基础
linux shell 判断一个命令是否存在
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服