Shell脚本基本命令

来源:互联网 发布:阿里云邮企业版下载 编辑:程序博客网 时间:2024/04/30 04:57

shell脚本运行方式

$sh script.sh$sh /home/path/script.sh$chmod a+x script.sh ; $./script.sh

脚本调试方法


shell脚本的三种调试方法:
-n   读一遍脚本中的命令但不执行,用来检查脚本中的语法错误
-v   一边执行脚本,一边将执行过的脚本命令打印到标准输出端
-x   提供跟踪执行信息,将执行的每一条命令和结果一次打印出来
这应该就像C语言的gdb一样有用吧,有助于检查错误
使用这些选项有三种方法
1.在命令行提供参数:$sh -x script.sh
2.脚本开头提供参数:#!/bin/sh -x
3.在脚本中用set命令启用or禁用参数:其中set -x表启用,set +x表禁用

另:在写脚本的时候,需特别注意添加空格或换行或分号
eg   text命令:  $[ 5 -lt 10 ]左方括号后须有空格,右方括号前也须有空格
        shell脚本中函数定义: foo() {后须有空格或换行
        shell脚本中,若同一行内写有两条命令须加分号
与C语言不同的是,shell脚本中,返回值0表真,1表假。

echo的三种使用方式

echo hello world 不能包含一些特殊关键字,如分号;
echo "hello word" 不能包含一些特殊字符,比如!
echo 'hello word" 包含'$var'变量不能被求值


echo默认会将一个换行符追加到输出后,如果想禁止,可以使用-n这个选项
如果想要使某些转义字符生效,则可以使用-e这个选项,如 
echo "\ta\tb" 会输出 \ta\tb
echo -e "\ta\tb" 则会输出 a b


显示某些进程的环境变量

[hadoop@Hadoop ~]$ pgrep bash3182[hadoop@Hadoop ~]$ cat /proc/3182/environ USER=hadoopLOGNAME=hadoopHOME=/home/hadoopPATH=/usr/local/bin:/bin:/usr/binMAIL=/var/mail/hadoopSHELL=/bin/bashSSH_CLIENT=192.168.1.1 5649 22SSH_CONNECTION=192.168.1.1 5649 192.168.1.10 22SSH_TTY=/dev/pts/0TERM=vt100SELINUX_ROLE_REQUESTED=SELINUX_LEVEL_REQUESTED=SELINUX_USE_CURRENT_RANGE=



算术运算

使用 let、(())、[]执行基本的算术运算。

如let a = b+c; let a++;let a--;
也可以使用[], a=$[b+c];  a=$[$b+5]
也可以使用(()),不过都需要在变量前加上$
删除变量:unset


tee

tee命令:以stdin作为输入,将其输入到某个文件中,并原样输出



显示变量

set 显示当前shell的变量,包括当前用户环境变量和自己定义的变量

env 显示当前用户环境变量
export 显示当前导出成用户变量的shell变量


关联数组即 Map

[hadoop@Hadoop ~]$ declare -A map_array[hadoop@Hadoop ~]$ map_array[index1]=val1[hadoop@Hadoop ~]$ map_array[index2]=val2[hadoop@Hadoop ~]$ echo ${map_array[*]}val1 val2[hadoop@Hadoop ~]$ echo ${!map_array[*]}index1 index2

cat

作用:读取、显示、拼接文件内容。
将AB两个文件内容一块输出 [hadoop@Hadoop ~]$ cat A B
将输入文本与A一块显示 [hadoop@Hadoop ~]$ echo "Hello" | cat - A
压缩空白行 cat -s  A
将制表符显示为^|  cat -T A
显示文本行号 cat -n A


find

作用:查找路径及子路径下所有的文件和文件夹
查找script目录下所有的文件
[hadoop@Hadoop ~]$ find script/script/script/timing.logscript/output.session


根据文件名或正则表达式匹配搜索
[hadoop@Hadoop ~]$ find script/ -name "t*" #必须用引号括起来[hadoop@Hadoop ~]$ find script/ -iname "t*" #忽略文件名的大小写


可以用OR连接多个条件
[hadoop@Hadoop ~]$ find script/ \( -name "t*" -o -name "out*" \)#注意空格script/timing.logscript/output.session


可以使用参数指定查找深度
 -maxdepth 1 #指定查找的最大深度

 -mindepth 1 #指定查找的最小深度,即只列出1层以上的文件列表


 根据文件类型搜索

 -type d #只列出文件夹  -type f #只列出普通文件


 此外还可以根据时间和文件大小,还可以使用-delete删除找到的文件。
 -exec 可以对查出的每一个文件分别进行处理,如将文件所有者root改为hadoop:
 [hadoop@Hadoop temp]$ sudo find . -type f -user root -exec chown hadoop {} \;

xargs

作用:将标准输入转换成命令行参数或者将单行或多行文本转换成命令行参数
[hadoop@Hadoop ~]$ cat A | xargs #将A文件多行数据转换成单行输入,即将换行符替换为空格[hadoop@Hadoop ~]$ cat A | xargs -n 3#将A文件多行数据重新分割并按3个进行分组[hadoop@Hadoop ~]$ cat A | xargs -d i #指定分隔符为 i

 小提示:xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 file 1.log 被解释成了两个记录 file 和 1.log, 不幸的是 rm 找不到这两个文件.为了解决此类问题, 让 find命令在打印出一个文件名之后接着输出一个 NULL 字符 ('') 而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符. 这就是 find 的 -print0 和 xargs 的 -0 的来历吧.


sort和uniq

[hadoop@Hadoop ~]$sort A #对A文件进行升序排序[hadoop@Hadoop ~]$sort -r A #对A文件进行逆序排序[hadoop@Hadoop ~]$sort -n A #对A文件按数字进行排序[hadoop@Hadoop ~]$sort -k 2 A #根据第二列进行排序


uniq总是和sort一起使用,可以消除重复的行


脚本文件参数

$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
$@ 跟$*类似,但是可以当作数组用
0 0
原创粉丝点击