最近学写脚本写一些遇到过的坑。
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 123: 13 I'm test1.sh. $1=123 14 执行./test2.sh 123: 15 I'm test1.sh. $1=./test2.sh