shell 程序设计 | shell 基础

shell 属于一门解释性语言。

# 变量

Shell 脚本语言与其他编程语言的一个重要区别是:变量赋值与等号之间不能有空格间隙。这样子设计是有原因的,因为 shell 不仅是编程语言,更重要的还是行解释器。如果使用 VAR = value,它就可能被解释为运行一个名为 “VAR” 的命令,并带有两个参数 =value。因此这不可能成功运行。

Shell 脚本使用 $VAR 来引用已被定义过的变量。

变量的作用域

局部变量

当我们运行一个脚本文件时,Linux 会为该脚本创建一个新的进程,并为其分配唯一的 PID。我们只能在当前进程中使用在此文件中定义的变量。一旦进程结束或切换到另一个进程,就不能再使用这些变量。

全局变量

然而,就像 Windows 中的“环境变量”概念一样,Linux 也有全局作用域的变量,可以通过 source 命令或 .命令来加载脚本文件。这就是为什么像 .bashrc.vimrc 这样的配置文件能够生效(每次打开 bash 时会运行 source .bashrc,每次打开 vim 时会运行 source .vimrc)。

优先级

假设出现这样了一种情况,局部定义的变量与全局变量同名,那么此时局部变量将具有优先权。如果局部变量不存在或未定义,则使用全局变量。如果两者都不存在,则返回空值。

语句

if语句

1
2
3
4
5
6
if [ 布尔表达式 ]
then
若干语句
else
若干语句
fi

case 语句

1
2
3
4
case 变量 in
模式1 ) 若干语句;;
模式2 ) 若干语句;;
esac

循环语句

循环语句有多种写法

1
2
3
4
for i in {1..10}
do
若干语句
done

特殊符号

$$$$ 表示运行脚本的进程号(PID)

使用花括号 {} 包裹变量,即使变量后紧跟字符也可以,无需空格。例如:

1
2
3
4
5
6
#!/bin/sh
echo "What is your name?"
read USER_NAME
echo "Hello $USER_NAME"
echo "I will create you a file called ${USER_NAME}_file"
touch "${USER_NAME}_file"

还有一个优点是,如果我们输入两个分隔的单词,花括号可以防止 touch 创建两个新文件。

注释

Shell 使用 # 来注释整行内容。

运行脚本

将脚本写入可读且可执行的文件中。第一行可以指示来运行它的程序(如 /bin/sh)。如果你使用的是 GNU/Linux,/bin/sh 通常是一个指向 Bash 的符号链接。

1
#!/bin/sh

函数

内置命令

echo: 接受一个或多个由空白字符(空格或制表符)分隔的参数。

expr: 将表达式的值打印到标准输出。它支持逻辑表达式。它还可以作为 Shell 中的简单整数计算器。但请注意,星号 * 被视为通配符。因此,当你进行乘法运算时,应该使用 \*

read: 从标准输入读取一行并存储到提供的变量中。

touch: 通过名称创建一个空文件。

test: 可以用来检测某些文件或者是相关的属性,和判断符号 [] 等价
test -n 字符串: 字符串长度不为零则为真

查看学习更多的Linux命令使用,跳转这篇文章

数据结构与算法笔记 | 数学 Python 基础 | 系列数据结构的拆封

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×