0%

shell编程注意事项

定义变量时,变量名不加美元符号;
变量名和等号间不能有空格;
除了自己赋值,还可以用语句,如:for file in `ls /etc`;

使用变量需加美元符,有两种:

1
$file  ${file}

后者方便和其他字符串拼接;
变量可以被重新定义或者说赋值,依然不加美元号;

以#开头的行是注释,被忽略;
shell里没有多行注释符;
对于代码块,可以用花括号括起来定义成函数,不调用时达到注释代码块效果;

只有两种数据类型,数字、字符串;
字符串可以单引号、双引号、不引号,单引号内不能有变量、单引号的转义,双引号可以有变量、双引号的转义;

字符串拼接,

1
$file

直接在空间上拼接,
1
${file}

可以在双引号内拼接;

获取字符串长度:

1
${#file}

提取子字符串:

1
${#file:1:4}

下标从0开始计算,就是第1个到第4个,不是第1个到第三个;

linux里的[是可执行程序,位置在

1
/usr/bin/[

所以前后必须有空格;

if else:
写成一行,有值的都算True

1
if ps -ef | grep ssh;then echo hello;fi

写成脚本
1
2
3
4
if ps -ef | grep ssh
then
echo hello
fi

其他情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ps -ef | grep ssh
then
echo hello
else
echo world #else后是不能为空的
fi


if ps -ef | grep ssh
then
echo hello
elif ps -ef | grep auto
echo world #else后是不能为空的
else
echo great
fi

for while:

1
2
3
4
for var in item1 item2 ... itemn
do
command
done

写成一行:
1
for var in item1 item2 ... itemN; do command1; command2… ;done#命令间要用分号分开,done在最后一个命令之后单起一句,其后加不加分号都可以

也可以传统for风格
1
2
3
4
5
6
7
for (( var=1;var<5 ;var++))
do
echo $var
done

#单行
for (( var=1;var<5;var++));do echo $var;done

while:

1
2
3
4
while condition
do
command
done

无限循环:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while :
do
command
done

或者

while true
do
command
done

或者
for (( ; ;))
do
command
done

一个类似与while的until

1
2
3
4
util condition
do
command
done

还有一直case语法了解一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
case "${opt}" in
"Install-Puppet-Server" )
install_master $1
exit
;;

"Install-Puppet-Client" )
install_client $1
exit
;;

"Config-Puppet-Server" )
config_puppet_master
exit
;;

"Config-Puppet-Client" )
config_puppet_client
exit
;;

"Exit" )
exit
;;

* ) echo "Bad option, please choose again"
esac

在bash里source和.是等效的,他们都是读入并执行指定文件

1
2
source ./function.sh
. ./function.sh

顺便提一下获取文件绝对路径的方法

1
2
>>>readlink -f test.sh
/home/h2/test.sh

有这样的综合使用分析:
readlink -f test.sh 是一个可执行shell语句,效果是获取test.sh的绝对路径
要把执行完语句的结果传给变量的话,需要用``将语句括起来,
1
2
3
4
5
6
7
8
9
>>>testpath=\`readlink -f test.sh\`
此时$testpath 的值就是路径字符串,
直接运行$testpath 是运行该文件,可能会有权限问题,
>>>. $testpath
>>>source $testpath
都是执行那个脚本

>>>echo $testpath
是打印出路径地址

老博客地址:https://www.jianshu.com/u/1c73a3a8ae2d
新博客地址:https://inspiring26.github.io/