Shell 脚本在我们日常开发和学习都有举足轻重的地位,比如看一些开源项目,比如项目中的各式各样的脚本,对于促进生产力工具有很大帮助!

1、命令小技巧1、-x命令进行跟踪调试执行

#!/bin/sh num1=10 num2=20 if (($num1 <= $num2)); then echo num1 lesser equal num2 else echo num1 greater num2 fi

执行:

➜ note git:(master) ✗ sh -x /Users/fanhaodong/Desktop/project/test.sh num1=10 num2=20 (( 10 <= 20 )) echo num1 lesser equal num2 num1 lesser equal num2

2、-c命令 (执行命令参数)

➜ note git:(master) ✗ sh -c << EOF " dquote> echo hello world dquote> echo hello world2 dquote> " heredoc> EOF hello world hello world2

3、使用set变量

#!/bin/sh # -v Print shell input lines as they are read. # -x Print commands and their arguments as they are executed. # -e Exit immediately if a command exits with a non-zero status. set -ex echo "hello world" exit 1

执行

➜ makefile git:(master) ✗ sh ./main.sh echo 'hello world' hello world exit 1 ➜ makefile git:(master) ✗ echo $? 1

帮助可以看:sh -c "help set"

2、语法小技巧1、${}和$适用场景

1)$ 可能有语法歧义,所以一般使用${}

#!/bin/sh s="my name is s" echo 输出: $sa echo 输出: ${s}a #输出: #输出: my name is sa

2、((cmd))

1、可以替换[-le ] 命令

num1=10 num2=20 if (($num1 <= $num2)); then echo num1 lesser equal num2 fi

3、cat[>>|>][file]<<EOF....EOF写入文件

如果重定向的操作符是<<-,那么分界符(EOF)所在行的开头部分的制表符(Tab)都将被去除。这可以解决由于脚本中的自然缩进产生的制表符。

➜ test cat > glide.yaml << EOF heredoc> name: tom heredoc> age: 10 heredoc> hobby: heredoc> - football heredoc> EOF ➜ test cat glide.yaml name: tom age: 10 hobby: - football

4、 单引号,双引号,没有引号的区别

#!/bin/sh name="tom" f1(){ echo "f1 hello world my name is $name " } f2(){ echo 'f2 hello world my name is $name ' } f3(){ echo f3 hello world my name is $name } f1 f2 f3

输出

➜ makefile git:(master) ✗ sh ./main.sh f1 hello world my name is tom f2 hello world my name is $name f3 hello world ./main.sh: line 19: my: command not found

可以看到

f3(){ echo f3 hello world \ my name is $name }

5、特殊变量6、[[]]和[]标准 以及基本语法规范

具体规范: https://github.com/koalaman/shellcheck/wiki/SC2039

#!/bin/sh name="" if [[ -z $name ]]; then echo "is zero" fi

执行后发现

shell常用命令整理(shell日常使用的小技巧)(1)

7、/bin/sh 与 /bin/bash 的区别

/bin/sh 与 /bin/bash 的区别

3、获取命令结果$(cmd)

有两种写法,一种是$()这个并不是所有的shell都支持,但是比较直观, 另外一种是"``" (它可是适用更多的平台)

#!/bin/sh echo `ls -a /Users/fanhaodong/note` echo $(ls -a /Users/fanhaodong/note)

输出:

. .. .DS_Store 1714.jpg docker-rocketmq-cluster gridea-home hexo-home note pdf vuepress-starter . .. .DS_Store 1714.jpg docker-rocketmq-cluster gridea-home hexo-home note pdf vuepress-starter

4、输入输出重定向2>&1使用

程序中经常有,标准输出,但是还有错误输出,因此需要合并到一个流中

其实Go的程序中正执行脚本的时候可以指定,标准输出和错误输出

command := exec.Command(shell, "-c", cmd) command.Stdout = os.Stdout command.Stderr = os.Stderr

使用的时候:

例如:

command >out.file 2>&1&

command >out.file是将command的标准输出重定向到out.file文件,即输出内容不打印到屏幕上,而是输出到out.file文件中。2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个&,是让该命令在后台执行。

参考

https://www.cnblogs.com/caolisong/archive/2007/04/25/726896.html

