[摘录备忘]Shell基础

之前用过shell写过点东西,但是不常用,有些语法就会变得陌生。

看到这篇文章觉得不错,遂收藏:http://tiaozhanshu.com/shelllinux.html,部分内容有所删减,如下。

在linux中,我们可以使用gedit,vi,emacs,nano等来编辑shell脚本,每个shell脚本都以开头:

#!/bin/sh    或者     #!/bin/bash

符号#!用来告诉系统执行此脚本所用的程序。

变量赋值和引用

Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

要给变量赋值可以写成: 变量名=值

Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。

shell里的流程控制

if语句

if ....; then
  ....
elif ....; then
  ....
else
  ....
fi

大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用” [ ] “来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等

执行man test可以查看所有测试表达式可以比较和判断的类型。

 

&&和||操作符

熟悉C语言的朋友可能会喜欢下面的表达式:

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"

这 里的 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则 打印“This computer uses shadow passwords”。同样shell编程中还可以用或操作(||)。

case语句

case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch…case混淆)。

case ... in
   ...) do something here
esac

select语句

select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:

select var in ... ; do
 break;
done
.... now $var can be used ....
下面是一个简单的示例:
#!/bin/sh

echo "What is your favourite OS?"
select var in "" "Gnu Hurd" "Free BSD" "Other"; do
  break;
done
echo "You have selected $var"

如果 以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash 该脚本的运行结果如下:

What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux

while/for循环

在shell中,可以使用如下循环:

while ...; do
   ....
done

只要测试表达式条件为真,则while循环将一直运行。关键字”break”用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。

for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量:

for var in ....; do
   ....
done

shell中的一些特殊符号

引号

单引号可以防止任何变量的扩展;

双鱼和可以防止通配符扩展但允许变量扩展;

$$ = PID号

shell把执行此shell进程的PID号存储在参数$$中;

$? : 退出状态

一个进程无论何种原因停止运行,他都要向父进程返回一个退出状态,“$?”存储这上一个命令的退出状态码:

0返回值:命令成功执行;

非0返回值:命令执行失败;

$#

命令行参数个数;

$0~%n

命令行第n个参数;

$*和$@

“$*”将位置参数看成一个参数;

“$@”将位置参数看成多个参数;

例如:

bb1  a  b  c;

set  $*  将a b c看成一个参数;即,$1=a b c;

set  $@将a b c看成三个参数;即,$1=a, $2=b, $3=c

 

shell中的函数

如果你写过比较复杂的脚本,就会发现可能在几个地方使用了相同的代码,这时如果用上函数,会方便很多。函数的大致样子如下:

functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}

你需要在每个脚本的开始对函数进行声明。

 

命令行参数

我 们已经见过$* 和 $1, $2 … $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。 但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。

脚本调试

最简单的调试方法当然是使用echo命令。你可以在任何怀疑出错的地方用echo打印变量值,这也是大部分shell程序员花费80%的时间用于调试的原因。Shell脚本的好处在于无需重新编译,而插入一个echo命令也不需要多少时间。

shell也有一个真正的调试模式,如果脚本”strangescript”出错,可以使用如下命令进行调试:

sh -x strangescript

上述命令会执行该脚本,同时显示所有变量的值。

shell还有一个不执行脚本只检查语法的模式,命令如下:

sh -n your_script

这个命令会返回所有语法错误。

你可能感兴趣的:(shell)