现在的位置: 首页 > 综合 > 正文

shell编程之基础

2013年02月17日 ⁄ 综合 ⁄ 共 2345字 ⁄ 字号 评论关闭
# 开头,必须的
#!/bin/sh
# Comment ... 行注释

# 为脚本文件增加可执行权限
# chmod +x test.sh

# 定义变量
var1="hello" # 注意“=”两边不能有空格
var1=hello
var1=hello world # 错误!
var1="hello world"
var1='hello world' # 最好使用'  ',它会禁用变量扩展
var1="hello world!" # !会被扩展为历史命令!!!

# 引用变量
echo $var1   # hello
echo ${var1} # 最好使用{}
echo $var1world # 输出空行,var1world没有赋值!
echo ${var1}world # helloworld
echo "var1 is $var1"

# 常用命令语法及功能

echo "some text" # 将文字内容打印在屏幕上
ls  # 文件列表

# 计算文件行数, 单词数, 字符数
wc –l filename
wc -w filename
wc -c filename 

cp srcfile destfile # 文件拷贝
mv oldname newname # 重命名文件或移动文件
rm filename # 删除文件

# 在文件内搜索字符串
grep 'pattern' filename
grep 'searchstring' file.txt

# 指定欲显示的文件内容范围,并将它们输出到标准输出设备
cut -b colnum file
# 输出每行的第5个到第9个字符
cut -b5-9 file.txt

cat file.txt # 输出文件内容到标准输出设备(屏幕)上

file somefile # 得到文件类型

read var # 提示用户输入,并将输入赋值给变量

sort file.txt # 对file.txt文件中的行进行排序
uniq # 删除文本文件中出现的相同行 
sort file.txt | uniq

expr: # 进行数学运算

find # 搜索文件
# 根据文件名搜索
find . -name filename -print

basename filename # 返回不包含路径的文件名
basename /bin/tux # 将返回 tux
dirname filename # 返回文件所在路径
dirname /bin/tux # 返回 /bin

head filename # 打印文本文件开头几行
tail filename # 打印文本文件末尾几行

# sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)
# 读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达
# 式(见参考)进行搜索。不要和shell中的通配符相混淆。
# 将good替换为bad :g表示全局替换
cat file.txt | sed 's/good/bad/g' > file1.txt

# awk用来从文本文件中提取字段。缺省地,字段分割符是空格,
# 可以使用-F指定其他分割符。
cat file.txt | awk -F, '{print $1 "\t" $3 }'

重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
> 写入文件并覆盖旧文件
>> 加到文件的尾部,保留旧文件内容。

命令替换
反短斜线
使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。

查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件
find . -mtime -1 -type f -print

将所有查找到的文件打一个包:
# The ticks are backticks (`) not normal quotes ('):
tar zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`

$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
$ echo $MYDIR
/usr/local/share/doc/foo

$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
$ echo $MYDIR
/usr/local/share/doc/foo

MYFILES=$(ls /etc | grep pa)

截断字符串
"#" 从字符串的开始处除去字符
"%" 从字符串的末尾处除去字符

$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
chickensoup
$ echo ${MYFOO%.*}
chickensoup.tar

用冒号分开来指定起始字符和子字符串长度
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:4}
abun

判断文件类型
"${filename##.}" = "gz"

"${filename##.}" = "txt"


命令行参数

#!/bin/sh
echo name of script is $0
echo first argument is $1
echo second argument is $2
echo seventeenth argument is $17
echo number of arguments is $#

"$0" 将扩展成从命令行调用的脚本名称,"$#" 将扩展成传递给脚本的自变量数目。
有时需要一次引用 所有 命令行自变量。针对这种用途,bash 实现了变量 "$@",它扩展成所有用空格分开的命令行参数。

$ ./test.sh hello world 123
name of script is ./test.sh
first argument is hello
second argument is world
seventeenth argument is hello7 #自动扩展
number of arguments is 3
hello world 123

抱歉!评论已关闭.