资讯详情

linux-鸟哥私房菜,基础命令全掌握

日期

关机重启

实例

用户及权限

变更权限命令

档案属性与目录

检查环境变量

ls查看文件列表

cp复制文件

查看文件操作

cat

nl

more (一页一页翻动)

less (一页一页翻动)

head

tail

od

touch

vi

寻找指令

which

whereis

find(重要)

压缩和包装档案

compress

gzip

bzip2

tar

认识shell

命令

获取变量

双引号单引号

` 符号的作用

列出目前的 shell 环境中的所有环境变量及其内容

env

set

设置字符编码等

read

数组

其他

判断命令执行的依据: ; , &&, ||

限制档案系统和程序: ulimit

命令取别名:alias

历史命令:history

登录信息显示数据: /etc/issue, /etc/motd

stty

快捷键

输出重定向

管线命令 (pipe) |

grep

sort

wc

学习shell scripts

test判断

利用判断符号 [ ]

变量

利用 if .... then

利用 case ..... esac 判断

利用 function 功能

循环 (loop)

shell script 的追踪与 debug

linux账号与身份管理

有效群组(effective group)与初始群组(initial group)

新增用户:useradd

修改密码

usermod

删除用户

使用者功能:chfn, chsh修改用户信息

finger [-s] username    查询用户信息

查询用户的各种id

groupadd 添加组

groupmod修改群组

groupdel 删除群组

gpasswd 修改群组密码

su

sudo 是怎样工作的

如果想修改sudu   要使用  visudo

查询使用者: w, who, last, lastlog

使用者对谈: talk, mesg, wall

使用者邮件信箱: mail

一些检查工具

删除账号

linux磁盘配额

linux磁盘与档案系统管理

例行性命令的建立

仅进行一次的工作排程: at

使用者的设定: crontab(定时任务)

程序与资源管理

将『目前』的工作丢到背景中『暂停』:[ctrl]-z

观察目前的背景工作状态: jobs

将背景工作拿到前景来处理:fg

让工作在背景下进行: bg

管理背景当中的工作: kill

ps

top

pstree

free

uname

uptime   开机多久了。

netstat

sar

nice

fuser

lsof

开机关机流程与loader


日期

显示日期:date

显示日历:cal 、 cal 2019 、cal 6 2019

计算器:bc

关机重启

-k : 不要真的关机,只是发送警告讯息出去!

-r : 在将系统的服务停掉之后就重新开机

-h : 将系统的服务停掉后,立即关机。

-n : 不经过 init 程序,直接以 shutdown 的功能来关机

-f : 关机并开机之后,强制略过 fsck 的磁盘检查

-F : 系统重新开机之后,强制进行 fsck 的磁盘检查

-c : 取消已经在进行的 shutdown 指令内容。

实例

root@linux ~]# shutdown -h now 立刻关机,其中 now 相当于时间为 0 的状态 [root@linux ~]# shutdown -h 20:25 系统在今天的 20:25 分会关机 [root@linux ~]# shutdown -h +10 系统再过十分钟后自动关机 [root@linux ~]# shutdown -r now 系统立刻重新开机 [root@linux ~]# shutdown -r +30 'The system will reboot' 再过三十分钟系统会重新开机,并显示后面的讯息。 [root@linux ~]# shutdown -k now 'This system will reboot' 仅发出警告信件的参数!系统并不会关机啦!吓唬人!

用户及权限

一个用户可以有多个组。

所有的系统上的账号与一般身份使用者,还有那个 root 的相关信息,都是记录在 /etc/passwd 这个档案内的。

密码记录在 /etc/shadow 这个档案下。 

Linux 所有的群组名称都纪录在 /etc/group 内!

注意:只有给目录的其他成员权限,附成r-x权限以上,其他成员才可以进入该目录;r--这样没有可执行权限,是无法进入目录的!文件可以!

x 在目录当中是与『能否进入该目录』有关, 至于那个 w 则具有相当重要的权限,因为他可以让使用者删除、更新、新建档案或目录

改变权限命令

chgrp :改变档案所属群组

chown :改变档案所属人

chmod :改变档案的属性、 SUID、等等的特性

chgrp [-R] dirname/filename 

chown [-R] 账号名称 档案或目录

chown [-R] 账号名称:群组名称 档案或目录

chmod [-R] xyz 档案或目录

chmod [ugoa] [+-=] [rwx] 档案或目录  (user、group、other)

umask

0022  (后面三个数是默认权限,减去的权限)

umask -S

u=rwx,g=rx,o=rx

umask 指定的是『该默认值需要减掉的权限!』

s 与 t 的权限,是为了让一般使用者在执行某些程序的时候, 能够暂时的具有该程序拥有者的权限。

当一个指令具有 SUID 的功能时,则当其它人使用这个指令时,该程序将具有指令拥有者的权限。

• 4 为 SUID

• 2 为 SGID 

• 1 为 Sticky bit

chmod 4755 filename 前面数字代表权限

档案属性与目录

mkdir -p /home/t/tt/ttt   :递归建立文件夹若上级不存在则创建

mkdir -m 711 test2    :可以直接指定文件夹的权限

rmdir [-p]  : 删除文件夹(-p递归删除空文件夹) 这个命令只能删除空文件夹

查看环境变量

echo $PATH    每个目录之间用:连接

PATH="$PATH":/root    添加环境变量

ls查看文件列表

ls -al 可以查看隐藏文件

ls [-aAdfFhilRS] 目录名称

ls [--color={none,auto,always}] 目录名称

ls [--full-time] 目录名称

参数:

-a :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来~

-A :全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录,一起列出来~

-d :仅列出目录本身,而不是列出目录内的档案数据

-f :直接列出结果,而不进行排序 (ls 预设会以档名排序!)

-F :根据档案、目录等信息,给予附加数据结构,例如:

*:代表可执行档; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案;

-h :将档案容量以人类较易读的方式(例如 GB, KB 等等)列出来;

-i :列出 inode 位置,而非列出档案属性;

-l :长数据串行出,包含档案的属性等等数据;

-n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!)

-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;

-R :连同子目录内容一起列出来;

-S :以档案容量大小排序!

-t :依时间排序

--color=never :不要依据档案特性给予颜色显示;

--color=always :显示颜色

--color=auto :让系统自行依据设定来判断是否给予颜色

--full-time :以完整时间模式 (包含年、月、日、时、分) 输出

--time={atime,ctime} :输出 access 时间或 改变权限属性时间 (ctime)而非内容变更时间 (modification time)

• modification time (mtime):当该档案的『内容数据』变更时,就会更新这个时间! 内容数据指的是档案的内容,而不是档案的属性喔!

• status time (ctime):当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说, 像是权限与属性被更改了,都会更新这个时间啊~

• access time (atime):当『该档案的内容被取用』时,就会更新这个读取时间 (access)。 举例来说,我们使用 cat 去读取 ~/.bashrc ,就会更新 atime 了。

cp复制文件

cp [-adfilprsu] 来源档(source) 目的檔(destination)

cp [options] source1 source2 source3 .... directory

参数:

-a :相当于 -pdr 的意思;

-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;

-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;

-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!

-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;

-p :连同档案的属性一起复制过去,而非使用预设属性;

-r :递归持续复制,用于目录的复制行为;

-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;

-u :若 destination 比 source 旧才更新 destination !

文件查看操作

• cat 由第一行开始显示档案内容

• tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

• nl 显示的时候,顺道输出行号!

• more 一页一页的显示档案内容

• less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

• head 只看头几行

• tail 只看尾巴几行

• od 以二进制的方式读取档案内容!

cat

cat [-AEnTv]

参数:

-A :相当于 -vET 的整合参数,可列出一些特殊字符~

-E :将结尾的断行字符 $ 显示出来;

-n :打印出行号;

-T :将 [tab] 按键以 ^I 显示出来;

-v :列出一些看不出来的特殊字符

nl

nl [-bnw] 档案

参数:

-b :指定行号指定的方式,主要有两种:

-b a :表示不论是否为空行,也同样列出行号;

-b t :如果有空行,空的那一行不要列出行号;

-n :列出行号表示的方法,主要有三种:

-n ln :行号在屏幕的最左方显示;

-n rn :行号在自己字段的最右方显示,且不加 0 ;

-n rz :行号在自己字段的最右方显示,且加 0 ;

-w :行号字段的占用的位数。

more (一页一页翻动)

more (一页一页翻动)

• 空格键 (space):代表向下翻一页;

• Enter :代表向下翻『一行』;

• /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』;

• :f :立刻显示出文件名以及目前显示的行数;

• q :代表立刻离开 more ,不再显示该档案内容。

less (一页一页翻动)

less (一页一页翻动)

• 空格键 :向下翻动一页;

• [pagedown]:向下翻动一页;

• [pageup] :向上翻动一页;

• /字符串 :向下搜寻『字符串』的功能;

• ?字符串 :向上搜寻『字符串』的功能;

• n :重复前一个搜寻 (与 / 或 ? 有关!)

• N :反向的重复前一个搜寻 (与 / 或 ? 有关!)

• q :离开 less 这个程序;

head [-n number] 档案

参数:

-n :后面接数字,代表显示几行的意思

tail

tail [-n number] 档案

参数:

-n :后面接数字,代表显示几行的意思

od

od [-t TYPE] 档案

参数:

-t :后面可以接各种『类型 (TYPE)』的输出,例如:

a :利用预设的字符来输出;

c :使用 ASCII 字符来输出

d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ;

f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;

o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;

x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;

• modification time (mtime):当该档案的『内容数据』变更时,就会更新这个时间! 内容数据指的是档案的内容,而不是档案的属性喔!

• status time (ctime):当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说, 像是权限与属性被更改了,都会更新这个时间啊~

• access time (atime):当『该档案的内容被取用』时,就会更新这个读取时间 (access)。 举例来说,我们使用 cat 去读取 ~/.bashrc ,就会更新 atime 了。

touch

touch [-acdmt] 档案

参数:

-a :仅修订 access time;

-c :仅修改时间,而不建立档案;

-d :后面可以接日期,也可以使用 --date="日期或时间"

-m :仅修改 mtime ;

-t :后面可以接时间,格式为[YYMMDDhhmm]

touch -d "2 days ago" bashrc

touch -t 0507150202 bashrc

vi

vi命令大全_秃了也弱了。的博客-CSDN博客

寻找指令

which

which [-a] command

参数:

-a :将所有可以找到的指令均列出,而不止第一个被找到的指令名称

whereis

寻找特定档案:

whereis [-bmsu] 档案或目录名

参数:

-b :只找 binary 的档案(可执行)

-m :只找在说明文件 manual 路径下的档案

-s :只找 source 来源档案

-u :没有说明档的档案!

find(重要)

find [PATH] [option] [action]

参数:

1. 与时间有关的参数:

-atime n :n 为数字,意义为在 n 天之前的『一天之内』被 access 过的档案;

-ctime n :n 为数字,意义为在 n 天之前的『一天之内』被 change 过状态的档案;

-mtime n :n 为数字,意义为在 n 天之前的『一天之内』被 modification 过的档案;

-newer file :file 为一个存在的档案,意思是说,只要档案比 file 还要新,就会被列出来~

2. 与使用者或群组名称有关的参数:

-uid n :n 为数字,这个数字是使用者的账号 ID,亦即 UID ,这个 UID 是记录在

/etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。

-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在

/etc/group,相关的介绍我们会第四篇说明~

-user name :name 为使用者账号名称喔!例如 dmtsai

-group name:name 为群组名称喔,例如 users ;

-nouser :寻找档案的拥有者不存在 /etc/passwd 的人!

-nogroup :寻找档案的拥有群组不存在于 /etc/group 的档案!

当您自行安装软件时,很可能该软件的属性当中并没有档案拥有者,这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

3. 与档案权限及名称有关的参数:

-name filename:搜寻文件名称为 filename 的档案;

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有:

c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB还要大的档案,就是『 -size +50k 』

-type TYPE :搜寻档案的类型为 TYPE 的,类型主要有:一般正规档案 (f),装置档案 (b, c), 目录 (d), 连结档 (l), socket (s),及 FIFO (p) 等属性。

-perm mode :搜寻档案属性『刚好等于』 mode 的档案,这个 mode 为类似 chmod的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !

-perm -mode :搜寻档案属性『必须要全部囊括 mode 的属性』的档案,举例来说,我们要搜寻 -rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744,

当一个档案的属性为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,

因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。

-perm +mode :搜寻档案属性『包含任一 mode 的属性』的档案,举例来说,我们搜寻-rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw-------也会被列出来,因为他有 -rw.... 的属性存在!

4. 额外可进行的动作:

-exec command :command 为其它指令,-exec 后面可再接额外的指令来处理搜寻到的结果。

-print :将结果打印到屏幕上,这个动作是预设动作!

范例:

范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的档案列出

[root@linux ~]# find / -mtime 0

# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,

# 有变动过内容的档案都会被列出来!那如果是三天前的 24 小时内?

# find / -mtime 3 ,意思是说今天之前的 3*24 ~ 4*24 小时之间

# 有变动过的档案都被列出的意思!同时 -atime 与 -ctime 的用法相同。

范例二:寻找 /etc 底下的档案,如果档案日期比 /etc/passwd 新就列出

[root@linux ~]# find /etc -newer /etc/passwd

# -newer 用在分辨两个档案之间的新旧关系是很有用的!

范例三:搜寻 /home 底下属于 dmtsai 的档案

[root@linux ~]# find /home -user dmtsai

# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有档案时,

# 就可以利用这个指令将属于某个使用者的所有档案都找出来喔!

范例四:搜寻系统中不属于任何人的档案

[root@linux ~]# find / -nouser

# 透过这个指令,可以轻易的就找出那些不太正常的档案。

# 如果有找到不属于系统任何人的档案时,不要太紧张,

# 那有时候是正常的~尤其是您曾经以原始码自行编译软件时。

范例五:找出档名为 passwd 这个档案

[root@linux ~]# find / -name passwd

# 利用这个 -name 可以搜寻档名啊!

范例六:搜寻档案属性为 f (一般档案) 的档案

[root@linux ~]# find /home -type f

# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的档案,

# 例如 socket 与 FIFO 档案,可以用 find /var -type p 或 -type s 来找!

范例七:搜寻档案当中含有 SGID/SUID/SBIT 的属性

[root@linux ~]# find / -perm +7000

# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,

# 所以当然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三个权限,

# 因此,就是 +7000 ~瞭乎?

范例八:将上个范例找到的档案使用 ls -l 列出来~

[root@linux ~]# find / -perm +7000 -exec ls -l {} \;

# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,

# 而那个 {} 代表的是『由 find 找到的内容』的意思~所以, -exec ls -l {}

# 就是将前面找到的那些档案以 ls -l 列出长的数据!至于 \; 则是表示

# -exec 的指令到此为止的意思~意思是说,整个指令其实只有在

# -exec (里面就是指令下达) \;

# 也就是说,-exec 最后一定要以 \; 结束才行!这样了解了吗?!

范例九:找出系统中,大于 1MB 的档案

[root@linux ~]# find / -size +1000k

# 虽然在 man page 提到可以使用 M 与 G 分别代表 MB 与 GB,

# 不过,俺却试不出来这个功能~所以,目前应该是仅支持到 c 与 k 吧!

档案压缩与打包

• *.Z compress 程序压缩的档案;

• *.bz2 bzip2 程序压缩的档案;

• *.gz gzip 程序压缩的档案;• *.tar tar 程序打包的数据,并没有压缩过;

• *.tar.gz tar 程序打包的档案,其中并且经过 gzip 的压缩

compress

compress [-dcr] 档案或目录

参数:

-d :用来解压缩的参数

-r :可以连同目录下的档案也同时给予压缩呢!

-c :将压缩数据输出成为 standard output (输出到屏幕)

gzip

gzip [-cdt#] 檔名

zcat 檔名.gz (查看压缩的文件内容)

参数:

-c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理;

-d :解压缩的参数;

-t :可以用来检验一个压缩档的一致性~看看档案有无错误;

-# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6 ~

bzip2

bzip2 [-cdz] 檔名

bzcat 檔名.bz2(查看压缩的文件内容)

参数:

-c :将压缩的过程产生的数据输出到屏幕上!

-d :解压缩的参数

-z :压缩的参数

-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!

tar

tar [-cxtzjvfpPN] 档案与目录 ....

参数:

-c :建立一个压缩档案的参数指令(create 的意思);

-x :解开一个压缩档案的参数指令!

-t :查看 tarfile 里面的档案!

特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!

因为不可能同时压缩与解压缩。

-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?

-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?

-v :压缩的过程中显示档案!这个常用,但不建议用在背景执行过程!

-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!

例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成

『 tar -zcvPf tfile sfile』才对喔!

-p :使用原档案的原来属性(属性不会依据使用者而变)

-P :可以使用绝对路径来压缩!

-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的档案中!

--exclude FILE:在压缩的过程中,不要将 FILE 打包!

认识shell

命令取别名:

alias lm='ls -al'   :lm指定为ls -al

万用字符  * 

command [-options] parameter1 parameter2 ...

指令 选项 参数(1) 参数(2)

说明:

0. 一行指令中第一个输入的绝对是『指令(command)』或『可执行档案』

1. command 为指令的名称,例如变换路径的指令为 cd 等等;

2. 中刮号[]并不存在于实际的指令中,而加入参数设定时,通常为 - 号,例如 -h;

有时候完整参数名称会输入 -- 符号,例如 --help;

3. parameter1 parameter2.. 为依附在 option 后面的参数,

或者是 command 的参数;

4. command, -options, parameter1.. 这几个咚咚中间以空格来区分,

不论空几格 shell 都视为一格;

5. 按下 [Enter] 按键后,该指令就立即执行。[Enter] 按键为 <CR> 字符,

他代表着一行指令的开始启动。

6. 指令太长的时候,可以使用 \ 符号来跳脱 [Enter] 符号,

使指令连续到下一行。注意! \ 后就立刻接特殊字符。

7. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。

获取

变量后面可以接 #, ##, %, %%, /, // , 而他们存在的意义并不相同的

a=1

echo $a

echo ${a}

1. 变量与变量内容以等号『=』来连结;

2. 等号两边不能直接接空格符;

3. 变量名称只能是英文字母与数字,但是数字不能是开头字符;

4. 若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意, 双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;

5. 必要时需要以跳脱字符『 \ 』来将特殊符号 ( 如 Enter, $, \, 空格符, ' 等 ) 变成一般符号;

6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote 『` command` 』;(特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!)

7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称 如:『"$PATH":/home』继续累加内容;

8. 若该变量需要在其它子程序执行,则需要以 export 来使变量变成环境变量, 如『export PATH』;

9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断 ( 纯粹依照使用者兴趣与嗜好 ) ;

10. 取消变量的方法为:『unset 变量名称』。

单引号双引号

单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是

一般字符 ,而不会有特殊符号。

[root@linux ~]# name=VBird

[root@linux ~]# echo $name

VBird

[root@linux ~]# myname="$name its me"

[root@linux ~]# echo $myname

VBird its me

[root@linux ~]# myname='$name its me'

[root@linux ~]# echo $myname

$name its me

` 符号的作用

