码迷,mamicode.com
首页 > 系统相关 > 详细

Shell脚本入门

时间:2015-09-24 09:32:42      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

编写第一个shell脚本

如同其他语言一样,通过我们使用任意一种文字编辑器,比如 nedit、kedit、emacs
、vi 等来编写我们的 shell 程序。程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使
用/bin/sh 来执行程序。
当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
要使脚本可执行:
chmod +x filename
然后,您可以通过输入: ./filename 来执行您的脚本。

Shell变量

在其他编程语言中您必须使用变量。在 shell 编程中,所有的变量都由字符串组成,
并且您不需要对变量进行声明。
>>本地变量
设置变量
引用变量
清除变量
查看变量

>>环境变量
设置环境变量:
• 引用环境变量 :
• 常用环境变量
– HOME
– PATH
– TERM
– UID
– PWD
– PS1

>>特殊的预定义变量
$#:存储shell程序中命令行参数的个数
$?:存储shell中上一个程序执行的返回值(0表 示命
令执行成 功,非0有问题)
$0:存储shell程序自己的名称
$[1-n]:存储第[1-n]个命令行参数
$*:存储shell脚本的所有参数(不包含$0)
$$:存储shell脚本的进程号(pid)
$!:存储上一个后台执行命令的进程号(pid)

通过一个简单的test.sh脚本来学习:

#!/bin/sh 
echo "number:$#" 
echo "scname:$0" 
echo "first :$1" 
echo "second:$2" 
echo "argume:$@" 

执行脚本:

# ./test.sh aa bb 
number:2
scname:./test02.sh
first :aa
second:bb
argume:aa bb

  

通过显示结果可以看到:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1是传递给该shell脚本的第一个参数
$2是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表


常用命令语法

echo "some text": 将文字内容打印在屏幕上
ls: 文件列表
wc -l filewc -w filewc -c file&: 计算文件行数计算文件中的单词数计算文件中
的字符数
cp sourcefile destfile&: 文件拷贝
mv oldname newname : 重命名文件或移动文件
rm file&: 删除文件
grep ‘pattern‘ file&: 在文件内搜索字符串比如:grep ‘searchstring‘
file.txt
cut -b colnum file&: 指定欲显示的文件内容范围,并将它们输出到标准输出设备
比如:输出每行第 5 个到第 9 个字符 cut -b5-9 file.txt 千万不要和 cat 命令混淆,这是两
个完全不同的命令
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
file somefile&: 得到文件类型
read var: 提示用户输入,并将输入赋值给变量
sort file.txt: 对 file.txt 文件中的行进行排序
uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
expr: 进行数学运算 Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比如:根据文件名搜索 find . -name filename -print
tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
basename file&: 返回不包含路径的文件名比如: basename /bin/tux 将返回 tux
dirname file&: 返回文件所在路径比如:dirname /bin/tux 将返回 /bin
head file&: 打印文本文件开头几行
tail file : 打印文本文件末尾几行
sed: Sed 是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本
,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不
要和 shell 中的通配符相混淆。比如:将 linuxfocus 替换为 LinuxFocus :cat
text.file | sed ‘s/linuxfocus/LinuxFocus/‘ > newtext.file

流程控制和判断

"if" 表达式 如果条件为真则执行 then 后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi

大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断
文件是否存在及是否可读等等...
通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls 是否存在并有可执行权限
[ -n "$var" ] :判断$var 变量是否有值
[ "$a" = "$b" ] :判断$a 和$b 是否相等

 

函数

一个函数是这个样子的

functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}

 

典型的编程步骤

任何优秀的脚本都应该具有帮助和输入参数。


如何调试

最简单的调试命令当然是使用 echo 命令。
可以使用 echo 在任何怀疑出错的地方打印任何变量值。
shell 也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这
样来进行调试:
sh -x strangescript
这将执行该脚本并显示所有变量的值。
shell 还有一个不需要执行脚本只是检查语法的模式。可以这样使用:
sh -n your_script
这将返回所有语法错误。

附:

shell中条件判断if中的-z到-d的意义
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

 

Shell脚本入门

标签:

原文地址:http://www.cnblogs.com/binyue/p/4823050.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!