BASH命令和SHELL脚本总结(3)命令篇

@set的严谨使用@

set -eux

-e 如果命令带非零值返回,立即退出

-u 当执行参数括展时,把非设置变量作为错误处理(如果扩展企图 出现在非设置变量中,shell显示错误信息.如果不是交互式,则带非零值退出)  

-x 在每个简单命令被扩展之后,显示PS4扩展值,之后是要执行的命令 

 

@set -e可能引起的错误@

并不是所有命令的返回值,非0就是表示失败的

diff:0表示两个文件相同;1表示两个文件不同;2表示异常,例如两个对比项目里面有一个是目录不是文件

grep:0表示有匹配返回;1表示无匹配返回;2表示异常,例如grep目标是文件夹,却没有添加遍历等等

容易引发的问题

set -e 不是万能的,如果不绕开diff、grep等等这类返回值2为异常的情况,流程会在一些莫名其妙的情况下被终止

过于定式的习惯会引起不必要的麻烦

if [ $? -eq 0 ]; then

set -e 中如何解决

将这个特殊命令,用 set +e 和 set -e 包起来,即暂时关闭e选项

将这个特殊命令,用(  )包起来

set -e 只对当前线程有效,对子线程失效

( ) 会将里面的流程建立一个子线程,一般系统默认是不开启e选项的

 

@unset的用法@

uninitialized_variable=23 # 赋值

unset uninitialized_variable #Unset it.

echo "uninitialized_variable= $uninitialized_variable"

 

@MKDIR- p @

可以是一个路径名称。此时若路径中的某些目录尚不存在, 加上此选项后, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。比如:假设当前目录中存在test,则mkdir test/test2/test3报错,因为test2不存在,无法创建test3。而mkdir -p test/test2/test3就可以。

 

@带文件夹外壳复制所有文件VS不带文件夹外壳复制所有文件

若cp  ./abc/*.*  test_duplicate/ 则,test duplicate下面将有所有的文件。

若cp  ./abc/  test_duplicate/ 则,test duplicate下面将有abc/文件夹及其所有的文件。

若cp  ./abc   test_duplicate/ 则,test duplicate下面将有abc/文件夹及其所有的文件。

 

@CAT的功能

1.一次显示整个文件。$ cat   filename 

2.从键盘创建一个文件。$ cat  >  filename 

3.清空一个已有的文件。$cat /dev/null > RedirectFile.txt 

4.合并几个文件成一个文件并输出。输入文件按照排列顺序被打印,如果要调换信息的顺序,就必须调换输入文件的顺序。cat file1 file2 file3 >fileall

5.当需要处理的文件数目过大而无法手工输入文件名称时,可以使用通配符,如

cat chapter* > book将文件夹下所有chapter开头的文件合并到book文件中。

在使用通配符时,文件名将会按照升序排列。

6. cat -s file合并多行空白行为一个单独的空白行

cat -s file | sed '/^[[:space:]]*$/d'清除所有空白行

7. cat -b file对非空白行进行编号

8.cat -n file对所有行进行编号

 

@echo的格式

默认echo出argument之后还会echo一个换行符号。-n选项可以取消换行符号。

 

@nohup@

使得一个进程在后台运行可以采取的办法是

①nohup     ctrl+z然后bg

②screen命令

③crontab

@crontab执行@

基本格式 :

*****command分 时 日 月 周 命令

1列表示分钟159每分钟用*或者 */1表示

2列表示小时1230表示0点)

3列表示日期131

4列表示月份112

5列标识号星期060表示星期天)

6列要运行的命令

 

30 21 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

上面的例子表示每晚的21:30重启apache

 

45 4 1,10,22 * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

上面的例子表示每月11022日的4 : 45重启apache

 

10 1 * * 6,0/usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

上面的例子表示每周六、周日的1 : 10重启apache

 

0,30 18-23 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

上面的例子表示在每天18 : 0023 : 00之间每隔30分钟重启apache

 

0 23 * * 6 /usr/local/etc/rc.d/lighttpdrestart 1>/dev/null2>&1