在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息!

ls -l `locate crontab`  :先执行后面的语句在执行前面的。

列出目前的 shell 环境下的所有环境变量与其内容

env

[root@linux ~]#

HOSTNAME=linux.dmtsai.tw <== 这部主机的主机名称

SHELL=/bin/bash <== 目前这个环境下,使用的 Shell 是哪一个程序?

TERM=xterm <== 这个终端机使用的环境是什么类型

HISTSIZE=1000 <== 这个就是『记录指令的笔数』在 FC4 预设可记录 1000 笔

USER=root <== 使用者的名称啊!

LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:

or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=0

0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=

00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;3

1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00

;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示

ENV=/root/.bashrc <== 使用的个人环境设定档

MAIL=/var/spool/mail/root <== 这个使用者所取用的 mailbox 位置

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:

/root/bin <== 不再多讲啊!是执行文件指令搜寻路径

INPUTRC=/etc/inputrc <== 与键盘按键功能有关。可以设定特殊按键!

PWD=/root <== 目前使用者所在的工作目录 (利用 pwd 取出!)

LANG=en_US.UTF-8 <== 这个与语系有关,底下会再介绍!

HOME=/root <== 这个使用者的家目录啊!

_=/bin/env <== 上一次使用的指令的最后一个参数(或指令本身)

