Bourne Shell编程杂记
2016-05-25 10:12
232 查看
首先强调一下,Bourne Shell数据类型的概念极简单:一切变量的值,都是字符串。所以,也可以认为,Bourne Shell只有一种基本数据类型,那就是字符串。
由于数据类型太简单,所以脚本中若要进行各种数学运算,只能借助其他程序(例如,expr程序)来完成。其他程序计算出的结果,在脚本中仍然保存为一个字符串。
唯一例外的是数组,他是一组字符串的集合。
脚本第一行固定为如下内容
#!/bin/sh
他表示这是一个解释器文件,由程序/bin/sh来解释执行。当然,若实际环境中sh程序不在这个路径,则调整一下即可。
好了,下面开始进入正文。
0. 变量赋值及引用
给变量赋值
VAR_NAME=expression
例如:
a=1
a=hello
a="Hello world!" #值为多个单词时,需要用引号括一下
引用变量的值
${VAR_NAME} 或者 $VAR_NAME
1. 命令行参数
以如下命令行为例
xxx.sh a b c
$0 表示命令行中最左边的这部分,即用相对路径或绝对路径表示的脚本文件的路径。
实际执行时,这里是什么,就是什么。他就是原原本本的shell脚本的路径。
$# 表示参数的个数,不包括$0本身。本例中,$#为3,即3个参数:a b c。
$1 $2 $3 ......表示具体的参数。这里他们分别对应a b c
最后,对于函数的参数,$#与$1 $2 $3 ......,含义完全同上。
同时,对于函数来说,$0的值并不是函数名,而是与脚本执行命令行参数中的$0一致。
2. 保存命令执行的标准输出到变量中
a=`/path/to/program [params ...]`
注意,不管命令的输出中是否包含分隔开的单词,整个结果都做为一个字符串保存到了变量中。
这个对于保存函数执行的标准输出也一样适用。语法也一样。
a=`function [params ...]`
3. 数组相关
注意,所有相关的值,还是和变量的值类型一样,都是字符串。
创建数组 a=(1 2 3 4 5)
数组元素个数 ${#a[@]} #值为5
引用元素 ${a[i]} #注意,数组下标i从0开始
元素赋值 a[i]=100
引用整个数组的内容 ${a[*]} 或者 ${a[@]} #值为1
2 3 4 5
最后注意一下,这里数组a的赋值比较规范。实际情况下,括号内的内容,可以是一组用分隔符(可以是空格,换行符)隔开的单词(例如 ls 命令的执行结果)。
赋值后,每个单词就是数组的一个元素,干干净净的,不包含分隔符本身。如果两个单词之间有多个分隔符,效果还是等于一个分隔符。
4. 分支语法
(i)if语句
if [ expression ]; then
...
elif [ expression ]; then
...
else
...
fi
(ii)for循环
item_list="1 2 3 4 5" 或者引用前面的数组生成条目列表 item_list=${a[@]}
for i in ${item_list};
do
echo $i
done
5. sed引用shell变量
示例如下。唯一要注意的是,要使用双引号,不能使用单引号。
sed "s/something/${var_name}/g" a.txt
6. awk引用shell变量
示例如下。
echo 1 2 3 | awk '{ if ($3=="'$var_name1'") print "'$var_name2'"}'
由于数据类型太简单,所以脚本中若要进行各种数学运算,只能借助其他程序(例如,expr程序)来完成。其他程序计算出的结果,在脚本中仍然保存为一个字符串。
唯一例外的是数组,他是一组字符串的集合。
脚本第一行固定为如下内容
#!/bin/sh
他表示这是一个解释器文件,由程序/bin/sh来解释执行。当然,若实际环境中sh程序不在这个路径,则调整一下即可。
好了,下面开始进入正文。
0. 变量赋值及引用
给变量赋值
VAR_NAME=expression
例如:
a=1
a=hello
a="Hello world!" #值为多个单词时,需要用引号括一下
引用变量的值
${VAR_NAME} 或者 $VAR_NAME
1. 命令行参数
以如下命令行为例
xxx.sh a b c
$0 表示命令行中最左边的这部分,即用相对路径或绝对路径表示的脚本文件的路径。
实际执行时,这里是什么,就是什么。他就是原原本本的shell脚本的路径。
$# 表示参数的个数,不包括$0本身。本例中,$#为3,即3个参数:a b c。
$1 $2 $3 ......表示具体的参数。这里他们分别对应a b c
最后,对于函数的参数,$#与$1 $2 $3 ......,含义完全同上。
同时,对于函数来说,$0的值并不是函数名,而是与脚本执行命令行参数中的$0一致。
2. 保存命令执行的标准输出到变量中
a=`/path/to/program [params ...]`
注意,不管命令的输出中是否包含分隔开的单词,整个结果都做为一个字符串保存到了变量中。
这个对于保存函数执行的标准输出也一样适用。语法也一样。
a=`function [params ...]`
3. 数组相关
注意,所有相关的值,还是和变量的值类型一样,都是字符串。
创建数组 a=(1 2 3 4 5)
数组元素个数 ${#a[@]} #值为5
引用元素 ${a[i]} #注意,数组下标i从0开始
元素赋值 a[i]=100
引用整个数组的内容 ${a[*]} 或者 ${a[@]} #值为1
2 3 4 5
最后注意一下,这里数组a的赋值比较规范。实际情况下,括号内的内容,可以是一组用分隔符(可以是空格,换行符)隔开的单词(例如 ls 命令的执行结果)。
赋值后,每个单词就是数组的一个元素,干干净净的,不包含分隔符本身。如果两个单词之间有多个分隔符,效果还是等于一个分隔符。
4. 分支语法
(i)if语句
if [ expression ]; then
...
elif [ expression ]; then
...
else
...
fi
(ii)for循环
item_list="1 2 3 4 5" 或者引用前面的数组生成条目列表 item_list=${a[@]}
for i in ${item_list};
do
echo $i
done
5. sed引用shell变量
示例如下。唯一要注意的是,要使用双引号,不能使用单引号。
sed "s/something/${var_name}/g" a.txt
6. awk引用shell变量
示例如下。
echo 1 2 3 | awk '{ if ($3=="'$var_name1'") print "'$var_name2'"}'
相关文章推荐
- Linux Shell系列教程之(四)Shell注释
- Linux Shell系列教程之(三)Shell变量
- Shell中的循环语句for、while、until
- shell动画
- BASH 的调试技巧
- 系统变量写在.bash_profile和.bashrc的区别
- shell(七)通配符及特殊符号
- Jenkins+Git+Maven+Shell+Tomcat持续集成 经典教程
- linux shell编程
- ant调用shell命令(Ubuntu)
- [bash] how to use bash-shell array
- 执行sh ./xxx.sh出现:“Syntax error: “(” unexpected”的解决方法
- Shell编程
- Shell操作
- Shell bash 脚本语法
- Shell登陆
- Linux Shell 几个特殊符号命令 & 、&& 、 ||
- shell 脚本运行 hive sql
- shell默认参数
- shell判断、循环、控制语句与函数应用