用vim或vi等编写Shell脚本的格式是固定的
#!/bin/sh 可以换为 #!/bin/bash bash下可以进行一些计算,如let,变量间的运算#!/bin/sh#commentscode
#!
告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误
#
注释行直到此行的结束。
保存文件为filename.sh,之后添加可执行权限
chmod +x filename.sh
打印Hello,world的示例:
#!/bin/sh#第一个shell脚本#声明一个变量a,并赋值a="Hello,world"#将变量a的值显示的控制台上echo $a
=
变量赋值paramName=paramValue
echo
在控制台上回显数据,相当于java中的System.out.println()
$
引用某个变量,$a就是引用变量a,也可以使用${a},可嵌套在""中使用
${}
引用某个变量,${a}就是引用变量a的值,这是为了避免混淆.
#!/bin/sh#说明$与${}的区别a="Hello,world"#会查找变量as,结果显示Test1,echo "Test1,$as"#会查找变量a,结果显示Test2,Hello,worldsecho "Test2,${a}s"
${#}
得到某个变量的长度,如${#PATH}可以返回PATH变量对应的字符串长度
$#
表示命令行参数的个数
$0,$1,...$9,${10},...
$0对应脚本名称,$1对应第一个参数,没有参数时什么都不显示
#!/bin/sh#输出参数个数echo "参数个数:"$##输出脚本名称echo "脚本名称:"$0#输出第一个参数echo "第一个参数:"$1
假如此脚本保存为文件hello.sh
lhp@lhp:~/shell_ex$ ./hello.sh 参数个数:0脚本名称:./hello.sh第一个参数:lhp@lhp:~/shell_ex$ ./hello.sh 12参数个数:1脚本名称:./hello.sh第一个参数:12
$*
等价于"$1c$2c$3c...$n",c是分隔符(IFS的第一个字符)
$@
等价于"$1" "$2" ... "$n"; $@比较常用
shift
删除参数列表即$*中的第一个参数,可多次使用来删除多个参数,当没有参数时使用shift会报错:can't shift that many
if [];then ... elif [];then ... else ... fi
#!/bin/shif [ $# -gt 3 ];then echo "参数个数大于3"elif [ $# -lt 2 ];then echo "参数个数小于2"else echo "参数个数为3"fi
常用的测试条件
[ $a -gt 3 ] 判断$a的值是否大于3
[ $a -ge 3 ] 判断$a的值是否大于或等于3
[ $a -lt 3 ] 判断$a的值是否小于3
[ $a -le 3 ] 判断$a的值是否小于或等于3
[ $a -eq 3 ] 判断$a的值是否等于3
[ $a -ne 3 ] 判断$a的值是否不等于3
[ -f "$file" ] 判断$file是否是一个文件
[ -h "$file" ] 判断$file存在且是一个软链接
[ -x "$file" ] 判断$file是否可执行
[ -r "$file" ] 判断$file是否可读
[ -w "$file" ] 判断$file是否可写
[ -d "$file" ] 判断$file是否为目录
[ -e "$file" ] 判断$file是否存在
[ -c "$file" ] 判断$file是否是一个字符设备的文件路径
[ -b "$file" ] 判断$file是否是一个块设备的文件路径
[ -L "$file" ] 判断$file是否是一个符号链接
[ -n "$a" ] $a为非空字符串就返回true
[ -z "$a" ] $a为空字符串就返回true
[ "$a" = "$b" ] 判断$a和$b的取值是否相等,同样的有 != > <
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,逻辑与
[ cond1 -o cond2 ] 判断cond1和cond2是否至少一个成立,逻辑或
要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错
多个条件之间也可以使用 && || 来连接可以获取当前执行脚本所在的目录位置
pgrep
查看相关进程的进程ID,如查看火狐浏览器的进程ID pagrep firefox
cat /proc/$PID/environ | tr '\0' '\n'
查看$PID对应进程的相关环境变量,并通过tr命令将每个变量占一行显示,默认所有的变量是通过null字符'\0'分割的,这里将'\0'替换为'\n'
cat -s file
查看文件,并压缩连续的空行为单独一行
cat -T file
查看文件,并将制表符标记成 ^I
录制与回放终端会话
# -t用于将时序数据导入stderr# 2> 用于将stderr重定向到timing.log# timing.log用于存储时序信息# output.session用于存储命令输出script -t 2> timing.log -a output.session#输入相关命令type commands;......#通过exit退出录制过程exit#通过以下命令就可以回放录制的命令执行过程scriptreplay timing.log output.session
多用户之间进行广播
打开2个终端:terminal1,terminal2这2个终端当前路径要一致
1.在terminal1中输入:mkfifo scriptfifo
2.在terminal2中输入
cat scriptfifo
3.在terminal1中输入
script -f scriptfifo#之后,这里输入的命令及回应都同时在2个终端上显示#需要结束会话,输入exit即可
sed
是stream editor(流编辑器)的缩写,是文本处理中非常重要的工具
能够完善地配合正则表达式使用sed -i 's/pattern/replace_string/' file#-i 将替换的结果应用于原文件,如果不使用-i,原文件不会发生任何变化#这个命令只会将每一行中第一处符合样式的内容替换掉#如果要替换每一行中所有符合样式的内容,需要参数gsed -i 's/pattern/replace_string/g' file#从第5处匹配开始进行替换,第N处,使用Ngsed -i 's/pattern/replace_string/5g' file#移除匹配样式的行sed -i '/pattern/d' file#示例:移除空白行,通过cat -A file可以看到空白行就只对应一个$sed -i '/^$/d' file#匹配成功的字符串,可以用&来标记#正则表达式\w\+表示一个单词echo this is an example | sed 's/\w\+/[&]/g'[this] [is] [an] [example] #子串匹配标记可以用\1 \2..来表示#\(pattern\)用以匹配子串, 这里匹配到的子串是7echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' this is 7 in a numberecho seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1'EIGTH seven