How to write a script in Linux

 

1. 开头

#!/bin/sh

2. 注释

以#开头

3. 变量

a="text"
echo "this is ${a}file"
特殊变量:

$0 $1 $2 ...
位置参数,从命令行传递给脚本,或者是传递给函数.或者赋值给一个变量.$0表示当前执行的进程名,script 本身的名字,或者在正则表达式中表示整行输出.
$#
命令行或者是位置参数的个数. $*包含了所有输入命令行的参数值
$?
命令,函数或者脚本本身的退出状态,0为正确执行,1为执行失败
$$
当前脚本自身的进程ID
$#
命令行或者是位置参数的个数

4. 常用命令

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

awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。

cat file.txt | awk -F, '{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, Miller, 22, USA命令输出结果为:Adam Bor, Miller, USA

5. 管道,重定向,backtick

管道 (|) 将一个命令的输出作为另外一个命令的输入 例如:grep "hello" file.txt | wc -l 搜索含hello的行并计算其行数
重定向将结果输出到文件
反短斜线讲一个命令的输出作为另外一个命令行的参数

#!/bin/sh
# The ticks are backticks () not normal quotes ('): tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`

6. 流程控制

1)if

if ....; then
  ....
elif ....; then
  ....
else
  ....
fi
通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

2)case 匹配一个给定的字符串

case ... in ...)
do something here
;;
esac

3)selected

select var in ... ; do  
break
done
.... now $var can be used ....

4)loop

while-loop:

while ...; do
....
done

for-loop:

for var in ....; do
  ....
done

7. 条件测试

7.1 文件状态测试

-b filename : 当filename 存在并且是块文件时返回真(返回0)
-c filename : 当filename 存在并且是字符文件时返回真
-d pathname : 当pathname 存在并且是一个目录时返回真
-e pathname : 当由pathname 指定的文件或目录存在时返回真
-f filename : 当filename 存在并且是正规文件时返回真
-g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename : 当filename 存在并且是命名管道时返回真
-r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真
-s filename : 当filename 存在并且文件大小大于0 时返回真
-S filename : 当filename 存在并且是socket 时返回真
-t fd : 当fd 是与终端设备相关联的文件描述符时返回真
-u pathname : 当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真
-w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
-x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
-O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
-G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
file1 -nt file2 : file1 比file2 新时返回真
file1 -ot file2 : file1 比file2 旧时返回真

7.2 字符串测试

-z string : 字符串string 为空串(长度为0)时返回真
-n string : 字符串string 为非空串时返回真
str1 = str2 : 字符串str1 和字符串str2 相等时返回真
str1 != str2 : 字符串str1 和字符串str2 不相等时返回真
str1 < str2 : 按字典顺序排序,字符串str1 在字符串str2 之前
str1 > str2 : 按字典顺序排序,字符串str1 在字符串str2 之后

7.3 数值测试

int1 -eq int2 : 如果int1 等于int2,则返回真
int1 -ne int2 : 如果int1 不等于int2,则返回真
int1 -lt int2 : 如果int1 小于int2,则返回真
int1 -le int2 : 如果int1 小于等于int2,则返回真
int1 -gt int2 : 如果int1 大于int2,则返回真
int1 -ge int2 : 如果int1 大于等于int2,则返回真

7.4 逻辑操作符

-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。

8. 引号

引号可防止通配符扩展

echo $SHELL -> /bin/bash
echo "$SHELL" -> /bin/bash
echo ‘#SHELL’ -> $SHELL

9. 函数

functionname() {

# inside the body $1 is the first argument given to the function
# $2 the second ...
body

}

函数返回:

9.1 return
return返回单一的数字参数(0~255),在之后的代码中可用$?得到最近的return value
9.2 返回任意参数
由于return只能返回数字参数,所以需要返回任意参数时,可用以下方法:

a)最简单的方法,使用全局变量
b)将返回值写到子程序的标准输出来达到返回值的目的,例如:

function myfunc()
{
echo "some value"
}
result=$(myfunc) # or result=`myfunc`
echo $result
结果输出:some value

c)通过引用返回函数值

function myfunc()
{
local __resultvar=$1
local myresult='some value'
eval $__resultvar="'$myresult'"
}
myfunc result
echo $result
结果输出:some value

20. 单引号和双引号

双引号可以保持变量的内容,而单引号中仅仅是一般字符,如:
变量name=ABC
echo "$name"的结果是ABC
echo '$name'的结果是$name

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值