shell脚本学习(一)

用vim或vi等编写Shell脚本的格式是固定的
#!/bin/sh 可以换为 #!/bin/bash
bash下可以进行一些计算,如let,变量间的运算

#!/bin/sh
#comments
code

#!

告诉系统其后路径所指定的程序即是解释此脚本文件的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,worlds
echo "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/sh

if [ $# -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解释脚本的时候就会出错
多个条件之间也可以使用 && || 来连接

$(cd $(dirname $0); pwd)

可以获取当前执行脚本所在的目录位置

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,原文件不会发生任何变化
#这个命令只会将每一行中第一处符合样式的内容替换掉
#如果要替换每一行中所有符合样式的内容,需要参数g
sed -i 's/pattern/replace_string/g' file
#从第5处匹配开始进行替换,第N处,使用Ng
sed -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\)用以匹配子串, 这里匹配到的子串是7
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' 
this is 7 in a number

echo seven EIGHT | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1'
EIGTH seven

 

 

 

转载于:https://my.oschina.net/lhplj/blog/395708

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值