用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
在控制台上回显数据,相当于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对应第一个参数,没有参数时什么都不显示
#!/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的第一个字符)
删除参数列表即$*中的第一个参数,可多次使用来删除多个参数,当没有参数时使用shift会报错:can't shift that many
#!/bin/sh if [ $# -gt 3 ];then echo "参数个数大于3" elif [ $# -lt 2 ];then echo "参数个数小于2" else echo "参数个数为3" fi
要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错
多个条件之间也可以使用 && || 来连接
可以获取当前执行脚本所在的目录位置
查看相关进程的进程ID,如查看火狐浏览器的进程ID pagrep firefox
查看$PID对应进程的相关环境变量,并通过tr命令将每个变量占一行显示,默认所有的变量是通过null字符'\0'分割的,这里将'\0'替换为'\n'
查看文件,并压缩连续的空行为单独一行
查看文件,并将制表符标记成 ^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 scriptfifo2.在terminal2中输入
cat scriptfifo3.在terminal1中输入
script -f scriptfifo #之后,这里输入的命令及回应都同时在2个终端上显示 #需要结束会话,输入exit即可
是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