set

这个指令除了会将环境变量列出来之外,其它我们的自订变量,与所有的变量,都会被列出来喔!

[root@linux ~]# set

BASH=/bin/bash <== bash 的主程序放置路径

BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release"

[5]="i386-redhat-linux-gnu") <== bash 的版本啊!

BASH_VERSION='3.00.16(1)-release' <== bash 的版本啊!

COLORS=/etc/DIR_COLORS.xterm <== 使用的颜色纪录档案

COLUMNS=115 <== 在目前的终端机环境下,使用的字段有几个字符长度

HISTFILE=/root/.bash_history <== 历史命令记录的放置档案,隐藏档

HISTFILESIZE=1000 <== 存起来(与上个变量有关)的档案之指令的最大纪录笔数。

HISTSIZE=1000 <== 目前环境下,可记录的历史命令最大笔数。

HOSTTYPE=i386 <== 主机安装的软件主要类型。我们用的是 i386 兼容机器软件

IFS=$' \t\n' <== 预设的分隔符

LINES=35 <== 目前的终端机下的最大行数

MACHTYPE=i386-redhat-linux-gnu <== 安装的机器类型

MAILCHECK=60 <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信!

OLDPWD=/home <== 上个工作目录。我们可以用 cd - 来取用这个变量。

OSTYPE=linux-gnu <== 操作系统的类型!

