前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解释型语言-shell

解释型语言-shell

作者头像
奋飛
发布2019-08-15 16:05:58
1.5K0
发布2019-08-15 16:05:58
举报
文章被收录于专栏:Super 前端Super 前端

版权声明:本文为博主原创文章,遵循 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" 的形式输出所有参数。

代码语言:javascript
复制
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

八、表达式

代码语言:javascript
复制
if [ expression ]
then
   Statement(s) to be executed if expression is true
fi

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

代码语言:javascript
复制
if [ expression ]
then
   Statement(s) to be executed if expression is true
else
   Statement(s) to be executed if expression is not true
fi
代码语言:javascript
复制
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循环一般格式为:

代码语言:javascript
复制
for 变量 in 列表
do
    command1
    command2
    ...
    commandN
done
代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年02月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、分类
  • 二、shell特点
  • 三、常见错误
  • 四、实例
  • 五、语法
  • 六、字符串&数组
  • 七、echo&printf
  • 八、表达式
    • 九、重定向
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档