shell脚本编程入门
Linux的Shell种类众多,这里我们关注的重点是Bash。
基本语法
- 环境变量
$PATH
- IO重定向:
- 以
<
改变标准输入
- 如:
tr -d '\r' < dos-file.txt
- 如:
- 以
>
改变标准输出
- 如:
tr -d '\r' < dos-file.txt > UNIX-file.txt
(如果>
的目的文件不存在,将自动创建,若存在,将覆盖原文件)
- 如:
- 以
>>
附加到文件(文件末尾追加)
- 若文件不存在,则自动创建,若存在,则在文件末尾追加
- 以
|
建立管道
- 前一个program的输出作为后一个program的输入(
program1 | program2
),如:ls | grep a
- 前一个program的输出作为后一个program的输入(
- 以
-
特殊文件:
/dev/null
和/dev/tty
常用命令:
- who:查询系统的登陆用户
- cat > 文件名 :将后面的输入信息重定向到文件中,以 ^D 结束
- tr:转换字符
-d
:删除source-char-list所列举的字符,如:tr -d '\r' < dos-file.txt | sort > UNIX-file.txt
,将dos-file.txt中的回车符全部删掉,再排好序重定向到UNIX-file.txt文件中
- sh (执行一个脚本)
-x
显示脚本中的每个命令,以+
开头,可以在脚本中打开追踪功能,set -x
,用set +x
关闭追踪
- grep
- sed
- cut
- awk
- sort
- uniq :(去重)
- head -n n 查看前n行
-
tail -n n 查看后n行
-
umask
命令使用注意事项
- 以
-
开头表示选项,以--
开头表示长选项 - 多条命令写在一行,以
;
分隔
脚本的语法说明:
- 以
#! 脚本解释器路径
开头,如:#! /bin/sh
- 变量
- 命名:字母或下划线开头,后面可以是字母数字,下划线
- 赋值:变量名=值(注意等号前后不能有任何空格,变量值之间有空格时,需要用引号括起来),单行多次赋值,之间用空格分隔
- 使用变量:以
$变量名
- 输出:
echo
- echo 参数(参数以空格分隔)
printf
- 不会自动换行,需要换行,需在末尾加上
\n
- 例句:
printf "the first program always print %s,%s" hello world
(\d
表示十进制整数)
- 不会自动换行,需要换行,需在末尾加上
- 再shell脚本中访问shell脚本的参数
- 读取第
n
个参数,通过$n
读取,若n
的数值大于9,则需用大括号括起来,如${10}
,读取第10个参数
- 读取第
利用vi等文本编辑器编写Shell脚本的格式是固定的,如下:
1 #!/bin/sh
2 #comments
3 Your commands go here
首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。文件名后缀sh表明这是一个Bash脚本文件。
执行脚本的时候,要先将脚本文件的属性改为可执行的,然后再执行:
#将属性改为可执行
chmod
+x filename.sh
#执行shell文件
.
/filename
.sh
简单的hello world例子(test.sh):
注:“=”号左右无空格
相关的变量命令
env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。
实例:
#!/bin/sh
#exist test.sh?
if ls -l test.sh; then
./test.sh
if [ "$1" = "me" ]; then
printf "I like you\n"
printf "You are the best!\n"
else
echo "You are ugly"
fi
else
echo "return false"
fi
输出结果:
不断更新中。。。。