linux--shell

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——你只需要了解这么多

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页