bash �Cn file.sh #检查脚本有无错误
bash �Cx file.sh #脚本执行中输出,检查有无错误,单步执行
定义脚本退出状态码
exit:退出脚本
exit #
没能指定退出状态码,最后一条命令为脚本退出状态码
特殊变量
$? 执行上次的命令
$* 参数列表
$# 参数的个数
$@ 参数列表
位置变量
$1,$2
shift 时就自动换掉一个参数
$ help shift
shift: shift [n]
Shift positional parameters.Rename the positional parameters $N+1,$N+2 ... to $1,$2 ... If N is
not given, it is assumed to be 1.Exit Status:
Returns success unless N is negative or greater than $#.
$# 参数的个数
if [ $# �Clt 2 ]; then
echo “cacl.sh arg1 arg2”
exit 8
fi
echo “the sum is $[$1+$2]’'
sed 流编辑器,awk
sed 基本用法
sed : Stream EDitor 流编辑器
sed : 模式空间
默认不编辑原文件,仅对模式空间中的数据做处理
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...
-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
-c, --copy
use copy instead of rename when shuffling files in -i mode
(avoids change of input file ownership)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush
the output buffers more often
--help display this help and exit
--version output version information and exit
sed 'AddressCommand' file 地址加命令 sed '1,2d' /etc/inittab
sed '3,$d' /etc/inittab
1、StartLine,EndLine
比如1,100
$ 最后一行
2、/RegExp/
/^root/
3、/pattern1/,/pattern2/
第一冷饮被pattern1匹配的行开始,至第一次被pattern2 匹配到的行结束,这中间的所有行
4、LineNumber
指定的行
5、StartLine, +N
从startLine开始,向后的N行:
sed 'AddressCommand' file
-n:静默模式,不再默认显示模式空间中的内容
-i:直接修改原文件
-e script -e script :可以同时执行多个脚本
-f /path/to/se_cript
Command:
d: 删除符合条件的行
p:显示符合条件的行
a \string :在指定的行后面追加字符
i \string :在指定的行后面插入字符
r file :将指定文件的内容添加至符合条件处
w file :将指定范围的内容保存到指定位置
s/pattern/string/: 查找并替换
g:全局替换
i:忽略字符大小写
s///:s###,s@@@ 分割符,可以多种
[root@localhost shsh]# sed '/^\//p' /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
[root@localhost shsh]# sed '/^\//a \#hello world' /etc/fstab | head -4
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
#hello world
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
[root@localhost shsh]# sed -n '/root/w /tmp/w.txt' /etc/passwd
[root@localhost shsh]# more /tmp/w.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost shsh]# sed 's/oot/OOT/' /etc/passwd
rOOT:x:0:0:root:/root:/bin/bash
s///:s###,s@@@ 分割符,可以多种
[root@localhost shsh]# sed 's@/@#@g' /etc/fstab
#dev#VolGroup00#LogVol00 # ext3 defaults 1 1
LABEL=#boot #boot ext3 defaults 1 2
tmpfs #dev#shm tmpfs defaults 0 0
devpts #dev#pts devpts gid=5,mode=620 0 0
sysfs #sys sysfs defaults 0 0
proc #proc proc defaults 0 0
#dev#VolGroup00#LogVol01 swap swap defaults 0 0
[root@localhost shsh]# more sed.txt
hello world ,i love you
[root@localhost shsh]# sed 's#l..e#&r#g' sed.txt
hello world ,i lover you
练习
1、删除/etc/grub.conf 文件中行首的空白符
2、替换/etc/inittab 文件中"id:3:initdefault:" 一行中的数字为5
3、删除/etc/inittab文件中的空白行
4、删除/etc/inittab文件中的开头#号
5、删除某文件中开头的#号及后的空白字符,但要求#号后面必须有空白字符
6、删除某文件中以空白字符后面跟#类的行中的开头的空白字符及#
7、取出一个文件路径的目录名称