PPID=20046 <== 父程序的 PID (会在后续章节才介绍)

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'

<== 上面这个是命令提示字符!与底下也有关。

PS1='[\u@\h \W]\$ ' <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的

[root@linux ~]# 或 [dmtsai ~]$ 的设定值啦!可以更动的!

RANDOM=13586 <== 随机数啊!上面已经提过啰~

SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支持的语系

name=VBird <== 刚刚设定的自订变量也可以被列出来喔!

$ <== 目前这个 shell 所使用的 PID

? <== 刚刚执行完指令的回传值。

echo $$  :获取shell的pid

echo $? :?获取到上一个指令的返回码(0为成功,其他为失败)。

export a : a变量可以在shell子程序中使用了。

locale -a  :查询支持的语言(非常多)

设置字符编码等

[root@linux ~]# LANG <==主语言的环境

[root@linux ~]# LC_CTYPE <==字符辨识的编码

[root@linux ~]# LC_NUMERIC <==数字系统的显示讯息

[root@linux ~]# LC_TIME <==时间系统的显示数据

[root@linux ~]# LC_COLLATE <==字符串的比较与排序等

[root@linux ~]# LC_MONETARY <==币值格式的显示等

[root@linux ~]# LC_MESSAGES <==讯息显示的内容,如菜单、错误讯息等