5、If语句

if 其实就是test 命令

1、格式

1) 换行写

if [ condition ]; then # body elif [ condition ]; then # body else # body fi

2)非换行写

if [ -f "/Users/fanhaodong/note/note/Makefile1" ]; then echo 111 ; echo 222 ;elif [ -f "/Users/fanhaodong/note/note/README.md" ]; then echo 333 ; echo 4444 ; else echo 555 ; echo 666 ; fi

2、结果获取/判断

结果输出0 ,表示为真,可以通过$? 来获取结果

3、例如调试条件

➜ note git:(master) ✗ test "abc"!="def" ➜ note git:(master) ✗ echo $? 0

4、测试文件是否存在

[root@019066c0cd63 ~]# ls -al lrwxrwxrwx 1 root root 5 Mar 1 09:49 c.txt -> a.txt [root@019066c0cd63 ~]# [ -L "./c.txt" ] [root@019066c0cd63 ~]# echo $? 0

➜ note git:(master) ✗ [ -f "/Users/fanhaodong/note/note/Makefile" ] ➜ note git:(master) ✗ echo $? 0 ➜ note git:(master) ✗ [ -f "/Users/fanhaodong/note/note/Makefile1" ] ➜ note git:(master) ✗ echo $? 1

5、字符串操作

字符串推荐加"" 进行定义

1) 判断字符串是否为空-z (zero)么

#!/bin/sh str="" if [ -z "${str}" ]; then echo str is empty fi # str is empty

2)判断两个字符串是否相同

#!/bin/sh str1="str" str2="str2" if [ "$str1" = "$str2" ]; then echo str1 is equal str2 else echo str1 is not equal str2 fi # str1 is not equal str2

4、测试一个命令是否存在command -v $#

#!/bin/sh cmd=go if [ `command -v $cmd` ]; then echo $cmd command is exists else echo $cmd command not exists fi # go command is exists

5、获取字符串长度${#var}

#!/bin/sh str="hello " str1=hello echo str 的长度是 ${#str} echo str1 的长度是 ${#str1} #str 的长度是 8 #str1 的长度是 5

6、数字比较

#!/bin/sh num1=10 num2=20 if (($num1 <= $num2)); then echo num1 lesser equal num2 fi if [ $num1 -le $num2 ]; then echo num1 lesser equal num2 fi # num1 lesser equal num2 # num1 lesser equal num2

7、shell脚本中if判断'-a' - '-z'含义

https://blog.csdn.net/tootsy_you/article/details/95597376

shell常用命令整理(shell日常使用的小技巧)(2)

shell常用命令整理(shell日常使用的小技巧)(3)

shell常用命令整理(shell日常使用的小技巧)(4)

6、for循环1、forin; do;;done

#!/bin/bash for item in {1..5}; do echo "$item"; done [Running] /bin/bash "/Users/fanhaodong/note/note/Linux/shell/file.sh" 1 2 3 4 5

2、for((x=0; x<10; x ));do;; done

for((x=0; x<10; x ));do echo "$x" ;done

7、awk1、例子

demo

[root@19096dee708b data]# cat demo.txt 11 22 111 22 33

脚本

[root@19096dee708b data]# awk -F ':' 'BEGIN {print "start"} /:/ {printf "do1 $1=%s $2=%s\n",$1,$2} {print "do2 .."} END {print "e nd"}' demo.txt start do1 $1=11 $2=22 do2 .. do2 .. do1 $1=22 $2=33 do2 .. e nd

2、格式

awk -arg1 x1 -arg2 x2 'BEGIN {开始执行脚本} 条件 {过程1} {过程2} END{循环体执行完后最后执行}'

1、其中条件执行正则表达式、判断等

2、还支持一些内置函数 , 一些内置变量!

3、过程中支持if函数

3、参考

https://www.ruanyifeng.com/blog/2018/11/awk.html

https://www.cnblogs.com/chengmo/archive/2010/10/08/1845913.html

8、sed

首先gun的sed函数和mac的set是有些不同的!具体看:https://superuser.com/questions/307165/newlines-in-sed-on-mac-os-x

具体写在其他文档上,目前使用的多个命令也未分享!

,