上面的例子表示每星期六的11 : 00 pm重启apache

 

* */1 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

每一小时重启apache

 

* 23-7/1 * * */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

晚上11点到早上7点之间,每隔一小时重启apache

 

0 11 4 * mon-wed/usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

每月的4号与每周一到周三的11点重启apache

 

0 4 1 jan */usr/local/etc/rc.d/lighttpd restart 1>/dev/null 2>&1

一月一号的4点重启apache

 

 

@cut的用法

[@administer]# echo 11-22-33|cut-d"-" -f2,3 

22-33

[@administer]# echo 11-22-33|cut-d"-" -f2,3|cut -d"-" -f1

22

注意管道符号前后有没有空格都会输出相同的显示结果

 

@head和tail@

head用来查看文件的头部10行,

tail用来查看文件的尾部10行。tail还可以用来跟踪文件的更新情况。

head :

你可以通过head命令查看具体文件最初的几行内容,该命令默认是前10行内容,如果你想查看前面更多内容,你可以通过一个数字选项来设置,例如

head -20 install.log

通过上面命令你可以查看install.log这个文件前面20行的内容

与head命令相反,tail命令是用来查看具体文件后面几行的内容,默认情况下,是查看该文件尾10行的内容,同样,如果想查看后面更多内容,也是通过数字选项来设置,例如

tail -20 install.log

你还可以使用 tail 来观察日志文件被更新的过程。使用 -f 选项,tail 会自动实时

地把打开文件中的新消息显示到屏幕上。例如,要即时观察 /var/log/messages的变化,以根用户身份在 shell 提示

下键入以下命令:

tail -f /var/log/messages

 

@SORT@的参数@

输入tab键的方法                ctrl-v-i  

cat FinalResult2.txt | sort-t'      ' -k1,1 -k3,3 nr>FinalResult3.txt

注意排序依据大于一列时要写为sort-t'      ' -k1,1 -k3,3nr,不能够写为sort -t'      ' -k1-k3nr

 

@查看磁盘空间大小@

用法一   df -h     

[@administer ~]# df -h

Filesystem           Size  Used Avail Use% Mounted on

/dev/mapper/vgroot-lvroot

                     3.9G  482M  3.3G 13% /

/dev/mapper/vgroot-lvusr

                     4.9G  2.3G  2.4G 50% /usr

/dev/mapper/vgroot-lvvar

                     3.9G  427M  3.3G 12% /var

/dev/mapper/vgroot-lvopt

                     137G   79M  137G  1% /opt

/dev/cciss/c0d0p1    190M   19M  162M  11% /boot

tmpfs                6.9G   16K  6.9G   1% /dev/shm

/dev/cciss/c0d1p1    8.2T  7.3T  992G  89% /search

glusterfs#10.12.130.18

                      60T   49T  12T  81% /gfs

用法二

du -ch   看这个文件夹整体

du -chs  分开看此文件夹下面的所有小文件夹。

du --max-depth=1 分开看此文件夹下面的所有深度为1的小文件夹。

 

@top命令查看运行情况@

# top

top - 09:13:42 up 43 days, 16:32, 2 users,  load average: 11.62, 26.60, 20.90

Tasks: 168 total,   2running, 166 sleeping,   0 stopped,   0 zombie

Cpu(s): 24.8%us,  3.2%sy, 0.0%ni, 69.4%id,  2.4%wa,  0.0%hi,  0.2%si,  0.0%st

Mem:  16443520k total,10953860k used,  5489660k free,     2540k buffers

Swap:  8388600k total, 8286076k used,   102524k free,   429984k cached

# ll /proc/13299

 

@改变文件或者文件夹的属主@

chown -R felicia:felicia./TempTask/

 

@rsync限制速度及显示详细信息@