[root@linux ~]# LC_ALL <==语言环境的整体设定

read

read [-pt] variable

参数:

-p :后面可以接提示字符!

-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!

范例:

范例一:让使用者由键盘输入一内容,将该内容变成 atest 变量

[root@linux ~]# read atest

This is a test

[root@linux ~]# echo $atest

This is a test

范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串做成 named 变量

[root@linux ~]# read -p "Please keyin your name: " -t 30 named

Please keyin your name: VBird Tsai

[root@linux ~]# echo $named

VBird Tsai

数组

范例:设定上面提到的 var[1] ~ var[3] 的变数。

[root@linux ~]# var[1]="small min"

[root@linux ~]# var[2]="big min"

[root@linux ~]# var[3]="nice min"

[root@linux ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"

其他 

* 万用字符,代表 0 个或多个字符(或数字)

? 万用字符,代表『一定有』一个字母

# 批注,这个最常被使用在 script 当中,视为说明!

\ 跳脱符号,将『特殊字符或万用字符』还原成一般字符

| 分隔两个管线命令的界定;

; 连续性命令的界定(注意!与管线命令并不相同)

~ 使用者的家目录

$ 亦即是变量之前需要加的变量取代值

& 将指令变成背景下工作

! 逻辑运算意义上的『非』 not 的意思!

/ 路径分隔的符号

>, >> 输出导向,分别是『取代』与『累加』

' 单引号,不具有变量置换的功能

" 具有变量置换的功能!

` ` 两个『 ` 』中间为可以先执行的指令!

( ) 在中间为子 shell 的起始与结束

[ ] 在中间为字符的组合

{ } 在中间为命令区块的组合!

 命令执行的判断依据: ; , &&, ||

sync; sync; shutdown -h now   ;表示上个命令执行完了执行下一个,用来分割命令。

ls /tmp && touch /tmp/testingagin    &&表示上一个命令执行成功了,再执行下一个

ls /tmp/vbirding || touch /tmp/vbirding   ||表示上一个命令执行成功了,就不执行下一个了。否则执行失败了才执行下一个

ls /tmp/vbirding || echo "not exist" && echo "exist"  第一个执行成功,就执行第三条,否则执行第二条。

与档案系统及程序的限制关系: ulimit

ulimit [-SHacdflmnpstuv] [配额]

参数:

-H :hard limit ,严格的设定,必定不能超过设定的值;

-S :soft limit ,警告的设定,可以超过这个设定值,但是会有警告讯息,

并且,还是无法超过 hard limit 的喔!也就是说,假设我的 soft limit

为 80 , hard limit 为 100 ,那么我的某个资源可以用到 90 ,

可以超过 80 ,还是无法超过 100 ,而且在 80~90 之间,会有警告讯息的意思。

-a :列出所有的限制额度;

-c :可建立的最大核心档案容量 (core files)

-d :程序数据可使用的最大容量

-f :此 shell 可以建立的最大档案容量 (一般可能设定为 2GB)单位为 Kbytes

-l :可用于定 (lock) 的内存量

-p :可用以管线处理 (pipe) 的数量

-t :可使用的最大 CPU 时间 (单位为秒)

-u :单一使用者可以使用的最大程序(process)数量。

命令取别名:alias

直接输入alias 可以查看当前取的别名。

alias lm='ls -l | more'    设置别名

unalias lm  取消别名

echo $HISTSIZE  查看记录历史最大笔数

[root@linux ~]# history [n]

[root@linux ~]# history [-c]

[root@linux ~]# history [-raw] histfiles

参数:

n :数字,意思是『要列出最近的 n 笔命令列表』的意思!

-c :将目前的 shell 中的所有 history 内容全部消除

-a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,则预设写入 ~/.bash_history

-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;

-w :将目前的 history 记忆内容写入 histfiles 中!

[root@linux ~]# !number

[root@linux ~]# !command

[root@linux ~]# !!

参数:

number :执行第几笔指令的意思;

command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行;

!! :就是执行上一个指令(相当于按↑按键后,按 Enter)

范例:

[root@linux ~]# history

66 man rm

67 alias

68 man history

69 history

[root@linux ~]# !66 <==执行第 66 笔指令

[root@linux ~]# !! <==执行上一个指令,本例中亦即 !66

[root@linux ~]# !al <==执行最近以 al 为开头的指令(上头列出的第 67 个)

登录讯息显示数据: /etc/issue, /etc/motd

cat /etc/issue

Fedora Core release 4 (Stentz)

Kernel \r on an \m

\d 本地端时间的日期;

\l 显示第几个终端机接口;

\m 显示硬件的等级 (i386/i486/i586/i686...);

\n 显示主机的网络名称;

\o 显示 domain name;

\r 操作系统的版本 (相当于 uname -r)

\t 显示本地端时间的时间;

\s 操作系统的名称;

\v 操作系统的版本。

vi /etc/motd   可以修改登录提示信息

Hello everyone,

Our server will be maintained at 2005/10/10 0:00 ~ 24:00.

stty

stty [-a]

参数:

-a :将目前所有的 stty 参数列出来;

如果出现 ^ 表示 [Ctrl] 那个按键的意思。举例来说, intr = ^C 表示利用 [ctrl] + c 来达成的。 几个重要的代表意义是:

• eof : End of file 的意思,代表『结束输入』。

• erase : 向后删除字符,

• intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;

• kill : 删除在目前指令列上的所有文字;

• quit : 送出一个 quit 的讯号给目前正在 run 的程序;

• start : 在某个程序停止后,重新启动他的 output

• stop : 停止目前屏幕的输出;

• susp : 送出一个 terminal stop 的讯号给正在 run 的程序。

stty erase ^h  设置erase快捷键为ctrl+h

快捷键

Ctrl + C 终止目前的命令

Ctrl + D 输入结束(EOF),例如邮件结束的时候;

Ctrl + M 就是 Enter 啦! Ctrl + S 暂停屏幕的输出

Ctrl + Q 恢复屏幕的输出

Ctrl + U 在提示字符下,将整列命令删除

Ctrl + Z 『暂停』目前的命令

输出重定向

• 1> :是将正确的数据输出到指定的地方去

• 2> :是将错误的数据输出到指定的地方去

如果只有 > 则预设是以 1> 来进行数据的!

find /home -name testing > list_right 2> list_error

find /home -name testing > list_right 2> /dev/null    /dev/null是垃圾回收,所有定向到这里的数据都会消失

find /home -name testing > list 2> list <==错误写法

find /home -name testing > list 2>&1 <==正确写法  错误输出和正确输出写在同一个文件里

管线命令 (pipe) |

上一条命令的结果作为上一条命令的参数

grep

grep [-acinv] '搜寻字符串' filename 参数:

-a :将 binary 档案以 text 档案的方式搜寻数据

-c :计算找到 '搜寻字符串' 的次数

-i :忽略大小写的不同,所以大小写视为相同

-n :顺便输出行号

-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

sort

sort [-fbMnrtuk] [file or stdin]

参数:

-f :忽略大小写的差异,例如 A 与 a 视为编码相同;

-b :忽略最前面的空格符部分;

-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;

-n :使用『纯数字』进行排序(预设是以文字型态来排序的);

-r :反向排序;

-u :就是 uniq ,相同的数据中,仅出现一行代表;

-t :分隔符,预设是 tab 键;

-k :以那个区间 (field) 来进行排序的意思,

wc

wc [-lwm]

参数:

-l :仅列出行;

-w :仅列出多少字(英文单字);

-m :多少字符;

学习shell scripts

在 shell script 的撰写同样需要用到这些注意事项的:

1. 如同前面 bash command 提到的,指令与参数间的多个空白会被忽略掉;

2. 而空白行也将被忽略掉!,并且 [tab] 也是不会被理会的!

3. 如果读取到一个 Enter 符号 ( CR )),就尝试开始执行该行命令;

4. 至于如果一行的内容太多,则可以使用 \[Enter] 来延伸至下一行;

5. 此外,使用最多的 # 可做为批注!任何加在 # 后面的字,将全部被视为批注文字而被忽略!

运行可以有底下几个方法:

• 将 shell.sh 加上可读与执行 (rx) 的权限,然后就能够以 ./shell.sh 来执行了;

• 直接以 sh shell.sh 的方式来直接执行即可。

[root@linux scripts]# vi sh01.sh

#!/bin/bash

# Program:

# This program is used to show "Hello World !" in screen.

# History:

# 2005/08/23 VBird First release

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

export PATH

echo -e "Hello World ! \a \n"

exit 0

test判断

1. 关于某个档名的『类型』侦测(存在与否),如 test -e filename

-e   该『档名』是否存在?(常用)

-f   该『档名』是否为档案(file)?(常用)

-d   该『文件名』是否为目录(directory)?(常用)

-b   该『文件名』是否为一个 block device 装置?

-c   该『文件名』是否为一个 character device 装置?

-S   该『档名』是否为一个 Socket 档案?

-p   该『档名』是否为一个 FIFO (pipe) 档案?

-L   该『档名』是否为一个连结档?

2. 关于档案的权限侦测,如 test -r filename

-r   侦测该文件名是否具有『可读』的属性?

-w   侦测该档名是否具有『可写』的属性?

-x   侦测该档名是否具有『可执行』的属性?

-u   侦测该文件名是否具有『SUID』的属性?

-g   侦测该文件名是否具有『SGID』的属性?

-k   侦测该文件名是否具有『Sticky bit』的属性?

-s   侦测该档名是否为『非空白档案』?

3. 两个档案之间的比较,如: test file1 -nt file2

-nt   (newer than)判断 file1 是否比 file2 新

-ot   (older than)判断 file1 是否比 file2 旧

-ef   判断 file2 与 file2 是否为同一档案,可用在判断 hard link 的判定上。 主要意义在判定,两个档案是否均指向同一个 inode 哩!

4.关于两个整数之间的判定,例如 test n1 -eq n2

-eq   两数值相等 (equal)

-ne   两数值不等 (not equal)

-gt   n1 大于 n2 (greater than)

-lt   n1 小于 n2 (less than)

-ge   n1 大于等于 n2 (greater than or equal)

-le   n1 小于等于 n2 (less than or equal)

5. 判定字符串的数据

test -z string   判定字符串是否为 0 ?若 string 为空字符串,则为 true

test -n string   判定字符串是否非为 0 ?若 string 为空字符串,则为 false。注: -n 亦可省略

test str1 = str2   判定 str1 是否等于 str2 ,若相等,则回传 true

test str1 != str2   判定 str1 是否不等于 str2 ,若相等,则回传 false

6. 多重条件判定,例如: test -r filename -a -x filename

-a   (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。

-o   (or)两状况任何一个成立!例如 test -r file -o -x file,则 file具有 r 或 x 权限时,就可回传 true。

!   反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

利用判断符号 [ ]

[ "$HOME" == "$MAIL" ]

[□"$HOME"□==□"$MAIL"□]

 ↑       ↑  ↑       ↑

注意:

• 在中括号 [] 内的每个组件都需要有空格键来分隔;

• 在中括号内的变量,最好都以双引号来设定;

• 在中括号内的常数,最好都以单或双引号来设定。

变量

/path/to/scriptname opt1 opt2 opt3 opt4 ...

$0                  $1   $2   $3   $4 ...

$0为shell名称。

$1为第一个变量,$2为第二个变量。。。

if [ 条件判断式 ]; then

当条件判断式成立时,可以进行的指令工作内容;

fi

• && 代表 AND ;

• || 代表 or ;

if [ 条件判断式 ]; then

当条件判断式成立时,可以进行的指令工作内容;

else

当条件判断式不成立时,可以进行的指令工作内容;

fi

if [ 条件判断式一 ]; then

当条件判断式一成立时,可以进行的指令工作内容;

elif [ 条件判断式二 ]; then

当条件判断式二成立时,可以进行的指令工作内容;

else

当条件判断式一与二均不成立时,可以进行的指令工作内容;

fi

利用 case ..... esac 判断

case $变量名称 in

    "第一个变量内容")

        程序段

        ;;

    "第二个变量内容")

        程序段

        ;;

    *)

        不包含第一个变量内容与第二个变量内容的其它程序执行段

        exit 1

        ;;

esac

例如:

case $1 in

    "hello")

        echo "Hello, how are you ?"

        ;;

    "")

        echo "You MUST input parameters, ex> $0 someword"

        ;;

    *)

        echo "Usage $0 {hello}"

        ;;

esac

利用 function 功能

function fname() {

程序段

}

要注意的是,在shell script 当中, function 的设定一定要在程序的最前面

执行:fname;

函数参数:fname 1 2 -----在function里面获取$1 $2 $3。。。

循环 (loop)

『当 condition 条件成立时,就进行循环,直到 condition 的条件不成立才停止』

while [ condition ]

do

程序段落

done

『当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段。』

until [ condition ]

do

程序段落

done

计算1+。。。+100

s=0

i=0

while [ "$i" != "100" ]

do

i=$(($i+1))

s=$(($s+$i))

done

echo "The result of '1+2+3+...+100' is ==> $s"

for...do....done

标签: zh1032d胀差变送器装置

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台