shell 编程总结一,概念,变量

1. 基本概念

1.1 什么是 shell

业界所说的shell通常都是指shell脚本,但要知道,shell和shell script是两个不同的概念:

1.2 Shell 环境

Shell 编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux的Shell种类众多,常见的有:

大多数情况下提到 shell 都是指 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用。同时, Bash也是大多数Linux系统默认的Shell。 在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh ,它同样也可以改为 #!/bin/bash#! 告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。

1.3 shell 脚本的执行

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

注意,一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的, 而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的, 要用./test.sh告诉系统说,就在当前目录找。

/bin/sh test.sh
/bin/php test.php

2. shell 变量

定义变量时,变量名不加美元符号:

your_name="runoob.com"

注意,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:

除了显式地直接赋值,还可以用语句给变量赋值,如:

for file in `ls /etc`

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java do
    echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成 echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空), 代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号,这是个好的编程习惯。 已定义的变量,可以被重新定义,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

2.1 字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。

str='this is a string'
your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
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`

2.2 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。 类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

# 在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)
# 读取数组元素值的一般格式是:${数组名[下标]}
valuen=${array_name[n]}

# 使用@符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

3. echo 的用途

echo "It is a test"

# 这里的双引号完全可以省略,以下命令与上面实例效果一致
echo It is a test
chenshan@mac007:~/Desktop/github/litaotao.github.io$echo "\"It is a test\""
"It is a test"

chenshan@mac007:~/Desktop/github/litaotao.github.io$echo \"It is a test\"
"It is a test"
#!/bin/sh
read name
echo "$name It is a test"
# 换行
echo -e "OK!\n" # -e 开启转义
echo "It it a test"

# 不换行
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
# 以重写文件的方式重定向
echo "It is a test" > myfile

# 以添加到文件尾的方式重定向
echo "It is a test" >> myfile
chenshan@mac007:~/Desktop/github/litaotao.github.io$echo -e $(date) '\n'  `date`
Tue Nov 17 22:21:05 CST 2015
 Tue Nov 17 22:21:05 CST 2015

参考文档