rsync --bwlimit=1024 -v0.0.0.0::root/a/b/c/* ./

 

@chmod的使用

chmod u-x,go+rw linuxsir007.txt 注:减去文件属主对文件的执行权,增加属组和其它用户对文件的可读可写权; 

 

@find与grep@

find用于查找文件系统中的指定文件,格式为find 要查找的路径 表达式

例如

find . -name 1.txt               在当前目录及其子目录下查找文件1.txt

find /tmp -name 1.txt         在/tmp 目录及其子目录下查找文件1.txt

grep命令用于查找指定的模式匹配格式为,grep [命令选项] 要查找的匹配模式 [要查找的文件]

例如

grep cams test.txt             在test.txt 文件中查找cams 字符串

grep -r cams /root/cams    在/root/cams 目录及其子目录下的所有文件中查找cams 字符串

grep 命令除了能够查找文件外还能够将任意输出流重定向到grep 进行查找

ps -ef | grep ora 查找进程名中包含ora 的所有进程信息

 

@pstree@

一般用到 pstree  -ap 查看进程数(以详细方式查看,包括其中包含的命令和PID)

 

@杀掉一个进程@

PROCESS=`ps -ef|grepyourprocess|grep -v grep |awk '{print $2}'`

kill -9 $PROCESS

@杀掉父进程及其子进程@

[@administer_18_71 Scripts]#pstree -ap|grep Statistics.sh 

  |   |      |-grep,14231 Statistics.sh

  |   |      `-sh,1642 Statistics.sh

[@administer_18_71 Scripts]#pstree -ap 1642

sh,1642 Statistics.sh

  |-cat,1643 ../Data/adid_log.20120506

  `-exe,1644 200000000300000 ../Data/pv_pvid.20120506 ../Data/cd_pvid.20120506

[@administer_18_71 Scripts]# kill1642 1644

[@administer_18_71Scripts]# 

[1]+  Terminated             nohup sh Statistics.sh

 

@SCREEN命令@

screen -S sessionid

ctrl+a d 退出刚创建的窗口(回到进入screen前的环境)

screen创建新的终端窗口

screen -ls可以看所有的screen sessions

screen -r sessionid可以进sessionid指定的特定的screen session,不再使用的时候exit退出即可

screen -d sessionid强制把一个session切换为detached状态

 

@字符串删除@

為了完整起見,我這裡再用一些例子加以說明 ${ }的一些特異功能: 

假設我們定義了一個變量為: 

@${ }@

file=/dir1/dir2/dir3/my.file.txt 

我們可以用 ${ }分別替換獲得不同的值: 

${file#*/}:拿掉第一條 /及其左邊的字串:dir1/dir2/dir3/my.file.txt 

${file##*/}:拿掉最後一條 /及其左邊的字串:my.file.txt 

${file#*.}:拿掉第一個 .及其左邊的字串:file.txt 

${file##*.}:拿掉最後一個 .及其左邊的字串:txt 

${file%/*}:拿掉最後條 /及其右邊的字串:/dir1/dir2/dir3 

${file%%/*}:拿掉第一條 /及其右邊的字串:(空值

${file%.*}:拿掉最後一個 .及其右邊的字串:/dir1/dir2/dir3/my.file 

${file%%.*}:拿掉第一個 .及其右邊的字串:/dir1/dir2/dir3/my 

記憶的方法為: 

# 是去掉左邊(在鑑盤上 # $ 之左邊

% 是去掉右邊(在鑑盤上 % $ 之右邊

單一符號是最小匹配﹔兩個符號是最大匹配。 

${file:0:5}:提取最左邊的 5個字節:/dir1 

${file:5:5}:提取第 5個字節右邊的連續 5個字節:/dir2 

${file/dir/path}:将第一个dir提换为path:/path1/dir2/dir3/my.file.txt

${file//dir/path}:将全部dir提换为path:/path1/path2/path3/my.file.txt  

 

 @用touch来改变文件的修改时间@

例一 touch -m FILE1 -r FILE2 把FILE1的时间修改为FILE2的时间

例一 touch -m Feature.cpp -r config.cpp 

例二 touch -m FILE1 -t TIME(YYYYMMDDHHMM) 用TIME所指定的时间去修改FILE1的时间

例二 touch -m Feature.cpp -t 201211052230


你可能感兴趣的:(Scripts)