linux--shell
- 1 简介
- 2 示例与运行
- 2.1 示例
- 2.2 运行
- 3 变量
- 3.1 普通变量
- 3.1.1 语法
- 3.1.2 注意事项
- 3.1.3 命名规则
- 3.1.4 用语句赋值
- 3.1.5 使用变量
- 3.1.6 只读变量
- 3.1.7 删除变量
- 3.1.8 变量类型
- 3.2 字符串
- 3.2.1 单引号
- 3.2.2 双引号
- 3.2.3 拼接字符串
- 3.2.4 获取字符串长度
- 3.2.5 提取子字符串
- 3.2.6 查找子字符串
- 3.3 数组
- 3.3.1 定义数组
- 3.3.2 读取数组
- 3.3.3 获取数组的长度
- 3.4 注释
- 3.4.1 单行注释
- 3.4.2 多行注释
- 4 传递参数
- 5 运算符
- 6 命令
- 6.1 echo
- 6.2 printf
- 6.3 test
- 7 流程控制
- 8 函数
- 9 输入输出重定向
- 10 文件包含
- 参考
1 简介
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
…
Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
2 示例与运行
2.1 示例
#!/bin/bash
echo "Hello World !"
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
2.2 运行
- 方法一:作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到该脚本,要用 ./test.sh 告诉系统,在当前目录找。
- 方法二:作为解释器参数
/bin/sh test.sh
3 变量
3.1 普通变量
3.1.1 语法
my_name="worthsen"
3.1.2 注意事项
- 注意定义变量时,变量名不加美元符号($,PHP语言中变量需要)。
- 变量名和等号之间不能有空格
3.1.3 命名规则
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
3.1.4 用语句赋值
如将 /etc 下目录的文件名循环出来。
for file in `ls /etc`
或
for file in $(ls /etc)
3.1.5 使用变量
使用一个定义过的变量,只要在变量名前面加美元符号 $ 即可,如:
my_name="worthsen"
echo $my_name
echo ${my_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,如下:
若写成 $skilllanguage,则变量为skilllanguage,就不能正确实现自己所写的逻辑。
for skill in C C++ C#; do
echo "I am good at ${skill}language"
done
3.1.6 只读变量
使用 readonly 命令可以将变量定义为只读变量
#!/bin/bash
readonly my_name="worthsen"
echo $my_name
3.1.7 删除变量
使用 unset 命令可以删除变量
unset my_name
- 变量被删除后不能再次使用。
- unset 命令不能删除只读变量。
#!/bin/sh
my_name="worthsen"
echo $my_name
unset my_name
3.1.8 变量类型
- 局部变量
仅在当前shell实例中有效 - 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 - shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
3.2 字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
3.2.1 单引号
str='this is a string'
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
3.2.2 双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
#!/bin/sh
my_name='worthsen'
echo $my_name
str='$my_name'
echo $str
str="$my_name"
echo $str
my_name='\"worthsen\"'
echo $my_name
my_name="\"worthsen\""
echo $my_name
运行结果
worthsen
$my_name
worthsen
\"worthsen\"
"worthsen"
3.2.3 拼接字符串
#!/bin/sh
my_name='worthsen'
# 使用双引号拼接
str0="hello, "$my_name" !"
str1="hello, ${my_name} !"
echo $str0 $str1
# 使用单引号拼接
str2='hello, '$my_name' !'
str3='hello, ${my_name} !'
echo $str2 $str3
运行结果
hello, worthsen ! hello, worthsen !
hello, worthsen ! hello, ${my_name} !
3.2.4 获取字符串长度
#!/bin/sh
my_name='worthsen'
echo ${#my_name}
结果为 8
3.2.5 提取子字符串
第一个字符的索引值为 0。
#!/bin/sh
my_name='worthsen'
echo ${my_name:5:7}
结果为 sen
3.2.6 查找子字符串
查找字符 s 或 o 的位置(哪个字母先出现就计算哪个):
注:以下脚本中` 是反引号,而不是单引号 ’
#!/bin/sh
my_name='worthsen'
echo `expr index "$my_name" so`
结果为 2
3.3 数组
- bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
- 类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
3.3.1 定义数组
Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。一般形式如下
数组名=(值1 值2 ... 值n)
array=(v0 v1 v2)
或者
array=(
v0
v1
v2
)
或者
array[0]=v0
array[1]=v1
array[n]=vn
可以不使用连续的下标,而且下标的范围没有限制。
3.3.2 读取数组
#!/bin/sh
array=(v0 v1 v2)
# 读取数组元素 ${数组名[下标]}
echo ${array[0]}
echo ......
# 读取整个数组 ${数组名[@]}
echo ${array[@]}
运行结果
v0
......
v0 v1 v2
3.3.3 获取数组的长度
#!/bin/sh
array=(v0 v1 v2)
# 获取数组长度 ${#数组名[@]}
echo ${#array[@]}
# 获取数组长度 ${#数组名[*]}
echo ${#array[*]}
# 获取单个元素长度 ${#数组名[下标]}
echo ${#array[1]}
运行结果
3
3
2
3.4 注释
3.4.1 单行注释
以 # 开头的行就是注释,会被解释器忽略。
#!/bin/bash -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
#added by worthsen
echo "worthsen"
#end
exit 0
3.4.2 多行注释
#!/bin/bash
:<<EOF
just
for
fun
EOF
echo "worthsen"
:<<!
just
for
fun
!
echo "worthsen"
:<<w
just
for
fun
w
echo "worthsen"
4 传递参数
5 运算符
6 命令
6.1 echo
6.2 printf
6.3 test
7 流程控制
8 函数
9 输入输出重定向
10 文件包含
参考
1、runoob-Shell 教程
2、Linux之Shell语法详解
3、Shell——你只需要了解这么多