解释型语言-shell

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://ligang.blog.csdn.net/article/details/43452723

shell解释型语言也被称作“脚本语言” shell分两大类:第一类,图形界面shell(Graphical User Interface shell 即 GUI shell);第二类,命令行式shell(Command Line Interface shell ,即CLI shell)。传统意义上的shell指的是命令行式的shell。

一、分类

Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等。 bash:是Linux标准默认的shell,内部命令一共有40个。 sh:是Unix 标准默认的shell。 bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行

二、shell特点

简单性:Shell是一个高级语言;通过它,你可以简洁地表达复杂的操作。 可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。 开发容易:可以在短时间内完成一个功能强大又妤用的脚本。

三、常见错误

报错:-bash: ./bin/test.sh: /bin/bash^M: bad interpreter: No such file or directory 原因:编码格式造成的 解决: 1. 查看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的:vi filename 2. 可以用执行dos2unix 命令转换编码:#dos2unix filename

四、实例

实例一 #!/bin/bash echo "Hello World !" 执行: chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本 实例二 脚本使用read命令从stdin(标准输入)获取输入并赋值给PERSON变量,最后在stdout(标准输出)上输出 #!/bin/bash echo "What is your name?" read PERSON echo "Hello, $PERSON"

五、语法

定义变量时,变量名不加美元符号($): variableName="value" 使用一个定义过的变量,只要在变量名前面加美元符号($)即可: echo $variableName echo ${variableName} 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变: variableName="value" readonly variableName 使用unset命令可以删除(非只读)变量: variableName="value" unset variableName

命令

说明

$n

传递给脚本或函数的参数。n是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$#

传递给脚本或函数的参数个数。

$*

传递给脚本或函数的所有参数。

$@

传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$?

可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

$$

当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

echo "pid $$"
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

转义字符

含义

\\

反斜杠

\a

警报,响铃

\b

退格(删除键)

\f

换页(FF),将当前位置移到下页开头

\n

换行

\r

回车

\t

水平制表符(tab键)

\v

垂直制表符

expr 是一款表达式计算工具,使用它能完成表达式的求值操作: 1. 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。 2. 完整的表达式要被``包含,注意这个字符不是常用的单引号,在 Esc 键下边。

六、字符串&数组

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。 获取字符串长度 string="abcd" echo ${#string} #输出 4 提取子字符串 string="alibaba is a great company" echo ${string:1:4} #输出liba 查找子字符串 string="alibaba is a great company" echo `expr index "$string" is` 数组: 在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。 array_name=(value0 value1 value2 value3) 读取数组元素值的一般格式是:${array_name[index]} 取得数组元素的个数: length=${#array_name[@]} 或者 length=${#array_name[*]} 取得数组单个元素的长度: lengthn=${#array_name[n]}

七、echo&printf

echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串 显示转义字符:echo "\"It is a test\"" 换行显示: echo "OK!\n" echo "It is a test" 显示变量: name="OK" echo "$name It is a test" 显示结果重定向至文件: echo "It is a test" > myfile 显示当前日期:echo `date` printf命令用于格式化输出,是echo命令的增强版: $ printf "%d %s\n" 1 "abc" 1 abc

八、表达式

if [ expression ]
then
   Statement(s) to be executed if expression is true
fi

如果expression返回true,then后边的语句将会被执行;如果返回false,不会执行任何语句。 注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。

if [ expression ]
then
   Statement(s) to be executed if expression is true
else
   Statement(s) to be executed if expression is not true
fi
if [ expression 1 ]
then
   Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
   Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
   Statement(s) to be executed if expression 3 is true
else
   Statement(s) to be executed if no expression is true
fi

if ... else 语句也经常与test命令结合使用 test命令用于检查某个条件是否成立,与方括号([ ])类似。 for循环一般格式为:

for 变量 in 列表
do
    command1
    command2
    ...
    commandN
done
while command
do
   Statement(s) to be executed if command is true
done

九、重定向

1. 输出重定向: 输出到显示器的内容被重定向到文件:$ command > file 在显示器上不会看到任何输出:$ who > users 不希望文件内容被覆盖,可以使用>>追加到文件末尾 $ echo line 2 >> users 2. 输入重定向: 本来需要从键盘获取输入的命令会转移到文件读取内容:command < file 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到/dev/null:$ command > /dev/null 如果希望屏蔽 stdout 和 stderr,可以这样写: $ command > /dev/null 2>&1 参考文献:http://www.w3cschool.cc/linux/linux-shell-test.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券