前言
本文不是系统学习shell的笔记 只是记录我写代码是遇到的一些记录
set -eo pipefail
这条命令出现在脚本第一行
- set -e
告诉shell 脚本中有语句执行返回值不为0的时候 直接退出 - set -o pipefail
将返回管道中最后一个返回值不为0的管道的返回值
dirname
保留最后一个 / 及其前面的字符
#代码举例
dirname path
将当前路径去除掉path后返回
$0
表示的是脚本文件的当前路径
那么和dirname结合 就能得到当前目录下的路径
赋值
可以直接采用$var或者 ${var}的方式来赋值
等号左右不能有空格
推荐用${var}的方式
因为:
#假如这里有两个字符串VA 和 VALUE
#想都赋值给VAR
VAR=$VAVALUE
#但实际是将VAVALUE赋值给VAR
用()
只是字符串的话 不可以用()来赋值
- ()用于子进程的命令替换:执行()中的命令,并返回命令的返回值
ROOT=$(dirname "$0")
- 创建子进程执行命令而不影响父进程
(cd /ROOT && ls)
命令替换
上面提到()是用来进行命令替换的
命令替换还有一种方法
-
``
这种可读性低不建议 -
$()
命令替换的过程
a. 会识别到 $(cmd) 然后创建子shell来执行命令cmd
b.之后将子shell的标准输出返回原命令
$
这是补充的第一点 因为我经常忘记写$
没有$的话,你写的只是普通的字符 而不是变量!!!!!
$
$有很多参数 下面是一个总结
||
第一个|是管道的意思
第二个的| :
是一种“空操作”,意味着如果前面的命令(包括 Perl 命令)失败(即返回非零状态),将执行一个空操作。这样做的目的是避免脚本因错误而中断。
输出标准错误
我们学过文件描述符,知道0、1、2分别对应标准输入、标准输出、标准错误,也学过如何重定向(>),&的意思是等价,即定向到同一个地方
ls > output.txt # 将标准输出重定向到 output.txt
ls 2> error.txt # 将标准错误重定向到 error.txt
我们想直接将命令的标准错误显示在终端上就可以这么写
(也就是标准错误和标准输出都输出到终端上
ls mydir 2>&1
命令太长:反斜杠
cv=$(mysql -h$FE_HOST -P$FE_QUERY_PORT -u$USER -e 'admin show frontend config' | grep 'stream_load_default_timeout_second' | awk '{print $2}')
使用管道的时候,命令太长了 写在一行里可读性差,分成两行就好了
需要在管道的后面写上反斜杠
反斜杠的另一个作用:转义特殊字符
他可以让后面紧接着的特殊字符失去特殊含义
比如:
echo \$n
\$n
$失去了它的作用
但用的比较少
printf和echo
在大佬的建议下学习了printf和echo的区别
(我刚知道可以用printf
计算长度
printf给多长就会计算多长,而echo会将字符串的最后换行符也计算在里面
转义字符
printf可以直接识别‘\n’、'\r’等转义字符
但当我们
echo “1\n2"
1\n2
的时候,发现直接输出1\n2 因为想识别转义字符,需要写上-e参数
echo -e “1\n2"
1
2
printf为什么好?
- printf兼容性非常好 ,任何unix系统的版本都能兼容(因为unix使用c写的)
- printf能对输入字符串的内容进行格式化与显示宽度的控制
引用文章:Echo与Printf回显命令差异分析与应用
这篇文章讲的很详细
‘’ 与""的区别
上一条的printf里提到“”,那么双引号和单引号有什么区别呢
‘’
被单引号括起来的内容,其中的空格、特殊字符都不会对shell产生任何影响,他就是一个字符串
“”
双引号同样会忽略空格,但有三个他不会忽略
*$ 和 ` 和 *
[]与[[]]
在如if、for语句等的时候,我们需要做判断,可以写[]、test、[[]]这三种方式( [命令与test等价
需要注意 [和 [[都是独立的命令 后面需要有空格
]只是 [ 命令 的一个参数
怎么加引号
我产生里一个疑问 什么时候我要加双引号,什么时候不用
这里的建议是在:
数值比较不用加双引号
字符串比较加双引号
变量加双引号
test命令
text命令其实就是if []
参数使用
下面介绍一些参数
- ! 取反
- -a 表示与操作
- -o 表示或操作
- -e 文件名 如果文件存在则为真
- -s 文件名 如果文件存在且至少有一个字符则为真
- -d 文件名 如果文件存在且为目录则为真
- -f 文件名 如果文件存在且为普通文件则为真
test与[[]]的区别是 test不支持写&& || 而[[]]
代码举例
#!/bin/bashstr1="hello"
str2="world"if [ "${str1}" = "${str2}" ]; thenprintf "The strings are equal\n"
fi
#!/bin/bashstr1="hello"
str2="world"if [[ $str1 == "hello" && $str2 == "world" ]]; thenprintf "Both strings match!\n"
fi
#!/bin/basha=5
b=10if test $a -lt $b; thenprintf "%d is less than %d\n" $a $b
fi
总结
就暂时写着么多