shell脚本

最近学写脚本写一些遇到过的坑。

 2018-12-20:开始参考《linux命令行和shell脚本编程大全》

 

命令执行:

 1 #1.直接执行,和在shell中直接输入一样。缺点是没法保存输出。
 2 echo $PATH
 3 cat somefile
 4 
 5 #2.用$和括号来执行。
 6 #    注意,如果没有括号的话,$仅仅表示取变量值。
 7 msg=$(cat somefile)
 8 
 9 #2.1考虑如何接受错误信息?
10 #    使用>将标准错误输出重定向到标准输出
11 msg=$(cat somefile 2>&1)
12 
13 #3.如何判断命令是否正确执行?
14 #    目前自己知道的方法只有查询 $? 是否等于0,但不是很保险,而且有些命令即使报错了 $? 也仍然是0
15 if [ $? == 0 ]; ...

 

字符串比较

# 其实在《鸟哥的linux私房菜》里已经说的很明确了,
# 不过刚开始时没注意,当时感觉也是坑的一逼
# 标准格式 [ "$cmp1" == "$cmp2" ],一定要用双引号括起来!

#错误格式1,万一比较的是含空格的内容怎么办
if [ $1 == "1" ]

#错误格式2,经测试为空时这种比较方式返回false
if [ $1 == "" ]

 

井号的特殊用法(字符串去掉前缀)

1 var=abcdefg
2 mask=abcd
3 echo ${var#${mask}}
4 
5 输出:
6 efg

 

条件判断

 1 #刚开始的时候遇到了几个坑
 2 #1.空格不是可选的,而是必须的!
 3 #正确示例:
 4 if [ $? == 0 ]
 5 
 6 #错误示例:(方括号和判断内容间必须有空格)
 7 if [$? == 0]
 8 
 9 #错误示例:(等于号两边必须有空格)
10 if [ $?==0 ]
11 
12 #2.if条件必须加then,但是else却不需要加,而且if必须单独一行或行尾加分号
13 if [ $? == 0 ]; then
14 
15 #3.中括号[]内比较的都是字符串,如果要比较整形可以使用双括号(())或双中括号[[]]代替。
16 #    有一篇关于各类括号的博客https://blog.csdn.net/taiyang1987912/article/details/39551385
17 if [ $1 -eq $2 ]...

 

shift命令

#位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,
#原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1 

 

函数,如何返回字符串

#
# 如果直接调用函数的话,接收到的结果是$? # 解决方法:使用echo输出,使用$()接收 # test.sh: #
func() {
if [ "$1" == "1" ] then echo one elif [ "$1" == "2" ] then echo two else echo else fi } res=$(func $@) echo "res=$res"
# # 执行结果 # $
sh test.sh 1 # one # $sh test.sh 2 # two
#

 

点+空格+文件名”是什么意思?

1 #openwrt /etc/preinit脚本中:
2 
3 .  /bin/functions.sh
4 
5 
6 #
7 #表示在当前shell下执行文件,不论执行的文件是否有执行权限
8 #2018-12-06:从后面这条中思考发现,实际上是把文件中的脚本内容拷贝到当前文件下,其中第一行#!/bin/sh...会被当作注释行忽略
9 #2018-12-20:参考《linux命令行和shell脚本编程大全》附录:在当前shell中读取并执行指定文件中的命令

 

第一行:#!/bin/sh /etc/rc.common 的意义实际上是执行 sh /etc/rc.common {当前脚本}!!!

 1 脚本test1.sh 2 #!/bin/sh
 3 
 4 echo "I'm test1.sh. \$1=$1"
 5 
 6 
 7 脚本test2.sh 8 #!/bin/sh test1.sh
 9 
10 echo "I'm test2.sh. \$1=$1"
11 
12 执行./test1.sh 12313   I'm test1.sh. \$1=123
14 执行./test2.sh 12315   I'm test1.sh. \$1=./test2.sh

 

posted on 2018-10-09 10:23  laymond  阅读(127)  评论(0编辑  收藏  举报

导航