shell 简单入门

解释器

sh

即Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。

bash(Bourne Again Shell)

Bash是Bourne shell的替代品,属GNU Project,二进制文件路径通常是/bin/bash。业界通常混用bash、sh、和shell

在CentOS里,/bin/sh是一个指向/bin/bash的符号链接:

csh(C Shell)

是一种比 Bourne Shell更适合的变种 Shell,它的语法与 C 语言很相似。

Tcsh

是 Linux 提供的 C Shell 的一个扩展版本。Tcsh 包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似 C 语言的语法,他不仅和 Bash Shell 提示符兼容,而且还提供比 Bash Shell 更多的提示符参数。

ksh(Korn Shell)

集合了 C Shell 和 Bourne Shell 的优点并且和 Bourne Shell 完全兼容。

pdksh

是 Linux 系统提供的 ksh 的扩展。支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。


For

循环输出hello

1
2
3
4
5
6
#!/bin/bash

for ((index=0; index < 5; ++index));
do
echo "hello"
done

需要注意的是,第一行代码指定当前脚本默认的解释器

shell 运行方式

  • ./test.sh 那么调用第一行代码指定的解释器执行test.sh。(前提test.sh有x权限)
  • sh test.sh 默认调用系统bash shell解释器执行test.sh,此时第一行代码指定的解释器将无效。

遍历

1
2
3
4
for skill in Ada Coffe Action Java; 
do
echo "I am good at ${skill}Script"
done

变量

1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

定义变量

声明变量方式与python类似,只不过使用变量时,需要在变量前添加$符号

1
2
3
# 需要注意,=两边不能有空格
say="hello word"
echo $say

单引号字符串的限制

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的

  • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)

双引号字符串的优势

  • 可以有变量

  • 可以出现转义字符

拼接字符串

1
2
3
4
your_name="six"
# 等价 say="hello word, from $your_name"
say="hello word, from ${your_name}"
echo $say

变量外面的{}是可选的,为了帮助解释器识别变量的边界,建议加上。

获取字符串长度

1
2
test_str="hello word"
echo ${#test_str}

输出 10

字符串截取

1
2
test_str="hello word"
echo ${test_str:0:5}

输出 hello

只读变量

1
2
3
url="http://www.hello.com"
readonly url
echo $url

删除变量

1
unset variable_name

数组

定义数组

第一种方式

1
2
3
4
5
6
7
array_name=(
value0
value1
value2
value3
)
echo ${array_name[0]}

输出结果 value0

第二种方式

1
2
3
4
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
echo ${array_name[1]}

输出结果 value1

输出数组所有元素

1
2
3
4
5
6
7
array_name=(
value0
value1
value2
value3
)
echo ${array_name[@]}

输出结果 value0 value1 value2 value3

数组长度

1
2
3
4
5
6
7
8
array_name=(
value0
value1
value2
value3
)
# 等价 echo ${#array_name[@]}
echo ${#array_name[*]}

输出 4


传递参数

脚本内获取参数的格式为:$n

n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

其中$0表示为执行文件的名字