基本shell脚本

基本

在文件的第一行指定要使用的shell,格式为:

1
#!/bin/zsh

通常#后跟的内容都是注释,但是第一行是一个例外

编辑完毕之后需要将脚本所在目录加入环境变量中,并且需要修改脚本的文件权限使得他可以被执行,例如:

1
chmod u+x test1

使用echo命令来进行输出,echo命令后面的字符串并不需要用引号括起来,当然,字符串包含句子的时候例外:

1
echo yts1999 used to love heheda

注意,每一个输出都会占一行(可以使用-n参数来将输出放在同一行)

调用其他环境变量:

1
echo sfsUID: $UID

变量

shell脚本还允许在脚本中定义和使用自己的变量。定义变量允许临时存储数据并在整个脚本中使用,从而使shell脚本看起来更像一个真正的计算机程序。 用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。

使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格 . 与系统变量类似,用户变量可通过美元符引用。

1
2
3
4
5
6
7
#!/bin/zsh
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"

变量每次被引用时,都会输出当前赋给它的值。重要的是要记住,引用一个变量值时需要使用美元符,而对变量本身进行赋值时则不要使用美元符,但是将变量赋值给别的变量的时候同样需要美元符。例如:

1
2
3
4
5
6
7
$ cat test4
#!/bin/bash
# assigning a variable value to another variable
value1=10
value2=$value1
echo The resulting value is $value2
$

在赋值语句中使用value1变量的值时,仍然必须用美元符。这段代码产生如下输出。

1
2
3
chmod u+x test4
./test4
The resulting value is 10

要是忘了用美元符,使得value2的赋值行变成了这样: value2=value1
那你会得到如下输出:

1
2
./test4
The resulting value is value1

没有美元符,shell会将变量名解释成普通的文本字符串,通常这并不是你想要的结果。

命令替换

命令替换可以从命令输出中提取信息,并将其赋给变量。

两种替换的方法:

1
2
testing='date'
testing=$(date)

两种方法均把date的输出赋值给了testing这个变量。

重定向输入和输出

最基本的重定向将命令的输出发送到一个文件中。shell用大于号(>)来完成这项功能:

1
command > outputfile

重定向操作符创建了一个文件(通过默认的umask设置),并将date命令的输出重定向到该文件中。如果输出文件已经存在了,重定向操作符会用新的文件数据覆盖已有文件。

如果不想覆盖已存在文件的内容,可以用双大于号(>>)来追加数据。

输入重定向符号是小于号(<):

1
command < inputfile

还有另外一种输入重定向的方法,称为内联输入重定向(inline input redirection)。这种方法无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据就可以了。

内联输入重定向符号是远小于号(<<)。除了这个符号,必须指定一个文本标记来划分输 入数据的开始和结尾。任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致。 例如:

1
2
3
4
5
wc << EOF
> test string 1
> test string 2
> test string 3
> EOF

管道

管道被放在命令之间,将一个命令的输出重定向到另一个命令中:

1
command1 | command2

Linux系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据 传输不会用到任何中间文件或缓冲区。

可以在一条命令中使用任意多条管道。可以持续地将命令的输出通过管道传给其他命令来细化操作。 例如:

1
ll | sort | more