本教程分为入门篇,命令篇和实战篇,结合平时工作中使用Shell的经验编写。以实例为主,侧重于应用,总结了一些实用的技巧。
以下为本教程的《入门篇》,适于初学者快速入门以及老手查缺补漏。
第一招 HelloWorld
第一式:echo
echo "Hello World"
echo -n "Hello World" # 不带换行
echo -e '\e[0;33;1mHello\e[0m World' # 带颜色的玩法
echo -e '\e[0;33;4mHello\e[0m World' # 带颜色+下划线
echo -e '\e[0;33;5mHello\e[0m World' # 带颜色+闪烁
格式为 \e[背景色;前景色;高亮格式m
,请阅读详细文档后使用正确的姿势进行装逼。
第二招 判断
第一式:if
if true
then
echo "Hello World"
else
echo "Bug"
fi
if false
then
echo "Hello World"
elif true
then
echo "Bug"
else
echo "Bee"
fi
判断原理
if
、elif
会执行它后面跟着的命令,然后看返回值是否为0
,如果为0
则执行then
下面的语句块,否则执行else
下面的语句块。
[casheywen@ubuntu:~]$ true
[casheywen@ubuntu:~]$ echo $?
0
[casheywen@ubuntu:~]$ false
[casheywen@ubuntu:~]$ echo $?
1
注:
true
、false
事实上也为一个命令,true
的返回码必为0
,false
的返回码必为1
$?
为shell
内置变量,用于存放上一个命令的返回码
第二式:test、[ ] 和 [[ ]]
test
、[ ]
、[[ ]]
实际上都是shell
中的命令,执行之后会返回1
或0
,而这几个命令与if
相结合可以达到我们所需要的许多判断功能,例如测试字符串是否为空的三种写法:
s=""
if [ -z ${s} ]
then
echo "empty"
fi
if [[ -z ${s} ]]
then
echo "empty"
fi
if test -z ${s}
then
echo "empty"
fi
事实上,if
后的[ ]
、[[ ]]
、test
命令都是可以单独执行的,而根据if
的判断原理,后续执行哪个分支也是由[ ]
、[[ ]]
、test
的返回值来决定的,以下是单独执行它们的效果:
[casheywen@ubuntu:~]$ s=""
[casheywen@ubuntu:~]$ [ -z "${s}" ]
[casheywen@ubuntu:~]$ echo $?
0
[casheywen@ubuntu:~]$ s="abc"
[casheywen@ubuntu:~]$ test -z "${s}"
[casheywen@ubuntu:~]$ echo $?
1
[casheywen@ubuntu:~]$ s="123"
[casheywen@ubuntu:~]$ [[ 100 -lt ${
s} ]]
[casheywen@ubuntu:~]$ echo $?
0
在性能方面[ ]
和test
性能基本相同,[[ ]]
性能是最高的,为前两者的5
倍左右(以-d
运算符测试),所以建议尽量使用[[ ]]
提高脚本性能。
文件测试
运算符 | 描述 | 示例 |
---|---|---|
-e filename | 如果 filename 存在,则为真 | [ -e /var/log/syslog ] |
-d filename | 如果 filename 为目录,则为真 | [ -d /tmp/mydir ] |
-f filename | 如果 filename 为常规文件,则为真 | [ -f /usr/bin/grep ] |
-L filename | 如果 filename 为符号链接,则为真 | [ -L /usr/bin/grep ] |
-r filename | 如果 filename 可读,则为真 | [ -r /var/log/syslog ] |
-w filename | 如果 filename 可写,则为真 | [ -w /var/mytmp.txt ] |
-x filename | 如果 filename 可执行,则为真 | [ -L /usr/bin/grep ] |
filename1 -nt filename2 | 如果 filename1 比 filename2 新,则为真 | [ /tmp/install/etc/services -nt /etc/services ] |
filename1 -ot filename2 | 如果 filename1 比 filename2 旧,则为真 | [ /boot/bzImage -ot arch/i386/boot/bzImage ] |
字符串比较
运算符 | 描述 | 示例 |
---|---|---|
-z string | 如果 string 长度为零,则为真 | [ -z "${myvar}" ] |
-n string | 如果 string 长度非零,则为真 | [ -n "${myvar}" ] |
string1 = string2 | 如果 string1 与 string2 相同,则为真 | [ "${myvar}" = "abc" ] |
string1 != string2 | 如果 string1 与 string2 不同,则为真 | [ "${myvar}" != "abc" ] |
string1 < string | 如果 string1 小于 string2,则为真 | [ "${myvar}" \< "abc" ] [[ "${myvar}" < "abc" ]] |
string1 > string | 如果 string1 大于 string2,则为真 | [ "${myvar}" \> "abc" ] [[ "${myvar}" > "abc" ]] |
注意:
- 在字符串两边加上”“防止出错
<
和>
是字符串比较,不要错用成整数比较- 如果是在
[ ]
中使用<
和>
,需要将它们写成\<
和\>
整数比较
运算符 | 描述 | 示例 |
---|---|---|
num1 -eq num2 | 等于 | [ 3 -eq $mynum ] |
num1 -ne num2 | 不等于 | [ 3 -ne $mynum ] |
num1 -lt num2 | 小于 | [ 3 -lt $mynum ] |
num1 -le num2 | 小于或等于 | [ 3 -le $mynum ] |
num1 -ge num2 | 大于或等于 | [ 3 -ge $mynum ] |
第三式:&&、||
&& 可以用来对两个判断 |
---|