温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

RHEL6基础之六RHEL6基本命令&bash常用快捷键&变量&环境变量&命令的返回值

发布时间:2020-07-12 17:25:00 来源:网络 阅读:3998 作者:justin_peng 栏目:移动开发

命令帮助信息获取

sh 执行脚本

-x选项来查看这个脚本执行过程的

[root@localhost ~]# sh 1.sh
[root@localhost ~]# sh -x 1.sh 
[root@localhost ~]# ./1.sh

-n 只读取shell脚本,但不实际执行
-x 进入跟踪方式,显示所执行的每一条命令


echo

将输入的字符串送往标准输出。

用echo命令输出加引号的字符串时,将字符串原样输出;用echo命令输出不加引号的字符串时,将字符串中的各个单词作为字符串输出,各字符串之间用一个空格分割。

参   数:

-n 不要在最后自动换行

-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:   

    \a 发出警告声;   

    \b 删除前一个字符;   

    \c 最后不加上换行符号;   

    \f 换行但光标仍旧停留在原来的位置;   

    \n 换行且光标移至行首;

[root@Zabbix ~]# echo -e 'aaa\nbbb'
aaa
bbb
[root@Zabbix ~]#

 echo显示带颜色,需要使用参数-e


格式如下:

echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"

例如: 

echo -e "\033[41;37m TonyZhang \033[0m"

其中41的位置代表底色, 37的位置是代表字的颜色

 注:

1、字背景颜色和文字颜色之间是英文的“""”

2、文字颜色后面有个m

3、字符串前后可以没有空格,如果有的话,输出也是同样有空格

下面看几个例子:

echo -e "\033[30m 黑色字 \033[0m"

echo -e "\033[31m 红色字 \033[0m"

echo -e "\033[32m 绿色字 \033[0m"

echo -e "\033[33m ×××字 \033[0m"

echo -e "\033[34m 蓝色字 \033[0m"

echo -e "\033[35m 紫色字 \033[0m"

echo -e "\033[36m 天蓝字 \033[0m"

echo -e "\033[37m 白色字 \033[0m"

 

echo -e "\033[40;37m 黑底白字 \033[0m"

echo -e "\033[41;37m 红底白字 \033[0m"

echo -e "\033[42;37m 绿底白字 \033[0m"

echo -e "\033[43;37m 黄底白字 \033[0m"

echo -e "\033[44;37m 蓝底白字 \033[0m"

echo -e "\033[45;37m 紫底白字 \033[0m"

echo -e "\033[46;37m 天蓝底白字 \033[0m"

echo -e "\033[47;30m 白底黑字 \033[0m"

控制选项说明 :

\33[0m 关闭所有属性 

\33[1m 设置高亮度 

\33[4m 下划线 

\33[5m 闪烁 

\33[7m 反显 

\33[8m 消隐 

\33[30m -- \33[37m 设置前景色 

\33[40m -- \33[47m 设置背景色 

\33[nA 光标上移n行 

\33[nB 光标下移n行 

\33[nC 光标右移n行 

\33[nD 光标左移n行 

\33[y;xH设置光标位置 

\33[2J 清屏 

\33[K 清除从光标到行尾的内容 

\33[s 保存光标位置 

\33[u 恢复光标位置 

\33[?25l 隐藏光标 

\33[?25h 显示光标 


  \r 光标移至行首,但不换行;   

    \t 插入tab; 

[root@Zabbix ~]# echo aaa\tbbb
aaatbbb
[root@Zabbix ~]# echo 'aaa\tbbb'
aaa\tbbb
[root@Zabbix ~]# echo -e aaa\tbbb
aaatbbb
[root@Zabbix ~]# echo -e 'aaa\tbbb'
aaa	bbb
[root@Zabbix ~]#

    \v 与\f相同;   

    \\ 插入\字符;  

    \nnn 插入nnn(八进制)所代表的ASCII字符;


``反引号的作用就是将反引号内的Linux命令先执行,然后将执行结果赋予变量。

如果在命令行上把Linux命令放在反引号中,这个命令会首先被执行,其结果会成为命令行的一个参数。类似的还有$( ),这里是括号,不是花括号,${ }就是取变量了,比如:echo ${PATH},{}是为了避免后面的影响到了,比如参数${a}a这样连着使用。如果不用{},系统就会识别成$aa了

[root@localhost ~]# echo `df -Th` > cat.txt 
[root@localhost ~]# cat cat.txt 
Filesystem Type Size Used Avail Use% Mounted on /dev/sda3 ext4 18G 3.0G 14G 18% / tmpfs tmpfs 504M 76K 504M 1% /dev/shm /dev/sda1 ext4 194M 28M 157M 15% /boot /dev/sr0 iso9660 64M 64M 0 100% /media/VMware Tools
[root@localhost ~]#

单引号和反引号之间的区别。单引号把Linux命令视为字符集合。反引号会强迫执行Linux命令。


cd--change directory---切换工作目录

[root@localhost ~]# cd /home
[root@localhost home]# pwd
/home
[root@localhost home]# cd /usr/local/src/
[root@localhost src]# pwd
/usr/local/src
[root@localhost src]#

说明:

1.目录名称省略,变换至使用者的 home directory (也就是刚 login 时所在的目录)

2."~" 表示为 home directory 的意思

3."." 则是表示目前所在的目录

4.".." 则表示目前目录位置的上一层目录

5.“-” 返回进入当前目录前所在目录

[root@localhost src]# cd
[root@localhost ~]# pwd
/root
[root@localhost ~]# cd -
/usr/local/src
[root@localhost src]# pwd
/usr/local/src
[root@localhost src]# cd ..
[root@localhost local]# pwd
/usr/local
[root@localhost local]# cd .
[root@localhost local]# pwd
/usr/local
[root@localhost local]# cd ~
[root@localhost ~]# pwd
/root
[root@localhost ~]#

6."!$" 把上个命令最后的参数作为输入

[root@localhost src]# mkdir /usr/local/nagios
[root@localhost src]# tar zxvf nagios-3.5.0.tar.gz -C /usr/local/nagios
[root@localhost src]# cd !$
cd /usr/local/nagios
[root@localhost nagios]#

ifconfig----查看本机IP地址

[root@Git-Client ~]# ifconfig
[root@Project ~]# ip addr
[root@Project ~]# ip addr show ens160

curl ifconfig.me查看本机公网IP

[root@Git-Client ~]# curl ifconfig.me


cp---复制文件或者目录

[root@localhost ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0bak
[root@localhost test]# ls
test.txt
[root@localhost test]# cp test.txt{,bak}
[root@localhost test]# ls
test.txt  test.txtbak
[root@localhost test]# cp /etc/sysconfig/iptables{,`date +%Y%m%d`bak}

-a 尽可能将档案状态、权限等资料都照原状予以复制,其作用等于dpR选项的组合

-r 若 source 中含有目录名,则将目录下档案也依序拷贝至目的地,复制目录时必须使用此选项

[root@localhost local]# cp nagios/ /usr/local/src/
cp: 略过目录"nagios/"
[root@localhost local]# cd nagios/
[root@localhost nagios]# ls
nagios
[root@localhost nagios]# cp -r nagios/ /usr/local/src/
[root@localhost nagios]# cp -a  nagios/ /usr/local/src/nagios1

-f 若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制。

-u :若 destination 比 source 旧才更新 destination !或目的地文件 不存在时才进行复制

-i :若目的檔(destination)已经存在时,在覆盖时会先询问是继续

     有时候使用-f参数也会提示是否覆盖,linux系统中有时候给cp建了一个alias:

[root@localhost ~]# alias|grep cp
alias cp='cp -i'
[root@localhost ~]#

当你执行cp时,其实执行的是cp -i,如果不想每次询问可以直接注释掉。重新打开回话窗口不再提示

[root@localhost ~]# cat ~/.bashrc |grep cp
#alias cp='cp -i'
[root@localhost ~]#

如果临时取消掉,可以通过以下

[root@localhost static]# unalias cp
[root@localhost static]# cp /usr/local/src/static/* . -a
[root@localhost static]#

-d:贝软连接时需要加上该参数,否则把软连接的目标文件拷贝过去,而加上后,其实只是拷贝了一个连接文件。

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

拷贝目录:

[root@localhost dir]# mkdir dir dir1
[root@localhost dir]# touch dir/file{1..9}
[root@localhost dir]# cp -r dir dir1/
[root@localhost dir1]# ls
dir
[root@localhost dir1]#

Tips:可以多个目录一起拷贝 最后一个为目标目录

[root@justin ~]# cp /etc/rc.sysinit /etc/inittab /mnt/lv1/
[root@justin ~]# ls !$
ls /mnt/lv1/
inittab  lost+found  rc.sysinit
[root@justin ~]#

如果要排除/home/data目录下面的a、b、c、三个目录,同时拷贝其它所有目录,执行以下命令

yum install rsync   #安装rsync
rsync -av --exclude data/a  --exclude data/b  --exclude data/c  data   /bak

注意--exclude后面的路径不能为绝对路径,必须为相对路径才可以,否则出错。且备份的目录data不能写成data/

-v, --verbose 详细模式输出 

-c, --checksum 打开校验开关,强制对文件传输进行校验 

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD 

-z, --compress 对备份的文件在传输时进行压缩处理

-r, --recursive 对子目录以递归模式处理 

-R, --relative 使用相对路径信息 

-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。 

--exclude=PATTERN 指定排除不需要传输的文件模式 

--exclude=PATTERN 指定排除不需要传输的文件模式 

--include=PATTERN 指定不排除而需要传输的文件模式 

--exclude-from=FILE 排除FILE中指定模式的文件 

--include-from=FILE 不排除FILE指定模式匹配的文件 


scp

[root@localhost app]# scp -r ProxyServer root@192.168.1.104:/app

-p 可以保持文件属性不变

[root@localhost ~]# scp -rp * root@10.15.44.239:/var/log/remote/


获得完整的文件路径

[root@localhost soft]# readlink -f docker-check-config.sh 
/app/soft/docker-check-config.sh
[root@localhost soft]#




登陆自动指定目录

在用户的.bash_profile里添加cd 目录

[root@localhost ~]# pwd
/root
[root@localhost ~]# vim /root/.bash_profile 

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
cd /sh
# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH


mv---移动或重命名文件

[root@Zabbix_server fonts]# ls
DejaVuSans.ttf  STXINGKA.TTF
[root@Zabbix_server fonts]# mv DejaVuSans.ttf{,bak}
[root@Zabbix_server fonts]# ls
DejaVuSans.ttfbak  STXINGKA.TTF
[root@Zabbix_server fonts]#

-b                如果已存在相同文件名,则覆盖前进行备份

-f                 如果已存在相同文件名,而用户不具有写的权限,则强制覆盖

-i                 如果已存在相同文件名,覆盖前提示用户进行确认

-u                比较原文件与目标文件修改时间,如果目标文件较新则不覆盖

-v                列出所有被移动或重命名的文件

-i 若目的地已有同名档案,则先询问是否覆盖旧档

[root@localhost ~]# cd /home/
[root@localhost home]# touch justinmv
[root@localhost home]# ls
justin  justinmv  lost+found  t
[root@localhost home]# mv justinmv justin1
[root@localhost home]# ls
justin  justin1  lost+found  t
[root@justin home]# ls
justin  lost+found  mv
[root@justin home]# mv mv{,bak}
[root@justin home]# ls
justin  lost+found  mvbak
[root@localhost home]# mv justin1 /usr/local/src/
[root@localhost home]# ls
justin  lost+found  t
[root@localhost home]# cd /usr/local/src/ && ls
justin1  nagios  nagios1  nagios2  nagios-3.5.0.tar.gz
[root@localhost home]# touch justin1
[root@localhost home]# mv -i justin1 /usr/local/src/
mv:是否覆盖"/usr/local/src/justin1"? y
[root@justin touch]# ls
file1  file2  file3  file4  file5
[root@justin touch]# mv file1 file2 ../mv/
[root@justin touch]# mv file{3..4} ../mv/
[root@justin touch]# ls ../mv/
file1  file2  file3  file4
[root@justin touch]#

last---显示当前和过去用户登陆的所有相关信息

last命令可以显示指定账户或终端登录用户的相关信息。不带参数的last命令显示/var/log/wtmp文件中记录的登录用户的清单。

[root@Zabbix_server home]# last
justin   pts/1        10.15.71.162     Thu Aug 28 13:44   still logged in   
justin   pts/1        10.15.71.162     Thu Aug 28 13:31 - 13:44  (00:12)    
root     pts/0        10.15.71.162     Tue Aug 26 09:58   still logged in

当登陆系统用户很多的时候,可以在W后面加上某个用户名,则会查看该用户执行任务的情况:[root@localhost ~]# last justin

pts 表示远程连接的,tty表示console登陆的

-n<显示行数>或-<显示行数>  设置列出名单的显示行数。

-f file  指定记录文件,默认情况下last命令读取/var/log/wtmp文件。

-t YYYYMMDDHHMMSS  显示指定时间为止的所有登录信息,日期格式为年月日时分秒

[root@Zabbix_server home]# last -t 20140828134000
justin   pts/1        10.15.71.162     Thu Aug 28 13:31    gone - no logout 
root     pts/0        10.15.71.162     Tue Aug 26 09:58   still logged in

-R 不显示登录系统的主机名或IP地址。


-a  在最后一列显示登录系统主机的主机名或IP地址。

-o  读取老格式的wtmp文件。

-x  显示登录登出的记录

[root@Zabbix_server home]# last -5xa
justin   pts/1        Thu Aug 28 13:44   still logged in    10.15.71.162
justin   pts/1        Thu Aug 28 13:31 - 13:44  (00:12)     10.15.71.162
root     pts/0        Tue Aug 26 09:58   still logged in    10.15.71.162
root     pts/0        Tue Aug 26 09:57 - 09:58  (00:00)     :0.0
root     tty1         Tue Aug 26 09:57   still logged in    :0

wtmp begins Wed Jul 16 01:45:27 2014
[root@Zabbix_server home]#

注:显示特定的终端,可以用数字表示,如:last 0  ===> last tty0

[root@Zabbix_server home]# last 1 -3
root     tty1         :0               Tue Aug 26 09:57   still logged in   
root     tty1         :0               Mon Aug 25 22:55 - down   (00:01)    
root     tty1         :0               Thu Aug 21 10:42 - down   (03:45)    

wtmp begins Wed Jul 16 01:45:27 2014
[root@Zabbix_server home]#

lastb---显示登陆失败的信息

选项和last一样

[root@Zabbix_server home]# lastb -3a
justin   ssh:notty    Thu Aug 28 13:44 - 13:44  (00:00)     10.15.71.162
justin   ssh:notty    Thu Aug 28 13:44 - 13:44  (00:00)     10.15.71.162
justin   ssh:notty    Thu Aug 28 13:44 - 13:44  (00:00)     10.15.71.162

btmp begins Tue Aug  5 13:51:27 2014
[root@Zabbix_server home]# lastb | awk '{ print $3}' | awk '{++S[$NF]} END {for(a in S) print a, S[a]}' | sort -rk2 |head    查看尝试恶意登陆的前十个IP
[root@Zabbix_server home]# lastb | awk '{ print $3}' | sort | uniq -c | sort -n                查看恶意IP尝试登陆次数

/var/log/wtmp 用于记录登录成功的用户的信息,是一个二进制文件,只能通过 last 命令来查看

/var/log/btmp 用于记录登录失败的用户的信息,是一个二进制文件,只能通过 lastb 命令来查看

/var/log/lastlog 用于记录用户的历史登录情况,是一个二进制文件,只能通过 lastlog 命令来查看

/var/run/utmp 用于记录当前登录的用户的信息,是一个二进制文件,只能通过 who 命令来查看


lastlog---显示用户最后登陆的相关信息

如果此用户从来没有登录,则显示:**Never logged in**
[root@Zabbix_server home]# lastlog 
zabbix                                     **Never logged in**
justin           pts/1    10.15.71.162     Thu Aug 28 13:44:24 +0800 2014

-u 查询指定uid的用户登陆信息

[root@Zabbix_server home]# lastlog -u 500
Username         Port     From             Latest
zabbix                                     **Never logged in**
[root@Zabbix_server home]#

whoami---显示登陆名

[root@localhost ~]# whoami
root
[root@localhost ~]#

users---只能列出当前登录的用户名

[root@justin ~]# users
root
[root@justin ~]#

who---可以列出用户名、终端、登录时间、来源地点等信息

[root@justin ~]# who
root     pts/0        2013-10-22 17:34 (10.15.72.73)
[root@justin ~]#

who -b 查看最后一次系统启动的时间。

[root@localhost ~]# who -b
         system boot  2016-03-17 10:11
[root@localhost ~]#

who -r 查看当前系统运行时间

[root@localhost ~]# who -r
         run-level 3  2016-05-24 08:41                   last=S
[root@localhost ~]#


last  reboot  可以看到Linux系统历史启动的时间

[root@localhost ~]# last reboot
reboot   system boot  2.6.32-431.el6.x Thu Mar 17 10:11 - 10:22  (00:11)    
reboot   system boot  2.6.32-431.el6.x Wed Mar 16 12:48 - 10:22  (21:34)    
reboot   system boot  2.6.32-431.el6.x Tue Mar 15 17:31 - 20:39  (03:07)    
reboot   system boot  2.6.32-431.el6.x Thu Mar  3 13:50 - 15:19 (9+01:29)   
reboot   system boot  2.6.32-431.el6.x Mon Feb  1 14:30 - 14:55  (00:24)    
reboot   system boot  2.6.32-431.el6.x Fri Jan 29 10:24 - 14:55 (3+04:30)   
reboot   system boot  2.6.32-431.el6.x Mon Dec 28 06:48 - 14:37 (2+07:49)   
reboot   system boot  2.6.32-431.el6.x Sat Oct 10 23:08 - 15:56  (-7:-12)   

wtmp begins Sat Oct 10 23:08:49 2015
[root@localhost ~]# last reboot|head -1
reboot   system boot  2.6.32-431.el6.x Thu Mar 17 10:11 - 10:25  (00:14)    
[root@localhost ~]#

uptime---列出用户名、终端、来源地点、登录时间、执行的命令等参数

[root@localhost ~]# uptime 
 09:23:34 up 56 min,  2 users,  load average: 0.00, 0.00, 0.00
[root@localhost ~]#


w---列出用户名、终端、来源地点、登录时间、执行的命令等参数

[root@justin ~]# w
 19:51:03 up  2:19,  1 user,  load average: 0.08, 0.02, 0.01
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.15.72.73      17:34    0.00s  0.22s  0.01s w
[root@justin ~]#

USER:显示登陆用户帐号名。用户重复登陆,该帐号也会重复出现。

TTY:用户登陆所用的终端。

FROM:显示用户在何处登陆系统。

LOGIN@:是LOGIN AT的意思,表示登陆进入系统的时间。

IDLE:用户空闲时间,从用户上一次任务结束后,开始记时。

JCPU:一终端代号来区分,表示在某段时间内,所有与该终端相关的进程任务所耗费的CPU时间。

PCPU:指WHAT域的任务执行后耗费的CPU时间。

WHAT:表示当前执行的任务

当登陆系统用户很多的时候,可以在W后面加上某个用户名,则会查看该用户执行任务的情况:[root@localhost ~]# w justin


想踢除justin这个用户和他的所有开启的程序

pkill -u justin

安全的做法是先查看终端号,然后查看该终端执行的所有进程,根据进程号来停止服务

安全剔除用户

ps -ef| grep pts/0

得到用户登录相应的进程号pid后执行.

kill -9 pid


!!---执行最近一次的命令

[root@localhost ~]# !!
whoami
root
[root@localhost ~]#



du---统计目录(或文件)所占磁盘空间的大小

-c或--total 除了显示目录或文件的大小外,同时也显示所有目录或文件的总和。

-a:全部文件与目录大小都列出来。如果不加任何选项和参数只列出目录(包含子目录)大小。

-c:最后加总

-b:列出的值以bytes为单位输出,默认是以Kbytes

-k:以KB为单位输出

-m:以MB为单位输出

-h或--human-readable 以K,M,G为单位,提高信息的可读性。系统自动调节单位,例如文件太小可能就几K,那么就以K为单位显示,如果大到几G,则就以G为单位显示

-k或--kilobytes 以1024 bytes为单位。

-m或--megabytes 以1MB为单位

-s或--summarize 仅显示总计,即当前目录的大小。

[root@justin ~]# du -c /mnt/lv1
16  /mnt/lv1/lost+found
44  /mnt/lv1
44  total
[root@justin ~]# du -sh /mnt/lv1
44K /mnt/lv1
[root@justin ~]# du -shm /mnt/lv1
1   /mnt/lv1
[root@justin ~]# du -shk /mnt/lv1
44  /mnt/lv1
[root@justin ~]#

df---检查linux服务器的文件系统的磁盘空间占用情况

-h 方便阅读方式显示

-i 显示inode信息

-T 文件系统类型

[root@justin ~]# df -Th
Filesystem    Type    Size  Used Avail Use% Mounted on
/dev/sda2     ext4    9.9G  2.4G  7.0G  26% /
tmpfs        tmpfs    504M     0  504M   0% /dev/shm
/dev/sda1     ext4    194M   26M  158M  15% /boot
/dev/sda5     ext4    7.7G  146M  7.2G   2% /home
/dev/mapper/sdcvg-sdclv
              ext4    4.0G  137M  3.7G   4% /mnt/lv1
/dev/mapper/sdcvg-sdclv1
              ext4    4.0G   72M  3.7G   2% /mnt/lv2
[root@justin ~]#

id---显示用户的ID,以及所属群组的ID

[root@localhost ~]# id justin
uid=500(justin) gid=500(justin) 组=500(justin)

说明:id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。执行id时不添加参数是查看当前用户的身份标识信息;gid”:表示的是用户的基本组;“组”:表示的是用户所属的所有组,其中“组”中的第1个组账号为该用户的基本组,其他组账号为该用户的附属组

file---查看文件类型

[root@justin 2.6.32-279.el6.i686]# file extra/
extra/: directory
[root@justin 2.6.32-279.el6.i686]# file modules.dep
modules.dep: ASCII text, with very long lines
[root@justin 2.6.32-279.el6.i686]#

Linux中文件类型不是按后缀名来定义,而是根据文件内容来判断,即使后缀类似windows的.exe也可能只是文本文件

ln---为文件或目录建立链接

-s---进行软链结(symbolic link)

#为网卡建立软连接wk
[root@localhost ~]# ln -s /etc/sysconfig/network-scripts/ifcfg-eth0 /root/wk
[root@localhost ~]# ls -lh /root/wk
lrwxrwxrwx. 1 root root 41 9月  23 15:55 /root/wk -> /etc/sysconfig/network-scripts/ifcfg-eth0

说明:软连接相当于window快捷方式,可以在wk里修改文件,删除链接时,直接用rm命令:rm -f /root/wk

Linux/Unix 档案系统中,有所谓的连结(link),我们可以将其视为档案的别名,链接文件分为硬链接、软链接两种类型,主要区别是:不能对目录创建硬链接,也不能跨越不同分区创建硬链接文件,而软链接则没有这些限制,所以平时使用的大都是软链接。硬连结的意思是一个档案可以有多个名称,而软连结的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中,而软连结却可以跨越不同的档案系统。不论是硬连结或软链结都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

alias---设置命令别名

说明:命令别名通常是命令的缩写,对于经常使用的命令,通过设置别名可以简化操作,提高工作效率。

单独执行alias命令可以列出当前系统中已经存在的别名命令。在执行这个命令时需要注意,“=”的两边不能有空格,在标准命令的两端要使用单引号。

[root@localhost ~]# alias wk='/etc/sysconfig/network-scripts/ifcfg-eth0'
[root@localhost ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
alias wk='/etc/sysconfig/network-scripts/ifcfg-eth0'
[root@localhost ~]# unalias wk
[root@localhost ~]# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@localhost ~]#

设置别名也可以在文件/boot/.bashrc中设置

[root@localhost ~]# vim /root/.bashrc

RHEL6基础之六RHEL6基本命令&bash常用快捷键&变量&环境变量&命令的返回值

用source命令在当前bash环境下读取并执行bashrc中的命令,这样我们自定义的命令就生效了

[root@localhost ~]# source .bashrc


date 

打印当前系统的时间

[root@localhost ~]# date 
Thu Nov 13 07:36:28 CST 2014
[root@localhost ~]# date "+%y%m%d"
141113
[root@localhost ~]# date "+%Y%m%d"
20141113
[root@localhost ~]# date "+%Y%m%d %H:%M:%S"
20141113 07:37:04
[root@localhost ~]# date -d "+1 day" "+%Y%m%d %H:%M:%S"
20141114 07:37:31
[root@localhost ~]# date -d "-1 month" "+%Y%m%d %H:%M:%S"
20141013 07:37:45
[root@localhost ~]# date -d "-1 year" "+%Y%m%d %H:%M:%S %w"
20131113 07:38:22 3
[root@localhost ~]# date "+%Y年%m月%d日 %H:%M:%S 星期%w"
2014年11月20日 13:39:17 星期4
[root@localhost ~]# date -d "-5 month" "+%Y年%m月%d日 %H:%M:%S 星期%w"
2014年06月20日 13:41:12 星期5
[root@Monitor ~]# date -d "yesterday" +"%Y%m%d"
20150917
[root@Monitor ~]# rm -rf `date -d "today" +"%Y%m%d"`
[root@Monitor ~]# mkdir `date -d "today" +"%Y%m%d"`
[root@localhost home]# touch `date +%Y%m%d`
[root@localhost home]# touch file`date +%Y%m%d`

%Y表示年(注意%y和%Y的区别),%m表示月,%d表示日期,%H表示小时,%M表示分钟,%S表示秒,%w表示星期几,-d 选项可以打印n天前或者n天后的日期,当然也可以打印n个月/年前或者后的日期。

给定的格式FORMAT 控制着输出

  %a    当前locale 的星期名缩写(例如: 日,代表星期日)

  %A    当前locale 的星期名全称 (如:星期日)

  %b    当前locale 的月名缩写 (如:一,代表一月)

  %B    当前locale 的月名全称 (如:一月)

  %c    当前locale 的日期和时间 (如:2005年3月3日 星期四 23:05:25)

  %C    世纪;比如 %Y,通常为省略当前年份的后两位数字(例如:20)

  %d    按月计的日期(例如:01),不补0使用%-d

  %D    按月计的日期;等于%m/%d/%y

  %e    按月计的日期,添加空格,等于%_d

  %F    完整日期格式,等价于 %Y-%m-%d

  %h    等于%b

  %H    小时(00-23)

  %I    小时(00-12)

  %c    按年计的日期(001-366)

  %k    时(0-23)

  %l    时(1-12)

  %m    月份(01-12)

  %M    分(00-59)

  %n    换行

  %p    当前locale 下的"上午"或者"下午",未知时输出为空

  %P    与%p 类似,但是输出小写字母

  %r    当前locale 下的 12 小时时钟时间 (如:11:11:04 下午)

  %R    24 小时时间的时和分,等价于 %H:%M

  %s    自UTC 时间 1970-01-01 00:00:00 以来所经过的秒数,时间戳

  %S    秒(00-60)

  %t    输出制表符 Tab

  %T    时间,等于%H:%M:%S

  %u    星期,1 代表星期一

  %U    一年中的第几周,以周日为每星期第一天(00-53)

  %V    ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)

  %w    一星期中的第几日(0-6),0 代表周一

  %W    一年中的第几周,以周一为每星期第一天(00-53)

  %x    当前locale 下的日期描述 (如:12/31/99)

  %X    当前locale 下的时间描述 (如:23:13:48)

  %y    年份最后两位数位 (00-99)

  %Y    年份


几个日常比较常用的时间格式:
1. date +%A            #显示星期几(英语,如Sunday)
2. date +%B            #显示月份(英语,如March)
3. date +%d            #显示目前是本月份第几天
4. date +%F            #显示目前的年月日(格式如:2011-01-01)相当于:date +%Y-%m-%d
5. date +%Y            #显示目前年
6. date +%m            #显示当前是本年第几个月
7. date +%H            #示小时
8. date +%M            #显示分钟
9.date  +%S            #显示秒数
10. date +%j        #本年第几天(0-366)
11. date +%n        #换行
12. date +%t        #跳格
13. date +%T        #显示24小时制时间,相当于date +%H:%M:%S,所以要显示标准日期和时间可以如此写: date +%F%t%T
14. date +%Y-%m-%d --date="+1 day"   以" +%Y-%m-%d"格式显示“本日+1天”以后的日期,可以推算年和月,如下:--date="-1 day"    --date="-a year"   --date="-1 month"
15. date +%Y-%m-%d --reference="/home/uncle_cat/shahuhu"   以"+%Y-%m-%d "的日期格式列出"/home/uncle_cat/shahuhu" 这个文件的最后修改日期。
16. date --set="2011-01-01 16:51:54" 设定目前的日期为"2011-01-01 16:51:54"  ----请注意,此权限只有root用户才有,一般用户没有的

设定时间
date -s //设置当前时间,只有root权限才能设置,其他只能查看。
date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00
date -s 01:01:01 //设置具体时间,不会对日期做更改
date -s “01:01:01 2008-05-23″ //这样可以设置全部时间
date -s “01:01:01 20080523″ //这样可以设置全部时间
date -s “2008-05-23 01:01:01″ //这样可以设置全部时间
date -s “20080523 01:01:01″ //这样可以设置全部时间

加减
date +%Y%m%d         //显示前天年月日
date +%Y%m%d --date="+1 day"  //显示前一天的日期
date +%Y%m%d --date="-1 day"  //显示后一天的日期
date +%Y%m%d --date="-1 month"  //显示上一月的日期
date +%Y%m%d --date="+1 month"  //显示下一月的日期
date +%Y%m%d --date="-1 year"  //显示前一年的日期
date +%Y%m%d --date="+1 year"  //显示下一年的日期


常用的日期获取

date -d 'next monday'         #下周一的日期
date -d  next-day +%Y%m%d    #明天日期
date -d tomorrow +%Y%m%d     #明天日期
date -d last-day +%Y%m%d    #昨天日期
date -d yesterday +%Y%m%d     #昨天日期
date -d last-month +%Y%m    #上个月日期
date -d next-month +%Y%m    #下个月日期
date -d next-year +%Y       #明年日期
date -d '2 weeks'            #2周后
date -d '-2 weeks'            #2周前
date -d "-1 weeks Nov 17, 2018"        #相对2018-11-17这个时间前一周的日期


时间戳转换

[root@Super ~]# date -d "2018-11-10" +%s
1541779200
[root@Super ~]#


参数

-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; 

-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; 

-u:显示GMT; 

--help:在线帮助; 

--version:显示版本信息。

[root@localhost rename]# date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S"
2009-02-13 23:02:30
[root@localhost rename]# date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
2009/12/12 00:00.00
[root@localhost rename]# date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
2009-12-05 00:00.37
[root@localhost rename]# date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
2007-12-05 00:00.37
[root@localhost rename]#


设置系统所在的时区

[root@localhost mpc-0.8.1]# date -R   #查看时区
Sat, 22 Jul 2017 09:39:08 +0800
[root@localhost mpc-0.8.1]# more /etc/sysconfig/clock |grep -v "#" #查看clock系统配置文件
ZONE="Asia/Shanghai"
UTC=true
ARC=false
[root@localhost mpc-0.8.1]# tzselect 
#复制相应的时区文件,替换系统时区文件;或者创建链接文件
[root@localhost mpc-0.8.1]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

tzselect命令只告诉你选择的时区的写法,并不会生效。所以现在它还不是东8区北京时间。你可以在.profile、.bash_profile或者/etc/profile中设置正确的TZ环境变量并导出。 例如在.bash_profile里面设置 TZ='Asia/Shanghai'; export TZ并使其生效。

[root@localhost ~]# vim /etc/profile
TZ='Asia/Shanghai'
export TZ
[root@localhost ~]# source /etc/profile


临时修改系统时间

[root@localhost remote]# date
Mon Jan  2 12:34:11 CST 2017
[root@localhost remote]# date -s 20161020
Thu Oct 20 00:00:00 CST 2016
[root@localhost remote]# date -s 10:23:14
Mon Jan  2 10:23:14 CST 2017
[root@localhost remote]# date -s "20161020 10:23:14"
Thu Oct 20 10:23:14 CST 2016
[root@localhost remote]# date -s "10/21/2016 10:23:14"
Fri Oct 21 10:23:14 CST 2016
[root@localhost remote]#

在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。

硬件时间的设置,可以用hwclock或者clock命令。其中,clock和hwclock用法相近,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。//查看硬件时间可以是用hwclock,hwclock --show 或者hwclock -r

[root@localhost remote]# hwclock --show
Mon 02 Jan 2017 12:47:28 PM CST  -0.232754 seconds
[root@localhost remote]#

系统时间和硬件时间的同步

以系统时间为基准,修改硬件时间   

[root@localhost remote]# clock -w

以硬件时间为基准,修改系统时间

[root@localhost remote]# hwclock -s

hwclock参数可以通过--help获取

[root@localhost remote]# hwclock --help
  -r | --show         read hardware clock and print result
       --set          set the rtc to the time given with --date
  -s | --hctosys      set the system time from the hardware clock
  -w | --systohc      set the hardware clock to the current system time
       --systz        set the system time based on the current timezone
       --adjust       adjust the rtc to account for systematic drift since
                      the clock was last set or adjusted

CST:中国标准时间(China Standard Time),这个解释可能是针对RedHat Linux。

UTC:协调世界时,又称世界标准时间,简称UTC,从英文国际时间/法文协调时间“Universal Time/Temps Cordonné”而来。

[root@localhost ~]# cal
      July 2017     
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
[root@localhost ~]#


su、sudo命令

su命令是一个切换用户的工具,将普通用户切换到超级用户下,也可以从超级用户切换到普通用户;

sudo被称为受限制的su,也被称为授权认证的su。他是允许系统管理员分配给普通用户一些合理的“权利”,并且不需要普通用户知道超级用户密码,就能让他们执行一些只有超级用户或其他特许用户才能完成的任务,sudo执行命令的流程是:将当前用户切换到超级用户下,或切换到指定的用户下,然后以超级用户或其指定切换到的用户身份执行命令,执行完成后,直接退回到当前用户,而这一切的完成要通过sudo的配置文件/etc/sudoers来进行授权。sudo都提供了一个编辑该文件的命令:visudo来对该文件进行修改。强烈推荐使用该命令修改sudoers因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。 

例如:普通用户justin对/etc/shadow没有访问权限

[justin@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[justin@localhost ~]$ who am i
justin   pts/1        2014-11-18 04:41 (10.15.24.142)
[justin@localhost ~]$

执行visudo之后,可以看见缺省只有一条root的配置,我们在起下面加一条jutsin对/etc/shadow有访问的权限:

[root@localhost root]# visudo 
 97 ## Allow root to run any commands anywhere
 98 root    ALL=(ALL)       ALL
 99 justin  ALL= /bin/cat /etc/shadow 
 [root@localhost root]# su - justin
[justin@localhost ~]$ sudo cat /etc/shadow
[sudo] password for justin:

执行这个命令后,需要输入justin用户的密码,然后就可访问文件内容了。在这里sudo使用时间戳文件来完成类似“检票”的系统,当用户输入密码后就获得了一张默认存活期为5分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码才能查看文件内容。

如果每次都需要输入密码,那么某些自动调用超级权限的程序就会出现问题,此时可以通过下面的设置,让普通用户无需输入密码即可执行具有超级权限的程序。

justin  ALL= NOPASSWD: /bin/cat /etc/shadow

如果要让一个普通用户justin具有超级用户的所有权限,而又不想输入超级用户的密码:

#justin  ALL= NOPASSWD: /bin/cat /etc/shadow
justin  ALL=(ALL) NOPASSWD: ALL


history---查看历史记录

在Linux下可通过history命令查看用户所有的历史操作记录,同时shell命令操作记录默认保存在用户目录下的.bash_history文件中,通过这个文件可以查询shell命令的执行历史,

#列出最近执行过的3条历史命令
[root@localhost ~]# history 3
15 wc /etc/resolv.conf
16 wc -l /etc/passwd
17 history 3

在每一个执行过的shell命令行前均有一个编号,代表其在历史列表中的序号。如果想重新执行其中某一条命令,可以采用“!序号”的格式。如“!16”就表示把第16条历史命令重新执行一遍。!! (连续两个”!”),表示执行上一条指令;!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令

[root@localhost ~]# !16
wc -l /etc/passwd
35 /etc/passwd

默认的history命令只能查看用户历史操作记录,并不能区分每个用户操作命令的时间,通过在/etc/bashrc文末加入以下四行内容让history命令自动记录所有shell命令的执行时间:

[root@localhost ~]# history|tail -5
   89  history |tail 
   90  history |tail -5
   91  exit
   92  date
   93  history|tail -5
[root@localhost ~]# vim /etc/bashrc 
 89 #HISTSIZE定义了history命令输出的记录总数
 90 export HISTSIZE=4000
 91 #HISTTIMEFORMAT定义时间显示格式,这里的格式与date命令后的“+"%F %T"”是一致的的,HISTTIMEFORMA    作为history的时间变量将值传递给history命令
 92 export HISTTIMEFORMAT='%F %T `whoami`'
:set nu  
[root@localhost ~]# source /etc/bashrc 
[root@localhost ~]# history|tail -5
   94  2014-11-18 04:16:11vim /etc/bashrc 
   95  2014-11-18 04:21:48history|tail -5
   96  2014-11-18 04:22:03source /etc/bash
   97  2014-11-18 04:22:06source /etc/bashrc 
   98  2014-11-18 04:22:10history|tail -5
[root@localhost ~]# date
2014年 11月 18日 星期二 04:22:17 CST
[root@localhost ~]#

为了确保服务器的安全,可以实现详细记录登录过系统的用户、IP地址、shell命令以及详细操作时间等,并将这些信息以文件的形式保存在一个安全的地方

将下面这段代码添加到/etc/profile文件末尾中,即可实现上述功能

[root@localhost ~]# vim /etc/profile
79 #history
 80 USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
 81 HISTDIR=/usr/share/.history
 82 if [ -z $USER_IP ]
 83 then
 84 USER_IP=`hostname`
 85 fi
 86 if [ ! -d $HISTDIR ]
 87 then
 88 mkdir -p $HISTDIR
 89 chmod 777 $HISTDIR
 90 fi
 91 if [ ! -d $HISTDIR/${LOGNAME} ]
 92 then
 93 mkdir -p $HISTDIR/${LOGNAME}
 94 chmod 300 $HISTDIR/${LOGNAME}
 95 fi
 96 export HISTSIZE=4000
 97 DT=`date +%Y%m%d_%H%M%S`
 98 export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"
 99 export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
100 chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
:wq 
[root@localhost ~]# source /etc/profile
[root@host16 ~]# tail -3 /etc/bashrc 
# vim:ts=4:sw=4
export HISTSIZE=4000
export HISTTIMEFORMAT="%F %T `whoami` `who -u am i|awk '{print $NF}'|sed 's/[()]//g'` "
[root@host16 ~]#

这段代码将每个用户的shell命令执行历史以文件的形式保存在/usr/share/.history目录中,每个用户一个文件夹,并且文件夹下的每个文件以IP地址加shell命令操作时间的格式命名。下面是user01用户执行shell命令的历史记录文件,保存历史命令的文件夹目录要尽量隐蔽,避免被***发现后删除。基本效果如下:

[root@localhost ~]# cd /usr/share/.history/
[root@localhost .history]# ll
总用量 8
d-wx------ 2 justin justin 4096 11月 18 04:36 justin
d-wx------ 2 root   root   4096 11月 18 04:36 root
[root@localhost .history]# cd justin/
[root@localhost justin]# ls -la
总用量 12
d-wx------ 2 justin justin 4096 11月 18 04:36 .
drwxrwxrwx 4 root   root   4096 11月 18 04:33 ..
-rw------- 1 justin justin   79 11月 18 04:36 10.15.24.142.history.20141118_043321
[root@localhost justin]# cat 10.15.24.142.history.20141118_043321 
#1416256413
echo $LANG
#1416256445
cat /proc/cpuinfo |grep ml|grep flags|wc -l
[root@localhost justin]# cd ../root/
[root@localhost root]# ls -al
总用量 12
d-wx------ 2 root root 4096 11月 18 04:36 .
drwxrwxrwx 4 root root 4096 11月 18 04:33 ..
-rw------- 1 root root  577 11月 18 04:36 10.15.24.142.history.20141118_043037
[root@localhost root]# cat 10.15.24.142.history.20141118_043037 
#1416255336
date
#1416255351
history|tail -5
#1416255371
vim /etc/bashrc 
#1416255708
history|tail -5
#1416255723
source /etc/bash

shutdown---关闭或重启系统

-r : 关机后重新开机
-h : 关机后停机
-t seconds : 设定在几秒钟之后进行关机程序
-c : 取消目前已经进行中的关机动作
-f : 关机时,不做 fcsk 动作(检查 Linux 档系统)
-F : 关机时,强迫进行 fsck 动作

#使用shutdown命令马上重启系统
[root@localhost ~]# shutdown –r now                               
#使用shutdown命令马上关闭系统
[root@localhost ~]# shutdown –h now                               
#使用shutdown命令设置在15分钟以后自动重启系统
[root@localhost ~]# shutdown –r +15

说明:

halt:马上关闭系统

reboot:马上重启系统。

“init 0”:关闭系统

“init 6”:重启系统


重定向

说明:Linux系统中标准的输入设备为键盘,标准输出设备为屏幕,但在某些情况下,我们希望能从键盘以外的其他输入设备读取数据,或者将数据送到屏幕外的其他输出设备,这种情况称为重定向。Shell中输入输出重定向主要依靠重定向符号来实现,重定向的目标通常是一个文件。

输入重定向:输入重定向就是将命令中接收输入的途径由默认的键盘重定向为指定的文件,需要使用“<”重定向操作符。如命令“wc < f1”就表示将f1文件的信息作为wc命令的输入。
输出重定向:输出重定向是将命令的输出结果重定向到一个文件中,而不是显示在屏幕上。输出重定向使用“>”或“>>”操作符,分别用于覆盖、追加文件。
“>”重定向符后面指定的文件如果不存在,在命令执行中将建立该文件,并保存命令结果到文件中。“>”重定向符后面指定的文件如果存在,命令执行时将清空文件的内容并保存命令结果到文件中。

#查看/etc/passwd文件的内容,并将输出结果保存到pass.txt文件中。
[root@localhost ~]# cat /etc/passwd > pass.txt

执行该命令后,会在当前目录下生成一个名为pass.txt的文件,文件中的内容就是“cat /etc/passwd”命令执行的结果。
“>>”重定向操作符可以将命令执行的结果重定向并追加到指定文件的末尾保存,而不覆盖文件中原有的内容。

#查看/etc/shadow文件的后3行内容,并将输出结果追加保存到pass.txt文件中。
[root@localhost ~]# tail -3 /etc/shadow >> pass.txt

使用重定向就不会输出到屏幕,如果想同时输出到屏幕和重定向到指定文件可以使用tee命令,

[root@localhost test]# tail -5 /etc/passwd|tee tee.txt
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin 
[root@localhost test]# cat tee.txt 
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost test]#

tee--重定向到文件并打印到屏幕

[root@localhost dir1]# cat /proc/cpuinfo |grep flags|grep lm|wc -l|tee -a cpuinfo.txt
2
[root@localhost dir1]# cat cpuinfo.txt 
2
[root@localhost dir1]#

默认tee为叠加,参数-a为追加


tr :

替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号常用的选项有两个:

-d :删除某个字符,-d 后面跟要删除的字符

-s :把重复的字符去掉

[root@localhost test]# cat /etc/passwd|grep ^root
root:x:0:0:root:/root:/bin/bash
[root@localhost test]# cat /etc/passwd|grep ^root|tr '[a-z]' '[A-Z]'
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
[root@localhost test]#

wget

-O –output-document=FILE下载文件保存为别的文件名

[root@localhost ~]# wget -O rinetd1.tar.gz http://www.boutell.com/rinetd/http/rinetd.tar.gz

-c 断点续传

[root@localhost ~]# wget -cO rinetd1.tar.gz

–limit -rate限速下载 

[root@localhost ~]# wget –limit-rate=300k http://cn.wordpress.org/wordpress-3.1-zh_CN.zip

-b后台下载 

–spider测试下载链接 

如果下载链接正确,将会显示 

wget –spider URL 
Spider mode enabled. Check if remote file exists. 
HTTP request sent, awaiting response… 200 OK 
Length: unspecified [text/html] 
Remote file exists and could contain further links, 
but recursion is disabled — not retrieving.

但当你给错了一个链接,将会显示如下错误 

wget –spider url 
Spider mode enabled. Check if remote file exists. 
HTTP request sent, awaiting response… 404 Not Found 
Remote file does not exist — broken link!!!

使用spider参数可以

定时下载之前进行检查 

间隔检测网站是否可用 

检查网站页面的死链接 


–tries增加重试次数 

wget –tries=40 URL 


-i下载多个文件 

[root@localhost ~]# cat > filelist.txt 
url1 
url2 
url3 
url4 
[root@localhost ~]# wget -i filelist.txt 
[root@localhost ~]#

–mirror镜像网站 

wget –mirror -p –convert-links -P ./LOCAL URL 

–miror:开户镜像下载 

-p:下载所有为了html页面显示正常的文件 

–convert-links:下载后,转换成本地的链接 

-P ./LOCAL:保存所有文件和目录到本地指定目录 


–reject过滤指定格式下载 

wget –reject=gif url 


-o把下载信息存入日志文件 

wget -o download.log URL 


-Q限制总下载文件大小 

wget -Q5m -i filelist.txt   下载的文件超过5M而退出下载

这个参数对单个文件下载不起作用,只能递归下载时才有效


-r -A下载指定格式文件 

wget -r -A.pdf url   载一个网站的所有PDF文件 

 

FTP下载 

wget –ftp-user=USERNAME –ftp-password=PASSWORD url


启动参数:

-V, –version 显示wget的版本后退出

-h, –help 打印语法帮助

-b, –background 启动后转入后台执行

-e, –execute=COMMAND 执行`.wgetrc’格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc

记录和输入文件参数:

-o, –output-file=FILE 把记录写到FILE文件中

-a, –append-output=FILE 把记录追加到FILE文件中

-d, –debug 打印调试输出

-q, –quiet 安静模式(没有输出)

-v, –verbose 冗长模式(这是缺省设置)

-nv, –non-verbose 关掉冗长模式,但不是安静模式

-i, –input-file=FILE 下载在FILE文件中出现的URLs

-F, –force-html 把输入文件当作HTML格式文件对待

-B, –base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀

–sslcertfile=FILE 可选客户端证书

–sslcertkey=KEYFILE 可选客户端证书的KEYFILE

–egd-file=FILE 指定EGD socket的文件名

下载参数:

–bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)

-t, –tries=NUMBER 设定最大尝试链接次数(0 表示无限制).

-O –output-document=FILE 把文档写到FILE文件中

-nc, –no-clobber 不要覆盖存在的文件或使用.#前缀

-c, –continue 接着下载没下载完的文件

–progress=TYPE 设定进程条标记

-N, –timestamping 不要重新下载文件除非比本地文件新

-S, –server-response 打印服务器的回应

–spider 不下载任何东西

-T, –timeout=SECONDS 设定响应超时的秒数

-w, –wait=SECONDS 两次尝试之间间隔SECONDS秒

–waitretry=SECONDS 在重新链接之间等待1…SECONDS秒

–random-wait 在下载之间等待0…2*WAIT秒

-Y, –proxy=on/off 打开或关闭代理

-Q, –quota=NUMBER 设置下载的容量限制

–limit-rate=RATE 限定下载输率

目录参数:

-nd –no-directories 不创建目录

-x, –force-directories 强制创建目录

-nH, –no-host-directories 不创建主机目录

-P, –directory-prefix=PREFIX 将文件保存到目录 PREFIX/…

–cut-dirs=NUMBER 忽略 NUMBER层远程目录

HTTP 选项参数:

–http-user=USER 设定HTTP用户名为 USER.

–http-passwd=PASS 设定http密码为 PASS

-C, –cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许)

-E, –html-extension 将所有text/html文档以.html扩展名保存

–ignore-length 忽略 `Content-Length’头域

–header=STRING 在headers中插入字符串 STRING

–proxy-user=USER 设定代理的用户名为 USER

–proxy-passwd=PASS 设定代理的密码为 PASS

–referer=URL 在HTTP请求中包含 `Referer: URL’头

-s, –save-headers 保存HTTP头到文件

-U, –user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION

–no-http-keep-alive 关闭 HTTP活动链接 (永远链接)

–cookies=off 不使用 cookies

–load-cookies=FILE 在开始会话前从文件 FILE中加载cookie

–save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中

FTP 选项参数:

-nr, –dont-remove-listing 不移走 `.listing’文件

-g, –glob=on/off 打开或关闭文件名的 globbing机制

–passive-ftp 使用被动传输模式 (缺省值).

–active-ftp 使用主动传输模式

–retr-symlinks 在递归的时候,将链接指向文件(而不是目录)

递归下载参数:

-r, –recursive 递归下载--慎用!

-l, –level=NUMBER 最大递归深度 (inf 或 0 代表无穷)

–delete-after 在现在完毕后局部删除文件

-k, –convert-links 转换非相对链接为相对链接

-K, –backup-converted 在转换文件X之前,将之备份为 X.orig

-m, –mirror 等价于 -r -N -l inf -nr

-p, –page-requisites 下载显示HTML文件的所有图片

递归下载中的包含和不包含(accept/reject):

-A, –accept=LIST 分号分隔的被接受扩展名的列表

-R, –reject=LIST 分号分隔的不被接受的扩展名的列表

-D, –domains=LIST 分号分隔的被接受域的列表

–exclude-domains=LIST 分号分隔的不被接受的域的列表

–follow-ftp 跟踪HTML文档中的FTP链接

–follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表

-G, –ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表

-H, –span-hosts 当递归时转到外部主机

-L, –relative 仅仅跟踪相对链接

-I, –include-directories=LIST 允许目录的列表

-X, –exclude-directories=LIST 不被包含目录的列表

-np, –no-parent 不要追溯到父目录

wget -S –spider url 不下载只显示过程


|     管道

说明:管道符“|”用于连接左右两个命令,将“|”左边命令的执行结果作为“|”右边命令的输入,这样“|”就像一根管道一样连接着左右两条命令,并在管道中实现数据从左至右的传输。默认从管道传来的值是放在最后的

#分页显示/etc目录下所有文件和子目录的详细信息。
[root@localhost ~]# ls -lh /etc | more
#显示/etc目录下包含有“net”关键字的所有文件和子目录的详细信息。
[root@localhost ~]# ls -lh /etc | grep net
 -rwxr-xr-x. 1 root root 1.3K 4月 10 2012 auto.net
 -rw-r--r--. 1 root root   74 5月 31 2012 issue.net
 -rw-r--r--. 1 root root 767 11月 30 2009 netconfig
 -rw-r--r--. 1 root root   58 5月 23 2012 networks
 drwxr-xr-x. 2 root root 4.0K 1月   8 19:14 xinetd.d
#统计一下/etc目录下所有以“.conf”结尾的文件的个数。
[root@localhost ~]# ls -l /etc/*.conf | wc –l
 44            
#查看/etc/httpd/conf/httpd.conf文件中除了以“#”开头的行和空行以外的内容。
[root@localhost ~]# grep -v “^#” /etc/httpd/conf/httpd.conf | gerp –v “^$”

&&

&&前面的命令成功执行后才能执行后面的命令,前面命令失败则停止

[root@localhost ~]# date && printf "The date command was succussful"
2013年 09月 23日 星期一 16:53:54 CST
The date command was succussful
[root@localhost ~]# data && printf "The date command was succussful"
-bash: data: command not found
[root@localhost ~]#

||

有命令成功执行则停止执行后续命令,即使后续命令正确

[root@localhost ~]# date || ls -l
2013年 09月 23日 星期一 16:59:44 CST
[root@localhost ~]# date && ls -l
2013年 09月 23日 星期一 16:59:50 CST
总用量 96
-rw-------. 1 root root  1357 9月  18 15:58 anaconda-ks.cfg
-rw-r--r--. 1 root root 43294 9月  18 15:58 install.log
-rw-r--r--. 1 root root 10151 9月  18 15:55 install.log.syslog
lrwxrwxrwx. 1 root root    41 9月  23 15:55 wk -> /etc/sysconfig/network-scripts/ifcfg-eth0
drwxr-xr-x. 2 root root  4096 9月  22 14:22 公共的
drwxr-xr-x. 2 root root  4096 9月  22 14:22 模板
drwxr-xr-x. 2 root root  4096 9月  22 14:22 视频
drwxr-xr-x. 2 root root  4096 9月  22 14:22 图片
drwxr-xr-x. 2 root root  4096 9月  22 14:22 文档
drwxr-xr-x. 2 root root  4096 9月  22 14:22 下载
drwxr-xr-x. 2 root root  4096 9月  22 14:22 音乐
drwxr-xr-x. 2 root root  4096 9月  22 14:22 桌面
[root@localhost ~]#

;  分号

平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个”;”了。

[root@localhost test]# echo 3444 > 1.txt ;cat 1.txt;ll 1.txt 
3444
-rw-r--r-- 1 root root 5 Nov  6 09:17 1.txt
[root@localhost test]#

&  命令挂起;

把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。使用jobs可以查看当前shell中后台执行的任务。用fg可以调到前台执行。这里的sleep命令就是休眠的意思,后面跟数字,单位为秒,想要把任务调到前台执行的话,fg后面跟任务号,任务号可以使用jobs命令得到。

[root@localhost test]# sleep 100 &
[1] 15556
[root@localhost test]# jobs
[1]+  Running                 sleep 100 &
[root@localhost test]# fg 1
sleep 100

后台作业管理

[root@localhost rsync_server]# jobs    #查看后台作业
[1]-  Running                 nohup /bin/sh /app/inotify/rsync.sh > /app/inotify/nohup.out 2>&1 &
[2]+  Running                 nohup /bin/sh /app/inotify/rsync.sh &
[root@localhost rsync_server]# fg 2    #将后台作业2跳到前台
nohup /bin/sh /app/inotify/rsync.sh
^Z                                        #ctrl+z 将当前作业放到后台“暂停”
[2]+  Stopped                 nohup /bin/sh /app/inotify/rsync.sh
[root@localhost rsync_server]# jobs
[1]-  Running                 nohup /bin/sh /app/inotify/rsync.sh > /app/inotify/nohup.out 2>&1 &
[2]+  Stopped                 nohup /bin/sh /app/inotify/rsync.sh
[root@localhost rsync_server]# jobs -l    #列出作业PID
[1]- 17938 Running                 nohup /bin/sh /app/inotify/rsync.sh > /app/inotify/nohup.out 2>&1 &
[2]+ 18231 Stopped                 nohup /bin/sh /app/inotify/rsync.sh
[root@localhost rsync_server]# jobs -r    #列出仅在后台运行(run)的作业
[1]-  Running                 nohup /bin/sh /app/inotify/rsync.sh > /app/inotify/nohup.out 2>&1 &
[root@localhost rsync_server]# jobs -s    #列出仅在后台暂停的作业
[2]+  Stopped                 nohup /bin/sh /app/inotify/rsync.sh
[root@localhost rsync_server]# bg 2 #ctrl+z让当前作业到后台去暂停,bg 作业号就可以在后台run
[2]+ nohup /bin/sh /app/inotify/rsync.sh &
[root@localhost rsync_server]# jobs -l
[1]- 17938 Running                 nohup /bin/sh /app/inotify/rsync.sh > /app/inotify/nohup.out 2>&1 &
[2]+ 18231 Running                 nohup /bin/sh /app/inotify/rsync.sh &
[root@localhost rsync_server]# kill -9 %2
[root@localhost rsync_server]# jobs -l
[1]- 17938 Running                 nohup /bin/sh /app/inotify/rsync.sh > /app/inotify/nohup.out 2>&1 &
[2]+ 18231 Killed                  nohup /bin/sh /app/inotify/rsync.sh
[root@localhost rsync_server]#

sleep:   将目前动作延迟一段时间

sleep [--help] [--version] number[smhd]

其中 s 为秒,m 为 分钟,h 为小时,d 为日数,默认是秒

显示目前时间后延迟 1 分钟,之后再次显示时间 : 

[root@localhost ~]# date;sleep 10;date
Wed Nov 12 01:43:47 CST 2014
Wed Nov 12 01:43:57 CST 2014
[root@localhost ~]#

nohup 不挂断地运行命令

Unix/Linux下多程序并不象mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用& 结尾,但是如果终端关闭,那么程序也会被关闭。但是为了能够后台运行,那么我们就可以使用nohup和&命令,

语法:

    nohup Command [ Arg ... ] [ & ]

   eg、nohup ./filetransserver64 1>/dev/null 2>&1 &

提示:
  [~]$ appending output to nohup.out
  证明运行成功,同时把程序运行的输出信息放到当前目录的nohup.out 文件中去。

描述:

    nohup 命令运行由Command 参数和任何相关的Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用nohup 命令运行后台中的程序。要运行后台中的nohup 命令,添加& ( 表示“and”的符号)到命令的尾部。

注意:

    在当shell中提示了nohup成功后,还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;如果在nohup执行成功后直接点关闭程序按钮关闭终端的话,这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown,起不到关掉终端后调用程序继续后台运行的作用。


1>/dev/null 2>&1的含义

shell中经常会用到这个命令。

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。

2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。


/dev/null 代表空设备文件

> 代表重定向到哪里

在shell中,每个进程都和三个系统文件 相关联:标准输入stdin,标准输出stdout、标准错误stderr,三个系统文件的文件描述符分别为0,1、2。

1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"

2 表示stderr标准错误

0 是标准输入,一般是键盘

& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

nohup ./filetransserver64 1>/dev/null 2>&1 &  与 nohup ./filetransserver64 1>/dev/null 2>/dev/null &区别

nohup ./filetransserver64 1>/dev/null 2>&1 & 只使用了一个管道FD1,但已经包括了stdout和stderr。

nohup ./filetransserver64 1>/dev/null 2>/dev/null 相当于使用了FD1、FD2两个互相竞争使用文件 /dev/null 的管道

从IO效率上来讲nohup ./filetransserver64 1>/dev/null 2>&1 &的效率更高。为何2>&1要写在后面?2>&1 标准错误拷贝了标准输出的行为,但此时标准输出还是在终端。>file 后输出才被重定向到file,但标准错误仍然保持在终端。


bash  的常用快捷键

删除

ctrl + d      删除光标所在位置上的字符,相当于VIM里x或者dl

ctrl + h      删除光标所在位置前的一个字符,相当于VIM里hx或者dh

ctrl + k      删除光标后面所有字符,相当于VIM里d shift+$

ctrl + u      删除光标前面所有字符,相当于VIM里d shift+^

ctrl + w      删除光标前一个单词,相当于VIM里db

ctrl + y      恢复ctrl+u上次执行时删除的字符

ctrl + ?      撤消前一次输入

移动

ctrl + a      将光标移动到命令行开头,相当于VIM里shift+^

ctrl + e      将光标移动到命令行结尾处,相当于VIM里shift+$

ctrl + f      光标向后移动一个字符,相当于VIM里l

ctrl + b      光标向前移动一个字符,相当于VIM里h

ctrl + 方向键左键    光标移动到前一个单词开头

ctrl + 方向键右键    光标移动到后一个单词结尾

ctrl + x       在上次光标所在字符和当前光标所在字符之间跳转

alt  + f      跳到光标所在位置单词尾部

替换

ctrl + t       将光标当前字符与前面一个字符替换

alt  + t     交换两个光标当前所处位置单词和光标前一个单词

alt  + u     把光标当前位置单词变为大写

alt  + l      把光标当前位置单词变为小写

alt  + c      把光标当前位置单词头一个字母变为大写

^oldstr^newstr    替换前一次命令中字符串   

历史命令编辑

ctrl + p   返回上一次输入命令字符

ctrl + r       输入单词搜索历史命令

alt  + p     输入字符查找与字符相接近的历史命令

alt  + >     返回上一次执行命令

其它

ctrl + s      锁住终端

ctrl + q      解锁终端

ctrl + l        清屏相当于命令clear

ctrl + c       另起一行

ctrl + i       类似TAB健补全功能

ctrl + o      重复执行命令

alt  + 数字键  操作的次数


EOF 

在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,形式如下:

交互式程序(命令)<<EOF
command1
command2
...
EOF

   ”EOF“中间的内容将以标准输入的形式输入到”交互式程序“,当shell看到”<<“知道其后面输入的分界符,当shell再次看到分界符时,两个分界符中间的部分将作为标准输入。"EOF"一般常和cat命令连用。注意,最后的”EOF“必须单独占一行。

#!/bin/bash
su - oracle << EOF
salplus / as sysdba
startup
exit
EOF


变量

变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。通常shell预设的变量都是大写的。

使用env命令可全部列出系统预设的全部环境变量,可以使用set命令把系统预设的全部变量都显示出来常见的环境变量:

PATH 决定了shell将到哪些目录中寻找命令或程序

HOME 当前用户主目录

HISTSIZE 历史记录数

LOGNAME 当前用户的登录名

HOSTNAME 指主机的名称

SHELL 前用户Shell类型

LANG 语言相关的环境变量,多语言可以修改此环境变量

MAIL 当前用户的邮件存放目录

PWD 当前目录

使用bash命令即可再打开一个新的shell。用户自定义的变量要被其他用户使用或者新shell中使用需要添加到配置文件/etc/profile或$HOME/.bashrc文件最后一行加入自定义变量,然后运行”source /etc/profile”将当前的配置刷新。

linux下设置自定义变量规则:

a. 设定变量的格式为”a=b”,其中a为变量名,b为变量的内容,等号两边不能有空格;

b. 变量名只能由英、数字以及下划线组成,而且不能以数字开头;

c. 当变量内容带有特殊字符(如空格)时,需要加上单引号;如果变量内容中本身带有单引号,这就需要用到双引号了

[root@localhost ~]# myname=a long
bash: long: command not found
[root@localhost ~]# myname='a long'
[root@localhost ~]# echo $myname
a long
[root@localhost ~]# myname1="a'long"
[root@localhost ~]# echo $myname1
a'long
[root@localhost ~]#

d. 如果变量内容中需要用到其他命令运行结果则可以使用反引号(键盘上Tab键上面);

[root@localhost ~]# currentpath=`pwd`
[root@localhost ~]# echo $currentpath
/root
[root@localhost ~]#

e. 变量内容可以累加其他变量的内容,需要加双引号;

[root@localhost ~]# s1=`pwd`
[root@localhost ~]# echo $s1
/root
[root@localhost ~]# s2="$s1"ss
[root@localhost ~]# echo $s2
/rootss
[root@localhost ~]# a1="$MAIL"root
[root@localhost ~]# echo $a1
/var/spool/mail/rootroot
[root@localhost ~]#

用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用

如果在当前shell中运行bash指令后,则会进入一个新的shell,这个shell就是原来shell的子shell,在父shell中设定一个变量后,进入子shell后该变量是不会生效的,如果想让这个变量在子shell中生效则要用到export指令,如果export后面不加任何变量名,则它会声明所有的变量

f.取消已设变量

[root@localhost ~]# s2="$s1"ss
[root@localhost ~]# echo $s2
/rootss
[root@localhost ~]# unset s2
[root@localhost ~]# echo $s2

[root@localhost ~]#

扩展:

调用命令执行结果做为参数使用反引号(tab键上面键)

[root@localhost redis-3.0.0]# cd
[root@localhost ~]# pwd
/root
[root@localhost ~]# cd `find /usr/local/src/ -name "redis*" -type d`
[root@localhost redis-3.0.0]# pwd
/usr/local/src/redis-3.0.0
[root@localhost redis-3.0.0]#

basename    返回一个字符串参数的基本文件名称。

basename String [ Suffix ]

basename 命令读取 String 参数,删除以 /(斜杠) 结尾的前缀以及任何指定的 Suffix 参数,并将剩余的基本文件名称写至标准输出。

dirname,它与basename相反,是取得目录部分

[root@localhost usr]# dirname /usr/local/src
/usr/local
[root@localhost usr]# dirname /usr/local/src/
/usr/local
[root@localhost usr]# basename /usr/local/src/
src
[root@localhost usr]# basename /usr/local/src
src
[root@localhost usr]#

系统环境变量与个人环境变量的配置文件

全局变量配置文件

/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等

/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如笔者的linux系统PS1就是 [root@localhost ~]# ,你不妨看一下PS1的值:echo $PS1

局部变量配置文件

.bash_profile :定义了用户的个人化路径与环境变量的文件名称每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次

.bashrc :该文件包含专用于你的shellbash信息,当登录时以及每次打开新的shell,该该文件被读取例如你可以将用户自定义的alias或者自定义变量写到这个文件中

.bash_history :记录命令历史用的

.bash_logout :当退出shell时,会执行该文件可以把一些清理的工作放到这个文件中

Linux系统变量PATH在系统中的主要作用是,提供命令的搜索路径

查看PATH变量:

[root@Zabbix_server ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@Zabbix_server ~]#

这就是系统命令搜索的所有路径,如果哪天自己写了一些shell脚本,那怎么才能把自己的脚本路径放进PATH变量中的?假定脚本在”/home/script.sh /home/script/script1.sh”,使该脚本能在其他目录下也能执行

直接用export命令添加到PATH变量中---只对当前shell有效:

[root@Zabbix_server script]# export PATH=/home/:$PATH
[root@Zabbix_server script]# export PATH=$PATH:/home/script
[root@Zabbix_server script]# echo $PATH
/home/:/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/home/script
[root@Zabbix_server script]# cd 
[root@Zabbix_server ~]# script.sh 
/home/script.sh all|none
[root@Zabbix_server ~]# script1.sh all
none
[root@Zabbix_server ~]#

两种添加方式后的位置不通,同时设置多个目录用冒号隔开,这样就可以在任意位置使用脚本

修改.bash文件添加到PATH变量中---重启不丢失

[root@Zabbix_server ~]# vim /root/.bashrc 

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
export PATH="$PATH:/home"
export PATH="/home/script:$PATH"
[root@Zabbix_server ~]# source /root/.bashrc

不建议修改/etc/profile,因为这样的设置将对所有用户的shell都生效,对系统安全会产生影响。

~/.bash_profile  或者  ~./bashrc  对当前用户有用

Linux命令的返回值

             $? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结束时,都会返回一个数字值,这个值叫做返回值,或者称为错误号 ( Error Number )。在控制台下,环境变量 $?保存着前一个程序的返回值.

[root@localhost ~]# ll 111
-rw-r--r-- 1 root root 10 Jan 30 11:23 111
[root@localhost ~]# echo $?
0
[root@localhost ~]# ll 222
ls: cannot access 222: No such file or directory
[root@localhost ~]# echo $?
2
[root@localhost ~]#

只要返回值是 0,就代表程序执行成功了,如果 $? 变量的值不是 0 的话,就表示上一个命令在执行的过程中出错了。

如果要每次执行完都显示该值,执行export PS1="[\$?]${PS1}",这个命令把 $? 的值放在的提示符的最前面

[root@localhost ~]# export PS1="[\$?]${PS1}"
[0][root@localhost ~]# ll 111
-rw-r--r-- 1 root root 10 Jan 30 11:23 111
[0][root@localhost ~]# ll 222
ls: cannot access 222: No such file or directory
[2][root@localhost ~]#

那么如果返回的值不是 0,可以用 perror 这个程序来查看错误的信息,perror命令是MySQL数据库系统中的一个工具程序,在没有安装MySQL的机器上就无法执行

[2][root@localhost ~]# perror 2
-bash: perror: command not found
[127][root@localhost ~]# yum -y install mysql mysql-server
[0][root@localhost ~]# perror 2
OS error code   2:  No such file or directory
[0][root@localhost ~]# perror 127
OS error code 127:  Key has expired
MySQL error code 127: Record file is crashed
[0][root@localhost ~]#

$$ Shell本身的PID(ProcessID)

$! Shell最后运行的后台Process的PID

$- 使用Set命令设定的Flag一览

$# 是传给脚本的参数个数

$0 是脚本本身的名字

$1 是传递给该shell脚本的第一个参数

$2 是传递给该shell脚本的第二个参数

$$ 是脚本运行的当前进程ID号

$@ 是传给脚本的所有参数的列表

$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个

[root@localhost ~]# cat test.sh 
#!/bin/bash
echo "参数个数\$#:$#"
echo "脚本本身的名字\$0:$0"
echo "脚本的第一个参数\$1:$1"
echo "脚本的第二个参数\$2:$2"
echo "传给脚本的所有参数的列表\$@:$@"
echo "字符串显示所有向脚本传递的参数\$*:$*"
echo "脚本运行的当前进程ID号\$$:$$"
echo "退出状态,0表示没有错误,其他表示有错误\$?:$? "
[root@localhost ~]# ./test.sh 1 2 3 4 5 6 7 8 9 10 11 12
参数个数$#:12
脚本本身的名字$0:./test.sh
脚本的第一个参数$1:1
脚本的第二个参数$2:2
传给脚本的所有参数的列表$@:1 2 3 4 5 6 7 8 9 10 11 12
字符串显示所有向脚本传递的参数$*:1 2 3 4 5 6 7 8 9 10 11 12
脚本运行的当前进程ID号$$:3933
退出状态,0表示没有错误,其他表示有错误$?:0 
[root@localhost ~]#

区别:$@和$*

相同点:都是引用所有参数

不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数(分别存储在112 3)则"3)则"*" 等价于 “112 3"(传递了一个参数);而“3"(传递了一个参数);而“@" 等价于 "1""1""2" "$3"(传递了三个参数)


BashShell的extglob选项

连接

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI